Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🛡️ Deadlock Team Bot

Бот для организации сборов игроков в 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, работает только в выбранном чате.

🐳 Инструкция по установке (Docker)

Запуск бота в контейнере гарантирует сохранность статистики и стабильную работу 24/7.

1. Подготовка

Создайте папку проекта и поместите туда файлы бота (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)

2. Файлы настройки

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.

3. Запуск

Выполните команду в терминале:

docker compose up -d --build

🔄 Обновление

bot.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)

Админская команда /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 (/link)

Игрок привязывает свой профиль, и его статы 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)

/cleanup (только админам) удаляет сообщения, которые бот отправил за последние сутки. Telegram не отдает боту список его сообщений, поэтому бот ведет журнал message_id сам — в отдельном файле bot_messages.jsonDATA_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 (или чужой, если ответить на сообщение).

Разработано для эффективных сборов! ⚔️

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Contributors

Languages