Update wiki page 'Руководство ГМа'

2026-04-24 13:30:17 +03:00
parent 9d15107abf
commit 20f3529efc
@@ -1,12 +1,10 @@
# Руководство ГМа # Руководство ГМа
Руководство описывает текущие пользовательские сценарии бота и web-панели. Руководство описывает пользовательские сценарии бота и Web-панели для GM-Relay **v1.2.0**.
## Кто считается ГМом ## Кто считается ГМом
ГМ группы определяется полем `game_groups.gm_telegram_id`. При первом создании сессии в группе бот сохраняет Telegram ID автора как ГМа. Последующие операции управления проверяют этот ID. GM группы определяется полем `game_groups.gm_telegram_id`. При первом создании сессии в группе бот сохраняет Telegram ID автора как GM. Последующие операции управления проверяют этот ID.
Это значит, что роль ГМа внутри GM-Relay не обязательно равна роли администратора Telegram-группы.
## Создание расписания ## Создание расписания
@@ -17,6 +15,7 @@
Название: Легенды Берега Мечей Название: Легенды Берега Мечей
Время: 15.05.2026 19:30 Время: 15.05.2026 19:30
Время: 22.05.2026 19:00 Время: 22.05.2026 19:00
Мест: 4
Ссылка: https://example.com/join Ссылка: https://example.com/join
``` ```
@@ -24,78 +23,71 @@
- `Название:` — общий заголовок пачки игр. - `Название:` — общий заголовок пачки игр.
- `Время:` — дата и время в МСК. Можно указать несколько строк. - `Время:` — дата и время в МСК. Можно указать несколько строк.
- `Мест:` — необязательный лимит основного состава для каждой сессии в пачке.
- `Ссылка:` — ссылка для подключения к игре. - `Ссылка:` — ссылка для подключения к игре.
Поддерживаемые форматы времени: Если `Мест:` не указан, запись остаётся без лимита. Если указан лимит, бот показывает заполненность в формате `Места: 2/4`.
- `dd.MM.yyyy HH:mm` ## Запись игроков и лист ожидания
- `dd.MM.yyyy H:mm`
- `d.MM.yyyy HH:mm`
Время в прошлом пропускается с предупреждением. Некорректные строки `Время:` тоже пропускаются с предупреждением. Игроки записываются через inline-кнопки вида `На <дата>` в сообщении расписания.
После успешного создания бот публикует общее сообщение расписания с кнопками записи. Если группа является Telegram forum, бот создаёт отдельную тему `Игры: <Название>` и публикует расписание там. Поведение при записи:
## Запись игроков - если мест достаточно, игрок попадает в основной состав со статусом RSVP `Pending`;
- если лимит заполнен, игрок попадает в `Лист ожидания` и не считается активным участником игры;
- повторная запись отвечает, что игрок уже записан или уже находится в листе ожидания.
Игроки записываются через inline-кнопки вида `На <дата>` в сообщении расписания. При записи бот: Игроки из листа ожидания не участвуют в RSVP, голосовании переноса и рассылке ссылки на игру, пока GM не поднимет их в основной состав.
- создаёт или обновляет запись игрока в `players`; ## Повышение из листа ожидания
- добавляет участника в `session_participants` со статусом `Pending`;
- перерисовывает общее сообщение расписания.
Повторная запись на ту же сессию отклоняется сообщением `Вы уже записаны!`. GM может поднять первого игрока из очереди:
- в Telegram — кнопкой `Из ожидания (ГМ)` в сообщении расписания;
- в Web Dashboard — кнопкой `Из ожидания` в списке сессий.
Повышение возможно только если в основном составе есть свободное место. Если лимит заполнен, сначала увеличьте `Мест:` в Web-редактировании сессии.
## Отмена и удаление ## Отмена и удаление
Есть два разных действия:
- `Отменить <дата> (ГМ)` в сообщении расписания меняет статус сессии на `Cancelled` и оставляет её в истории пачки. - `Отменить <дата> (ГМ)` в сообщении расписания меняет статус сессии на `Cancelled` и оставляет её в истории пачки.
- `/listsessions` показывает будущие сессии; если команду вызывает ГМ, бот добавляет кнопки удаления. Удаление физически удаляет сессию из БД. - `/listsessions` показывает будущие сессии; если команду вызывает GM, бот добавляет кнопки удаления.
- Удаление физически удаляет сессию из БД. Если после удаления пачка пустая и была создана forum-тема, бот пытается удалить тему.
Если удалена последняя сессия пачки и для неё была создана forum-тема, бот пытается удалить эту тему.
## Перенос сессии ## Перенос сессии
Перенос запускается кнопкой `⏰ (ГМ)` в сообщении расписания. Перенос запускается кнопкой `⏰ (ГМ)` в сообщении расписания.
Текущий поток: Поток:
1. Бот проверяет, что кнопку нажал ГМ. 1. Бот проверяет, что кнопку нажал GM.
2. Создаётся `reschedule_proposals` со статусом `AwaitingTime`. 2. Создаётся `reschedule_proposals` со статусом `AwaitingTime`.
3. ГМ пишет новое время обычным сообщением в чат. 3. GM пишет новое время обычным сообщением в чат.
4. Если участников нет, бот переносит сессию сразу. 4. Если активных участников нет, бот переносит сессию сразу.
5. Если участники есть, бот создаёт голосование. 5. Если активные участники есть, бот создаёт голосование.
6. Любой голос `Против` отклоняет перенос. 6. Любой голос `Против` отклоняет перенос.
7. Если все участники согласились, бот переносит сессию, сбрасывает RSVP участников в `Pending`, очищает `confirmation_message_id` и `link_message_id`. 7. Если все активные участники согласились, бот переносит сессию, сбрасывает RSVP активных участников в `Pending`, очищает `confirmation_message_id` и `link_message_id`.
## Подтверждение участия ## RSVP и ссылка на игру
Планировщик проверяет БД раз в минуту. За 24 часа до сессии со статусом `Planned` бот отправляет RSVP-сообщение участникам. За 24 часа до плановой сессии бот отправляет RSVP-сообщение активным участникам:
Участники выбирают: - `Буду` переводит участника в `Confirmed`.
- `Не смогу` переводит участника в `Declined`, а GM получает личное уведомление.
- `Буду` — статус игрока становится `Confirmed`. Когда все активные участники подтвердили участие, сессия переходит в `Confirmed`, группа и GM получают уведомления.
- `Не смогу` — статус игрока становится `Declined`, ГМ получает личное уведомление.
Когда все участники подтвердили участие, сессия переходит в `Confirmed`, группа и ГМ получают уведомления. За 5 минут до подтверждённой сессии бот отправляет ссылку на подключение и список подтверждённых активных участников.
## Ссылка на игру
За 5 минут до сессии со статусом `Confirmed` бот отправляет ссылку на подключение и список подтверждённых участников. Повторная отправка защищена полем `link_message_id`.
## Экспорт календаря
Команда `/exportcalendar` отправляет файл `schedule.ics` с будущими сессиями текущей группы, которые находятся в статусе `Planned`. Длительность события в календаре сейчас фиксирована как 4 часа.
## Web-панель ## Web-панель
Web UI доступен после входа через Telegram Login Widget. Web UI доступен после входа через Telegram Login Widget. GM может:
ГМ может:
- видеть свои Telegram-группы; - видеть свои Telegram-группы;
- открыть список предстоящих сессий группы; - открыть список предстоящих сессий группы;
- изменить название, время и ссылку сессии. - видеть заполненность и размер листа ожидания;
- редактировать название, время, ссылку и лимит мест;
- поднять первого игрока из листа ожидания, если есть свободное место.
При сохранении изменений web-панель обновляет запись в БД, отправляет уведомление в Telegram-группу и пытается перерисовать исходное сообщение расписания пачки. При сохранении изменений Web-панель обновляет запись в БД, отправляет уведомление в Telegram-группу и пытается перерисовать исходное сообщение расписания пачки.