diff --git a/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0.md b/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0.md index e60a027..61a10bc 100644 --- a/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0.md +++ b/%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0.md @@ -29,6 +29,7 @@ GM-Relay состоит из нескольких .NET-проектов и об - `/start`, `/help`, `/newsession`, `/listsessions`, `/exportcalendar`; - callback `join_session:`; +- callback `leave_session:`; - callback `cancel_session:`; - callback `delete_session:`; - callback `reschedule_session:`; @@ -77,4 +78,4 @@ Blazor Server-приложение использует cookie auth и Telegram ## Диаграммы -C4-диаграммы хранятся в `docs/c4-system-context.md`. Там описаны system context, container view и component view для `GmRelay.Bot`. \ No newline at end of file +C4-диаграммы хранятся в `docs/c4-system-context.md`. Там описаны system context, container view и component view для `GmRelay.Bot`. diff --git a/%D0%91%D0%B0%D0%B7%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85.md b/%D0%91%D0%B0%D0%B7%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85.md index 3fe9667..22f9995 100644 --- a/%D0%91%D0%B0%D0%B7%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85.md +++ b/%D0%91%D0%B0%D0%B7%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85.md @@ -1,6 +1,6 @@ # База данных -GM-Relay **v1.2.0** использует PostgreSQL. Изменения схемы управляются DbUp-миграциями, встроенными в `GmRelay.Bot` как embedded resources. +GM-Relay **v1.3.0** использует PostgreSQL. Изменения схемы управляются DbUp-миграциями, встроенными в `GmRelay.Bot` как embedded resources. ## Миграции @@ -110,6 +110,8 @@ Confirmed -> ConfirmationSent, если активный участник отк ```text Active Waitlisted -> Active, когда GM повышает игрока из листа ожидания +Active -> удаление строки, когда игрок самостоятельно снимает запись +Waitlisted -> удаление строки, когда игрок выходит из листа ожидания ``` RSVP-статусы: @@ -123,4 +125,4 @@ Declined -> Confirmed ## Работа со временем -Пользовательский ввод и вывод работают в московском времени `UTC+3`. В базе `scheduled_at` хранится в UTC. `MoscowTime.TryParseMoscow` преобразует поддерживаемые локальные форматы в UTC перед сохранением. \ No newline at end of file +Пользовательский ввод и вывод работают в московском времени `UTC+3`. В базе `scheduled_at` хранится в UTC. `MoscowTime.TryParseMoscow` преобразует поддерживаемые локальные форматы в UTC перед сохранением. diff --git a/%D0%91%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82.md b/%D0%91%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82.md index 8719996..b7d0a7c 100644 --- a/%D0%91%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82.md +++ b/%D0%91%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82.md @@ -1,6 +1,6 @@ # Быстрый старт -Эта страница описывает минимальный запуск текущей версии GM-Relay **v1.2.0**. +Эта страница описывает минимальный запуск текущей версии GM-Relay **v1.3.0**. ## Требования @@ -41,8 +41,8 @@ docker compose up -d Compose поднимает: - `db`: PostgreSQL 17 Alpine, БД `gmrelay_db`, пользователь `gmrelay`. -- `bot`: образ `git.codeanddice.ru/toutsu/gmrelay-bot:1.2.0`. -- `web`: образ `git.codeanddice.ru/toutsu/gmrelay-web:1.2.0`. +- `bot`: образ `git.codeanddice.ru/toutsu/gmrelay-bot:1.3.0`. +- `web`: образ `git.codeanddice.ru/toutsu/gmrelay-web:1.3.0`. Web UI будет доступен на `http://localhost:8080`, если `GMRELAY_WEB_PORT` не переопределён. @@ -71,5 +71,6 @@ dotnet run --project src/GmRelay.AppHost - `/start` должен ответить `GM-Relay Bot ready. Use /help for commands.` - `/help` должен показать формат `/newsession`, включая необязательную строку `Мест:`. +- В сообщении расписания у активной сессии должны быть кнопки записи и `Выйти`. - Web-панель должна перенаправлять неавторизованного пользователя на `/login`. -- После входа через Telegram GM видит только группы, где он записан как `gm_telegram_id`. \ No newline at end of file +- После входа через Telegram GM видит только группы, где он записан как `gm_telegram_id`. diff --git a/%D0%A0%D0%B0%D0%B7%D0%B2%D1%91%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.md b/%D0%A0%D0%B0%D0%B7%D0%B2%D1%91%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.md index 3b3e0a9..830b5cd 100644 --- a/%D0%A0%D0%B0%D0%B7%D0%B2%D1%91%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.md +++ b/%D0%A0%D0%B0%D0%B7%D0%B2%D1%91%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.md @@ -1,6 +1,6 @@ # Развёртывание -Текущий production-like способ запуска GM-Relay **v1.2.0** — Docker Compose из `compose.yaml`. +Текущий production-like способ запуска GM-Relay **v1.3.0** — Docker Compose из `compose.yaml`. ## Сервисы Docker Compose @@ -15,13 +15,13 @@ `bot`: -- образ: `git.codeanddice.ru/toutsu/gmrelay-bot:1.2.0`; +- образ: `git.codeanddice.ru/toutsu/gmrelay-bot:1.3.0`; - запускается после успешного healthcheck сервиса `db`; - переменные окружения: `ConnectionStrings__gmrelaydb`, `Telegram__BotToken`. `web`: -- образ: `git.codeanddice.ru/toutsu/gmrelay-web:1.2.0`; +- образ: `git.codeanddice.ru/toutsu/gmrelay-web:1.3.0`; - запускается после успешного healthcheck сервиса `db`; - переменные окружения: `ConnectionStrings__gmrelaydb`, `Telegram__BotToken`, `Telegram__BotUsername`; - порт: `${GMRELAY_WEB_PORT:-8080}:8080`; @@ -92,7 +92,7 @@ docker compose down -v ## Поведение миграций -Бот применяет DbUp-миграции при старте до обработки Telegram updates. В версии `1.2.0` добавлена миграция `V006__add_session_capacity_waitlist.sql`; она расширяет схему лимитом мест и листом ожидания. После обновления стоит проверить логи `bot`, чтобы убедиться, что миграции применились без ошибок. +Бот применяет DbUp-миграции при старте до обработки Telegram updates. В версии `1.3.0` новых миграций нет: самостоятельная отмена записи использует существующую таблицу `session_participants` и waitlist-схему из `V006__add_session_capacity_waitlist.sql`. После обновления стоит проверить логи `bot`, чтобы убедиться, что миграции применились без ошибок. ## Безопасность @@ -108,4 +108,4 @@ docker compose down -v 3. Выполнить `docker compose pull`, если образы опубликованы в registry. 4. Выполнить `docker compose up -d`. 5. Проверить `docker compose logs -f bot`: миграции, подключение к БД и старт Telegram polling. -6. Проверить вход в Web-панель и одну read-only страницу группы или сессии до редактирования данных. \ No newline at end of file +6. Проверить вход в Web-панель и одну read-only страницу группы или сессии до редактирования данных. diff --git a/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0.md b/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0.md index 0893ca2..ad04d89 100644 --- a/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0.md +++ b/%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0.md @@ -26,7 +26,7 @@ dotnet run --project src/GmRelay.AppHost `Directory.Build.props` задаёт: -- `Version`: `1.1.5`. +- `Version`: `1.3.0`. - `TargetFramework`: `net10.0`. - `LangVersion`: `preview`. - `Nullable`: `enable`. @@ -101,4 +101,4 @@ Web-доступ должен проходить через `AuthorizedSessionSe - Не хранить секреты в appsettings или wiki. Использовать `.env`, environment variables или user secrets. - Не добавлять dynamic SQL-mapping без DTO: это ломает предсказуемость Dapper.AOT. - Любое изменение статусов должно быть согласовано с `SessionStatus`, миграциями и renderer/UI. -- Если web меняет данные сессии, нужно учитывать синхронизацию Telegram-сообщения через `SessionBatchRenderer`. \ No newline at end of file +- Если web меняет данные сессии, нужно учитывать синхронизацию Telegram-сообщения через `SessionBatchRenderer`. diff --git a/%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%93%D0%9C%D0%B0.md b/%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%93%D0%9C%D0%B0.md index 5b855ee..6e3e9cc 100644 --- a/%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%93%D0%9C%D0%B0.md +++ b/%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%93%D0%9C%D0%B0.md @@ -1,6 +1,6 @@ # Руководство ГМа -Руководство описывает пользовательские сценарии бота и Web-панели для GM-Relay **v1.2.0**. +Руководство описывает пользовательские сценарии бота и Web-панели для GM-Relay **v1.3.0**. ## Кто считается ГМом @@ -40,6 +40,17 @@ GM группы определяется полем `game_groups.gm_telegram_id` Игроки из листа ожидания не участвуют в RSVP, голосовании переноса и рассылке ссылки на игру, пока GM не поднимет их в основной состав. +## Самостоятельный выход игрока + +Игрок может снять запись кнопкой `Выйти <дата>` в сообщении расписания. + +Поведение при выходе: + +- если игрок был в основном составе, его запись удаляется из сессии; +- если игрок был в листе ожидания, он удаляется из очереди; +- если после выхода из основного состава есть свободное место и лист ожидания не пуст, бот автоматически переводит первого ожидающего в основной состав; +- после изменения бот перерисовывает сообщение расписания, чтобы список участников и очередь оставались актуальными. + ## Повышение из листа ожидания GM может поднять первого игрока из очереди: @@ -47,7 +58,7 @@ GM может поднять первого игрока из очереди: - в Telegram — кнопкой `Из ожидания (ГМ)` в сообщении расписания; - в Web Dashboard — кнопкой `Из ожидания` в списке сессий. -Повышение возможно только если в основном составе есть свободное место. Если лимит заполнен, сначала увеличьте `Мест:` в Web-редактировании сессии. +Повышение возможно только если в основном составе есть свободное место. Если лимит заполнен, сначала увеличьте `Мест:` в Web-редактировании сессии. При самостоятельном выходе активного игрока первый ожидающий повышается автоматически. ## Отмена и удаление @@ -90,4 +101,4 @@ Web UI доступен после входа через Telegram Login Widget. - редактировать название, время, ссылку и лимит мест; - поднять первого игрока из листа ожидания, если есть свободное место. -При сохранении изменений Web-панель обновляет запись в БД, отправляет уведомление в Telegram-группу и пытается перерисовать исходное сообщение расписания пачки. \ No newline at end of file +При сохранении изменений Web-панель обновляет запись в БД, отправляет уведомление в Telegram-группу и пытается перерисовать исходное сообщение расписания пачки. diff --git a/Home.md b/Home.md index a2e3cae..4d65932 100644 --- a/Home.md +++ b/Home.md @@ -1,10 +1,10 @@ # Главная -GM-Relay — Telegram-бот и Blazor-панель для организации TTRPG-сессий. Текущее состояние документации соответствует репозиторию `Toutsu/GmRelayBot` и релизу **v1.2.0**. +GM-Relay — Telegram-бот и Blazor-панель для организации TTRPG-сессий. Текущее состояние документации соответствует репозиторию `Toutsu/GmRelayBot` и релизу **v1.3.0**. ## Текущий стек -- Версия проекта: `1.2.0`. +- Версия проекта: `1.3.0`. - Платформа: `.NET 10`, C# preview, nullable reference types, warnings as errors. - Оркестрация разработки: `.NET Aspire 13` через `src/GmRelay.AppHost`. - Runtime бота: `Worker Service`, Telegram long polling, Native AOT. @@ -17,8 +17,9 @@ GM-Relay — Telegram-бот и Blazor-панель для организаци - Создание пачки игровых сессий одной командой `/newsession` с несколькими строками `Время:`. - Опциональный лимит мест через строку `Мест:` при создании сессии. -- Интерактивная запись игроков на конкретные даты через inline-кнопки Telegram. +- Интерактивная запись игроков на конкретные даты и самостоятельный выход через inline-кнопки Telegram. - Лист ожидания: если основной состав заполнен, новые игроки не переполняют сессию, а попадают в очередь. +- Автоматическое освобождение места: когда активный игрок снимает запись, первый ожидающий переводится в основной состав. - Повышение первого игрока из листа ожидания кнопкой GM в Telegram или Web Dashboard. - Автоматическое создание Telegram forum topic для пачки игр, если группа является форумом. - Отмена отдельной сессии GM из основного сообщения расписания. @@ -36,4 +37,4 @@ GM-Relay — Telegram-бот и Blazor-панель для организаци - [Архитектура](Архитектура) — устройство сервисов и ключевые потоки. - [Разработка](Разработка) — правила разработки, тесты и локальные команды. - [Развёртывание](Развёртывание) — Docker Compose, окружение и эксплуатация. -- [База данных](База-данных) — схема БД, миграции и статусная модель. \ No newline at end of file +- [База данных](База-данных) — схема БД, миграции и статусная модель.