HELPER Discord Bot
К списку Wiki
EVENT STATION // MANAGE MENU // LUXURY PNG POSTERS

HELPER EVENTS СБОРЫ И МЕРОПРИЯТИЯ DISCORD STATION / ROLE SELECT / MANAGE MENU / 1200×950 POSTER

Events превращает хаотичное “кто идёт?” в понятную систему мероприятий. Администратор ставит станцию сборов, организатор создаёт афишу через Discord Modal, игроки видят только чистую линию кнопок ✅ Иду / ❌ Не иду / ⚙️ Управление, а HELPER перерисовывает luxury PNG-постер, считает места, делит участников по ролям и сохраняет итог в архив.

1200×950luxury PNG афиша
3кнопки в линии
1.35sdebounce рендера
TTLкеш аватарок
Station/event_setup ставит панель
Modalорганизатор вводит данные
PosterPillow рисует luxury-афишу
Manageсписок и закрытие скрыты в меню
Archiveзакрытый сбор уходит в логи

Что такое Events

Events — это система записи на мероприятия внутри Discord. Она подходит для рейдов, каптов, тренировок, собраний, турниров, RP-сцен, сезонных активностей и любых событий, где нужно собрать людей, роли и лимит мест.

01

Станция

Постоянная панель с кнопкой создания мероприятия.

02

Форма

Название, время, лимит мест и роли вводятся через Discord Modal.

03

Запись

Игроки нажимают “Иду”, выбирают роль или отказываются кнопкой “Не иду”.

04

Управление

Список и закрытие спрятаны в приватном меню “⚙️ Управление”.

Больше информации картинками

Здесь показан обновлённый путь под новый Cog: station panel, Modal создания, выбор роли для пинга, живая luxury-афиша, чистая линия из трёх кнопок и приватное меню управления для staff.

01 / stationСтанция сборов
🗺️
HELPER EVENTSСтанция сборов

🗺️ СТАНЦИЯ СБОРОВ

Нажмите кнопку ниже, чтобы создать мероприятие. Бот подготовит форму, афишу, кнопки записи и список участников.

EVENT STATION BANNER
⚔️ Создать мероприятие
02 / modalСоздание афиши
📝
Discord ModalСоздание Афиши Сбора

Поля формы

Название сбора: Капт за территорию
Время: Сегодня 18:00 МСК
Макс. мест: 20
Роли: Стрелок, Водитель, Медик
03 / ping roleКого уведомить
🔔
Role SelectПеред публикацией

Кого нужно позвать?

Можно выбрать роль для упоминания над афишей или пропустить пинг.

@Raid Team
Пропустить
04 / live posterЖивая афиша
⚔️
public event messageКапт за территорию

⚔️ КАПТ ЗА ТЕРРИТОРИЮ

Бот отправляет стартовое сообщение, сохраняет сбор в БД, рисует PNG и обновляет сообщение.

PNG POSTER 1200×950
✅ Иду
❌ Не иду
⚙️ Управление
05 / manage menuПриватное управление
ephemeralstaff only
📄 СписокTXT со всеми участниками открывается только организатору, админу или staff-роли
export
🛑 Закрытьзакрывает сбор, переносит итоговую афишу в архив и удаляет live-сообщение
close
🔒 Проверка доступапосторонний пользователь получает ephemeral-отказ
safe
06 / archiveЗакрытие и лог
🛑
log channelСбор закрыт

🛑 Сбор закрыт и заархивирован

В архив уходит название, время, организатор, количество участников, роли и состав команды.

event_123456_participants.txt

Команды Discord

setup/event_setup
/event_setup panel_channel:#events log_channel:#events-archive staff_role:@Event Manager

Разворачивает станцию сборов, задаёт канал панели, канал архива и роль организаторов.

redeploy/event_deploy
/event_deploy

Обновляет панель сборов по текущим настройкам сайта или Discord.

close/event_close
/event_close message_id:123456789

Закрывает сбор по ID сообщения, переносит итог в архив и меняет view на “СБОР ЗАКРЫТ”.

