Самостоятельный Discord-бот для игровых сборов Deadlock и гильдии WoW Retail. Интерфейс бота — на английском языке.
- Сборы игроков: приглашения через
/tag, кнопки участия и отказа, автоматические сборы по расписанию, сброс голосов и статистика. Состав берётся из текущих участников настроенной Discord-роли, без ботов. - Роли по реакциям: выдача и снятие ролей через панели
/reactionrole. Поддерживаются обычные и серверные эмодзи; роли с серверными разрешениями, управляемые роли и@everyoneзапрещены. - WoW-дашборд: прогресс активных рейдов текущего сезона в формате
The Venomous Abyss: 8/8H 2/8M(без Normal и рангов), топ-10 персонажей по экипированному ilvl и рейтингу Mythic+. Данные Raider.IO обновляются автоматически каждые 30 минут с учётом кэша; при сбое сохраняется последний результат. Всё размещается в одном компактном embed: рейды и два топа рядом, с названием сезона видаMidnight Season 2. В топ ilvl попадает только экипировка, обновлённая в текущем сезоне: старые снимки до сквиша, неизвестные и некорректные даты исключаются. - Группы Mythic+: ручной выбор подземелья, уровня и типа ключа —
push,relaxedилиcarry. Создатель и участники выбирают класс и специализацию в модальном окне; роль определяется автоматически. Состав — 1 танк, 1 лекарь и 3 DPS. Без привязки аккаунтов, рейтингов, ilvl и проверок опыта.
Настройки и данные разделены по Discord-серверам. Кнопки сборов и Mythic+
работают после перезапуска. Обычные ответы не пингуют роли и @everyone;
приглашения на сбор упоминают конкретных участников.
Нужны Docker с Compose и токен Discord-бота.
В Discord Developer Portal создайте приложение с ботом и включите Server Members Intent. Message Content Intent не нужен.
Пригласите бота со scopes bot и applications.commands. Выдайте права
View Channels, Send Messages, Read Message History, Embed Links,
Add Reactions и Manage Roles. Роль бота должна находиться выше выдаваемых
ролей. Права Administrator не требуются; дашборд можно закрепить вручную.
git clone https://github.com/scatari69/TuesdayNight.git
cd TuesdayNight
cp .env.example .envЗаполните .env:
| Переменная | Назначение |
|---|---|
DISCORD_TOKEN |
Обязательный токен бота |
DISCORD_GUILD_ID |
Необязательно: ID сервера для быстрой регистрации команд; без него команды глобальные |
TZ |
Часовой пояс расписания, по умолчанию Europe/Kyiv |
docker compose up -d --build
docker compose logs -fСостояние хранится в ./data/state.json, подключённом в контейнер как
/app/data, и переживает пересоздание контейнера. Сохраняйте резервную копию
./data; запускайте только один экземпляр бота на этот каталог.
Не публикуйте .env и пользовательские данные.
Обновление и остановка:
git pull
docker compose up -d --build
# Остановить бота:
docker compose downДля сборов участник с правом Manage Server задаёт роль и канал:
/setup role:@deadlock channel:#gatherings
/settings cooldown:60 reset_time:03:00 autotag:20:00
cooldown задаётся в секундах, время — в часовом поясе TZ.
autotag:disable отключает автосборы. Пропущенные во время отключения события
не воспроизводятся. Игроки используют /tag, /team, /me и /stats;
администраторы — /clear для закрытия сбора и /cleanup для удаления сообщений
бота за последние сутки в текущем канале. /cleanup удаляет и панели ролей,
поэтому размещайте их в отдельном канале.
Для ролей по реакциям участник с правом Manage Roles создаёт панель, затем использует ID сообщения из ответа:
/reactionrole panel channel:#roles text:Нажмите 🎮 для получения роли
/reactionrole add channel:#roles message_id:ID_СООБЩЕНИЯ emoji:🎮 role:@deadlock
Для переноса строки в text укажите \n, например Deadlock\nWoW Retail.
Список и удаление привязок — /reactionrole list и /reactionrole remove.
Снятие реакции снимает роль, даже если она была выдана вручную. Удаление самой
привязки оставляет выданные роли. Реакции, поставленные во время отключения бота,
автоматически не обрабатываются.
WoW-дашборд настраивается отдельно и не требует ключей API:
/dashboard setup region:eu realm:tarren-mill guild_name:Название channel:#guild-dashboard
Укажите свои регион, сервер и гильдию. /dashboard refresh запрашивает обновление
с учётом кэша, /dashboard status показывает состояние и последнюю ошибку.
/dashboard remove (Manage Server) останавливает обновление, отключает дашборд
и удаляет его сообщение. Если прав для удаления не хватает, сообщение нужно
удалить вручную; бот больше не будет его восстанавливать.
Данные Raider.IO могут быть неполными или запаздывать. Активные рейды определяются
по региональным датам начала и окончания в Raider.IO; завершённые и будущие рейды
исключаются. Сейчас поддерживается дополнение Midnight (ID 11).
Участник с правом Manage Server задаёт канал:
/mplus setup channel:#mythic-plus
Для создания сбора:
/mplus create dungeon:Название level:10 start:2026-10-25T20:00+02:00 mode:push
Укажите своё подземелье, уровень ключа (2–99), будущую дату с часовым смещением
в пределах 30 дней и тип push, relaxed или carry. Название подземелья
вводится вручную; тип ключа — описание цели группы без ограничений на вступление.
В открывшемся модальном окне выберите одну пару «класс / специализация» в одном
из двух списков и отправьте форму. Создатель сразу занимает место в группе.
Другие игроки нажимают Join на карточке или используют /mplus join
и выбирают свою специализацию в таком же окне. Если место для роли занято,
бот отказывает в записи. Для смены специализации сначала выйдите из сбора.
Если через /setup настроена роль игроков, она нужна для участия в Mythic+
(кроме участников с Manage Server).
/mplus show показывает группу, /mplus leave выходит из неё. Лидер или
участник с Manage Server управляет группой через /mplus kick, /mplus transfer,
/mplus start и /mplus cancel; выход лидера отменяет сбор.
Старт требует состава 1/1/3 и закрывает запись в Discord.
Незапущенный сбор закрывается через час после назначенного времени.
Карточки работают после перезапуска и восстанавливаются после удаления.
При первом запуске обновлённой версии старые привязки Steam и Battle.net
удаляются из состояния, а сборы M+ прежнего формата закрываются со сбросом
состава. Настройки сборов, обычные голоса, статистика и WoW-дашборд сохраняются.
Старые переменные STEAM_API_KEY и BNET_* в .env больше не используются.
Python 3.11+, discord.py 2.6+, один асинхронный процесс без внешней базы данных.
| Файл | Ответственность |
|---|---|
bot.py |
Discord-клиент, регистрация команд, сборы, постоянные кнопки, роли по реакциям и фоновые задачи |
state.py |
JSON-хранилище по ID сервера: чтение через Store.read, изменения через Store.edit, блокировка и атомарная запись с откатом при ошибках |
wow.py |
Общий клиент Raider.IO: таймауты, ограничение частоты, кэш, снимок гильдии и оформление дашборда |
mplus.py |
Команды и карточки Mythic+, модальное окно выбора специализации, места и управление группами |
test_*.py |
Unit-тесты с подменой Discord и HTTP, без рабочего состояния и реальных подключений |
Dockerfile, docker-compose.yaml |
Сборка контейнера, переменные окружения, каталог данных |
В JSON сохраняются настройки, голоса, статистика, привязки ролей, последний снимок дашборда и группы Mythic+. Состав Discord-роли читается из Discord, полный состав WoW-гильдии на диск не записывается. HTTP-клиенты используют таймауты и закрываются вместе с ботом.
Запуск тестов из корня проекта с установленными зависимостями:
python -m unittest discover -s . -v