Бот для организации сборов игроков в Deadlock. Помогает собирать пати и вести честную статистику игроков.
- Управление командой: Легкое добавление (
/addme) и удаление (/removeme) себя из основного состава. - Умный сбор (
/tag): Бот тегает только тех, кто еще не ответил на текущий сбор. Имеет встроенную защиту от спама (Cooldown). - Автосбор (
/set autotag ЧЧ:ММ): Раз в сутки в заданное время бот сам тегает состав — без напоминаний руками. - Настройки для админов (
/set): Автосбор и правка состава (/set team add/remove @ник) прямо из чата. - Топ-статистика: Автоматический учет сборов, топ-3 тегавших и топ-3 напулявших (
/stats), личная карточка (/me) и вечный топ гейчиков (/gaystats). - Статистика Deadlock (
/link): Игрок привязывает Steam-профиль, и в/meподтягиваются его ранг, винрейт, KDA и любимый герой с tracklock.gg (через открытый API deadlock-api.com). - Автоматизация: Ежедневная очистка списков сбора в 03:00 ночи, а если ждать до ночи не хочется —
/clear. - Уборка чата (
/cleanup): Админ одной командой удаляет сообщения бота за последние сутки. - Изоляция чатов: У каждого чата свой состав, свой кулдаун, свой сбор и своя статистика — бота можно добавить в несколько групп.
- Пасхалки: Личный счетчик «напулов» заводится автоматически на каждого, кто зовет
/tag, не будучи в составе. Привязка кuser_id, работает только в выбранном чате.
Запуск бота в контейнере гарантирует сохранность статистики и стабильную работу 24/7.
Создайте папку проекта и поместите туда файлы бота (bot.py, requirements.txt).
Создайте файл .env и укажите в нем ваш токен:
BOT_TOKEN=ваш_токен_от_botfather
EGG_CHAT_ID=-1179357258 # чат, где работают пасхалки; по умолчанию 1179357258
ADMIN_ID=174100936 # кто управляет пасхалками
TZ=Europe/Kyiv # по нему бот сбрасывает списки сбора в 03:00| Переменная | Обязательна | Описание |
|---|---|---|
BOT_TOKEN |
да | Токен от @BotFather. Без него бот не стартует |
EGG_CHAT_ID |
нет | Чат с пасхалками, см. раздел ниже |
ADMIN_ID |
нет | user_id тех, кому доступны /clear и /set. Несколько — через запятую или пробел. Если не задать, право получают все админы чата |
STEAM_API_KEY |
нет | Ключ Steam Web API. Нужен только чтобы /link понимал ссылки вида /id/имя; числовые ссылки работают и без него |
TZ |
нет | Часовой пояс контейнера. Без него время внутри — UTC, и ночной сброс уедет |
DATA_DIR |
нет | Куда класть state.json. В Docker задан в compose (/app/data) |
Dockerfile и docker-compose.yaml уже лежат в репозитории. Код живет в /app, данные — в /app/data:
volumes:
- ./data:/app/data # данные переживают пересборку
- ./bot.py:/app/bot.py:ro # код поверх образа — обновляется без --build
⚠️ Монтировать том прямо в/appнельзя — он перекроет весь код из образа. Поэтому подключаем подпапкуdataи отдельный файлbot.py.
Путь к данным задается переменной DATA_DIR (по умолчанию — текущая папка, в контейнере — /app/data), так что бота можно запускать и без Docker: python bot.py.
Выполните команду в терминале:
docker compose up -d --buildbot.py примонтирован в контейнер, поэтому обновить код можно без пересборки:
git pull
docker compose restart # или кнопка Restart в DockgeПересборка (docker compose up -d --build) нужна только когда меняется requirements.txt или Dockerfile.
В Dockge код собирается из папки стека (обычно
/opt/stacks/<имя>). Делайgit pullименно там, иначе контейнер подхватит старыйbot.py. Проверить путь:docker inspect deadlock_bot -f '{{index .Config.Labels "com.docker.compose.project.working_dir"}}'.
Всё состояние хранится в одном файле state.json внутри DATA_DIR, разбитое по chat_id. Запись атомарная (через временный файл + os.replace), правки идут под общей блокировкой — параллельные нажатия кнопок не затирают друг друга.
Рядом лежит bot_messages.json — журнал message_id для /cleanup. Он пишется часто, поэтому вынесен из state.json и сбрасывается фоново (раз в минуту при изменениях).
Старый формат (stats.json, team.json, user_statistics.json) переносится автоматически при первом запуске: так как chat_id в нем не сохранялся, данные достаются первому чату, который обратится к боту после обновления. Старые файлы не удаляются — можно оставить как бэкап.
Пасхалка — это личный счетчик: когда человек не входящий в состав зовет /tag, бот вместо «403» отвечает «Имя напулял (уже N раз)».
Счетчик заводится сам при первом таком /tag — отдельный на каждого не-игрока, без всякой настройки. Имя берется из профиля (first_name, иначе @username, иначе id<номер>). Топ-3 напулявших показывается в /stats.
Привязка идет к числовому user_id, а не к @username, — ник можно сменить, id остается прежним. Поэтому пасхалка достается и тем, у кого username вообще не выставлен. Работают пасхалки только в одном чате, он задается переменной EGG_CHAT_ID (по умолчанию 1179357258); в остальных чатах /tag от постороннего по-прежнему получает «403».
Id чата можно писать в любом виде — 1179357258, -1179357258 или -1001179357258: бот сравнивает без знака и без служебного префикса -100, которым Telegram помечает супергруппы.
Счетчики прежних захардкоженных пасхалок (Славик и Тексер) не теряются: как только кто-то с таким же именем (по профилю) впервые зовет /tag, накопленное число переезжает на его личную пасхалку. Пока этого не произошло, старые счетчики видны в /stats.
Админская команда /set меняет настройки чата. Доступ — как у /clear: при заданном ADMIN_ID только эти user_id, иначе любой админ чата.
/set autotag 20:00 — включить ежедневный автосбор на 20:00
/set autotag disable — выключить автосбор
/set autotag — показать текущее состояние
/set team add @ник — добавить игрока в состав
/set team remove @ник — убрать игрока из состава
/set cooldown 30 — кулдаун /tag в секундах (0 — выключить)
/set reset_time 04:00 — во сколько чистить список сбора
Автосбор раз в сутки в указанное время делает то же, что /tag: тегает игроков, которые еще не отметили «+» в текущем сборе, и постит кнопки. Если состав пуст или все уже отметились — бот молчит.
Все времена (autotag, reset_time) — по часовому поясу контейнера (TZ). Ночная очистка списка сбора по умолчанию в 03:00, но /set reset_time меняет это для конкретного чата. Все настройки в /set — свои у каждого чата. Аргумент без значения (напр. просто /set cooldown) показывает текущее.
Игрок привязывает свой профиль, и его статы Deadlock появляются в /me. Данные берутся из открытого API deadlock-api.com — того же источника, что и у tracklock.gg.
/link https://steamcommunity.com/profiles/7656... — числовая ссылка Steam
/link https://steamcommunity.com/id/твой_ник — ник-ссылка (нужен STEAM_API_KEY)
/link https://tracklock.gg/players/12345678 — ссылка tracklock
/link remove — отвязать
В /me подтянутся Steam-ник, ранг (напр. «Eternus 6»), винрейт и KDA за последние игры, любимый герой и число матчей за 30 дней. Если профиль приватный или Steam-статистика в игре отключена — бот честно скажет, что данных нет. Тяжелый запрос истории матчей кэшируется на 15 минут, так что повторные /me быстрые.
Ранг привязавшихся показывается и прямо в списке сбора — напротив ника в скобках («alice (Eternus 6)»). Ранги кэшируются на час, так что нажатия кнопок не дергают API лишний раз.
Привязка хранится по user_id в рамках чата. Ссылки вида /id/имя требуют STEAM_API_KEY (см. таблицу переменных); числовые /profiles/... и tracklock-ссылки работают всегда.
/cleanup (только админам) удаляет сообщения, которые бот отправил за последние сутки. Telegram не отдает боту список его сообщений, поэтому бот ведет журнал message_id сам — в отдельном файле bot_messages.json (в DATA_DIR), сбрасывая его на диск фоново, а не на каждое сообщение. Журнал переживает перезапуск. Единственное ограничение — от самого Telegram: удалять можно только сообщения младше 48 часов. Чужие сообщения команда не трогает.
- /addme — Добавиться в список игроков.
- /removeme — Удалиться из списка.
- /team — Посмотреть текущий состав команды.
- /tag — Начать сбор (тегнуть всех, кто еще не отметил "+" в текущем сборе).
- /me — Личная карточка: состав, теги, напулы, гейство и статы Deadlock.
- /link — Привязать/отвязать Steam-профиль для статистики Deadlock.
- /set — Настройки чата (админы):
autotag,team add/remove,cooldown,reset_time. - /clear — Очистить список плюсов и минусов, не дожидаясь ночи (админы).
- /cleanup — Удалить сообщения бота за последние сутки (админы).
- /stats — Общая статистика, топ-3 напулявших и топ-3 тегавших.
- /gaystats — Топ нажавших «Я ГЕЙ» за все время.
- /whoami — Показать свой user_id и chat_id (или чужой, если ответить на сообщение).