panel buttonСоздать мероприятие
EventPanelView → EventCreateModal → PingRoleSelectView → create_event_poster() → schedule_event_update()

Организатор создаёт событие кнопкой, а публичная афиша получает только 3 кнопки: Иду, Не иду, Управление.

Путь события от станции до архива

1Setup

панель

2Modal

данные

3Ping

роль

4Poster

PNG

5Roster

участники

6Archive

итог

A

Atomic DB

Запись, отказ и закрытие идут через транзакции BEGIN IMMEDIATE.

B

View restore

После рестарта бот восстанавливает активные кнопки по message_id.

C

Debounced update

Клики объединяются через schedule_event_update, чтобы не рендерить PNG после каждого нажатия.

Что видит игрок

joinИду

✅ Вы успешно записаны!

Если роль одна — запись происходит сразу. Если ролей несколько — открывается select-меню выбора роли.

афиша обновляется автоматически
declineНе иду

✅ Вы вычеркнуты из списка

В текущей логике после отказа вернуться обратно в этот сбор нельзя.

role = declined
fullЕсли мест нет

❌ Мест больше нет

Если max_slots заполнен, следующий участник получает понятный отказ.

full status
cooldownЗащита от спама

⏳ Подождите пару секунд

Кнопки имеют небольшой cooldown, чтобы не спамить базу и Discord API.

2.5 sec / user

Что делает организатор

01

Создаёт сбор

Нажимает кнопку на станции, вводит название, время, места и роли.

02

Пингует роль

Выбирает, кого позвать над афишей, или пропускает этот шаг.

03

Открывает управление

Кнопка “⚙️ Управление” открывает приватное меню только для автора, администратора или staff-роли.

04

Список / Закрыть

В меню доступны “📄 Список” и “🛑 Закрыть”, поэтому публичная строка кнопок остаётся чистой.

Как работает афиша

Постер рисуется через PIL/Pillow в новом HELPER luxury-стиле: тёмный #020408, cyan/purple glow, glass-карточки, статус мест, колонки ролей и кешированные аватарки участников.

poster mockupPNG 1200×950
HELPER EVENTS
КАПТ ЗА ТЕРРИТОРИЮ
18:00 МСК • 14 / 20 • НАБОР ОТКРЫТ
СТРЕЛОК / ВОДИТЕЛЬ / МЕДИК / КООРДИНАТОР
render rulesЧто попадает на картинку
titleобрезается до безопасной длины и очищается от emoji для Pillow.
event_timeпоказывается в верхней meta-строке афиши.
max_slotsесли 0 — отображается как бесконечный лимит.
rolesдо 4 ролей, на каждую показывается до 10 участников.
avatarsаватарки участников скачиваются с таймаутом и кешируются по URL, чтобы повторный рендер был быстрее.
debounceчастые клики объединяются в один рендер через schedule_event_update.

Настройка на сайте

Сайт работает через events_settings.json. Он может запросить deploy панели, создать pending_event/pending_events, показать ошибки синхронизации и закрыть сбор через web-action. В новом Cog pending-событие не удаляется из очереди, если Discord-афиша реально не создалась.

dashboard panelEvents settings
panel_channel_idканал, где стоит станция сборов.
log_channel_idканал, куда уходят итоги после закрытия.
staff_role_idsроли, которые могут создавать мероприятия, скачивать список и закрывать сбор через меню управления.
custom_titleзаголовок панели станции сборов.
custom_bannerбаннер панели или fallback из центра баннеров.
custom_button_textтекст кнопки создания мероприятия.
custom_descописание панели; совместимо с legacy custom_description.
last_deploy_errorпоследняя причина, почему Discord deploy не сработал.
pending queueСоздание с сайта
events_settings.json
{ "123456789": { "panel_channel_id": "111", "log_channel_id": "222", "pending_events": [ { "title": "Тренировка состава", "time": "20:00 МСК", "slots": 25, "roles": ["Стрелок", "Водитель"], "ping_role_id": "333" } ], "deploy_requested": true } }
sync loopsite_sync_loop

10 секунд

Цикл проверяет module_states, pending_events и deploy_requested. За один проход обрабатывает до 5 web-events, а неудачные элементы оставляет в очереди.

processed_count <= 5 / failed stays pending
web closeЗакрытие с сайта

close_from_web

Сайт передаёт guild_id и message_id. Cog закрывает сбор и отправляет итог в log-канал.

closed from website

Примеры мероприятий

RAID PARTY

Рейды

Собрать роли, лимит мест и состав перед рейдом или боссом.

CAPTURE EVENT

Капты

Стрелки, водители, медики, координаторы — всё разделено по ролям.

TRAINING

Тренировки

Запись состава на тренировку с контролем посещаемости.

TOURNAMENT

Турниры

Регистрация участников или команд на сезонный ивент.

RP SCENE

RP-сцены

Сбор актёров, фракций, водителей, ведущих или staff.

MEETING

Собрания

Кто будет, кто не сможет, и готовый список для отчёта.

Если модуль выключен

Отключение закрывает создание и участие, но не удаляет сохранённые события и настройки.

disabled embedЧто видит пользователь
🔌
safe stateМодуль отключён

🔌 МОДУЛЬ СБОРОВ ОТКЛЮЧЁН

Создавать новые сборы, записываться и менять участие сейчас нельзя. Уже созданные данные сохранены.

🔌 СБОРЫ ОБЕСТОЧЕНЫ
module stateПочему безопасно
module_states.jsonхранит состояние модуля events.
ProtectedViewпроверяет статус перед нажатием кнопок.
ClosedEventViewзакрытые сборы получают неактивную красную кнопку.
restore_viewsпосле включения активные view восстанавливаются по базе.

Карта технической логики

filesФайлы и данные
SETTINGS_FILE

data/events_settings.json — настройки панели, каналов, ролей, pending_events и deploy.

EVENT_DB

data/events.db — SQLite события и участники.

EventGraphics

генератор luxury PNG-постера через PIL/Pillow, glow, glass-карточки, колонки ролей и кеш аватарок.

JSON locks

настройки пишутся через lock и временный файл, чтобы сайт и бот не конфликтовали.

database tablesSQLite
🗺️
eventsафиши и статусы
👥
participantsучастники по ролям
📌
message_idключ события
🔒
BEGIN IMMEDIATEatomic actions
event tableГлавные поля events
message_idID Discord-сообщения афиши.
guild_id/channel_idсервер и канал события.
title/event_timeданные для постера.
max_slots/rolesлимит мест и роли участников.
status/is_activeactive или closed.
participants tableГлавные поля participants
user_idучастник события.
roleвыбранная роль или declined.
role_changesсчётчик смен/отказов.
joined_at/updated_atистория времени участия.

Ошибки и решения

Панель не появилась после /event_setup

Проверьте права бота в panel_channel: Send Messages и Embed Links.

Афиша не рисуется

Проверьте права Attach Files, доступ к аватаркам и логи EventGraphics. Бот сначала отправляет “Рисуем афишу…”, затем обновляет сообщение.

Игрок не может записаться

Возможные причины: сбор закрыт, мест нет, роль больше недоступна, пользователь уже записан или ранее отказался.

Куда пропали кнопки “Скачать список” и “Закрыть”?

Они перенесены в приватное меню “⚙️ Управление”, чтобы публичная афиша выглядела ровно: Иду / Не иду / Управление.

Кто может скачать список?

Организатор события, администратор сервера или staff-роль из настроек Events.

Кто может закрыть сбор?

Организатор, администратор или staff-роль. Slash-команда /event_close по-прежнему доступна администраторам.

Что делает сайт?

Сайт может развернуть панель, создать pending_events, запросить deploy и закрыть сбор по message_id.

// WIKI_NAVIGATION

Вернуться к списку Wiki

Ты дошёл до конца страницы Events. Можно вернуться в общий центр документации, открыть Dashboard или подняться наверх к началу этой страницы.