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 61a10bc..ff8bdc9 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 @@ -57,14 +57,15 @@ Blazor Server-приложение использует cookie auth и Telegram Основные сервисы: - `TelegramAuthService` валидирует HMAC-SHA256 подпись Telegram Login Widget и `auth_date`. -- `SessionService` читает и обновляет группы/сессии через Dapper. +- `SessionService` читает и обновляет группы/сессии через Dapper, включая bulk-операции по `batch_id`. +- `BatchSchedulePlanner` задаёт детерминированные правила fixed-interval переноса и clone-смещения batch. - `AuthorizedSessionService` проверяет, что текущий Telegram ID является ГМом группы. Основные страницы: - `/login` — вход через Telegram. - `/` — список групп ГМа. -- `/group/{GroupId}` — будущие сессии группы. +- `/group/{GroupId}` — будущие сессии группы и batch bulk-операции. - `/session/edit/{SessionId}` — редактирование названия, времени и ссылки. ## Общий домен 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 22f9995..9474e63 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.3.0** использует PostgreSQL. Изменения схемы управляются DbUp-миграциями, встроенными в `GmRelay.Bot` как embedded resources. +GM-Relay **v1.4.0** использует PostgreSQL. Изменения схемы управляются DbUp-миграциями, встроенными в `GmRelay.Bot` как embedded resources. ## Миграции @@ -57,6 +57,8 @@ Telegram-группы, где организуются игры. - `thread_id` — ID Telegram forum topic, если тема была создана. - `batch_message_id` — ID исходного Telegram-сообщения с расписанием пачки. +Bulk-операции Web в версии `1.4.0` не требуют новых таблиц: общий title/link обновляется по `batch_id`, перенос пересчитывает `scheduled_at` существующих строк, а clone создаёт новый `batch_id` и новые строки `sessions` без копирования `session_participants`. + Для активных статусов есть partial index `ix_sessions_pending` по `scheduled_at`. ### session_participants 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 b7d0a7c..036f0fc 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.3.0**. +Эта страница описывает минимальный запуск текущей версии GM-Relay **v1.4.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.3.0`. -- `web`: образ `git.codeanddice.ru/toutsu/gmrelay-web:1.3.0`. +- `bot`: образ `git.codeanddice.ru/toutsu/gmrelay-bot:1.4.0`. +- `web`: образ `git.codeanddice.ru/toutsu/gmrelay-web:1.4.0`. Web UI будет доступен на `http://localhost:8080`, если `GMRELAY_WEB_PORT` не переопределён. @@ -74,3 +74,4 @@ dotnet run --project src/GmRelay.AppHost - В сообщении расписания у активной сессии должны быть кнопки записи и `Выйти`. - Web-панель должна перенаправлять неавторизованного пользователя на `/login`. - После входа через Telegram GM видит только группы, где он записан как `gm_telegram_id`. +- На странице группы GM видит блоки batch-операций: общий title/link, перенос всей пачки и клонирование batch. 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 830b5cd..536cb45 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.3.0** — Docker Compose из `compose.yaml`. +Текущий production-like способ запуска GM-Relay **v1.4.0** — Docker Compose из `compose.yaml`. ## Сервисы Docker Compose @@ -15,13 +15,13 @@ `bot`: -- образ: `git.codeanddice.ru/toutsu/gmrelay-bot:1.3.0`; +- образ: `git.codeanddice.ru/toutsu/gmrelay-bot:1.4.0`; - запускается после успешного healthcheck сервиса `db`; - переменные окружения: `ConnectionStrings__gmrelaydb`, `Telegram__BotToken`. `web`: -- образ: `git.codeanddice.ru/toutsu/gmrelay-web:1.3.0`; +- образ: `git.codeanddice.ru/toutsu/gmrelay-web:1.4.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.3.0` новых миграций нет: самостоятельная отмена записи использует существующую таблицу `session_participants` и waitlist-схему из `V006__add_session_capacity_waitlist.sql`. После обновления стоит проверить логи `bot`, чтобы убедиться, что миграции применились без ошибок. +Бот применяет DbUp-миграции при старте до обработки Telegram updates. В версии `1.4.0` новых миграций нет: bulk-операции Web используют существующие поля `sessions.batch_id`, `sessions.batch_message_id`, `sessions.title`, `sessions.join_link` и `sessions.scheduled_at`. После обновления стоит проверить логи `bot`, чтобы убедиться, что миграции применились без ошибок. ## Безопасность 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 ad04d89..eead312 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.3.0`. +- `Version`: `1.4.0`. - `TargetFramework`: `net10.0`. - `LangVersion`: `preview`. - `Nullable`: `enable`. 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 6e3e9cc..2100e7d 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.3.0**. +Руководство описывает пользовательские сценарии бота и Web-панели для GM-Relay **v1.4.0**. ## Кто считается ГМом @@ -60,6 +60,16 @@ GM может поднять первого игрока из очереди: Повышение возможно только если в основном составе есть свободное место. Если лимит заполнен, сначала увеличьте `Мест:` в Web-редактировании сессии. При самостоятельном выходе активного игрока первый ожидающий повышается автоматически. +## Bulk-операции для batch в Web + +На странице группы Web-панель показывает отдельный блок для каждой видимой пачки игр. GM может: + +- обновить общий `title` и `link` сразу у всех сессий batch; +- перенести всю пачку, задав новую первую дату и фиксированный шаг между играми в днях; +- клонировать batch на следующую неделю или следующий календарный месяц. + +Редактирование title/link и перенос перерисовывают исходное Telegram-сообщение расписания. Клонирование создаёт новую пачку с новым `batch_id`, новым Telegram-сообщением и пустым составом игроков. + ## Отмена и удаление - `Отменить <дата> (ГМ)` в сообщении расписания меняет статус сессии на `Cancelled` и оставляет её в истории пачки. @@ -99,6 +109,7 @@ Web UI доступен после входа через Telegram Login Widget. - открыть список предстоящих сессий группы; - видеть заполненность и размер листа ожидания; - редактировать название, время, ссылку и лимит мест; -- поднять первого игрока из листа ожидания, если есть свободное место. +- поднять первого игрока из листа ожидания, если есть свободное место; +- выполнять bulk-операции над batch: общий title/link, перенос пачки и клонирование на неделю или месяц. -При сохранении изменений Web-панель обновляет запись в БД, отправляет уведомление в Telegram-группу и пытается перерисовать исходное сообщение расписания пачки. +При сохранении отдельной сессии Web-панель обновляет запись в БД, отправляет уведомление в Telegram-группу и пытается перерисовать исходное сообщение расписания пачки. Bulk-операции обновляют исходное batch-сообщение, а clone публикует новое сообщение для новой пачки. diff --git a/Home.md b/Home.md index 4d65932..dd092c5 100644 --- a/Home.md +++ b/Home.md @@ -1,10 +1,10 @@ # Главная -GM-Relay — Telegram-бот и Blazor-панель для организации TTRPG-сессий. Текущее состояние документации соответствует репозиторию `Toutsu/GmRelayBot` и релизу **v1.3.0**. +GM-Relay — Telegram-бот и Blazor-панель для организации TTRPG-сессий. Текущее состояние документации соответствует репозиторию `Toutsu/GmRelayBot` и релизу **v1.4.0**. ## Текущий стек -- Версия проекта: `1.3.0`. +- Версия проекта: `1.4.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. @@ -29,6 +29,7 @@ GM-Relay — Telegram-бот и Blazor-панель для организаци - Отправка ссылки на подключение за 5 минут до подтверждённой игры. - Экспорт будущих запланированных сессий в `.ics` через `/exportcalendar`. - Web-панель для GM: список групп, список сессий, редактирование названия, времени, ссылки и лимита мест. +- Bulk-операции в Web Dashboard: общий `title/link` для batch, перенос всей пачки на фиксированный шаг и клонирование на следующую неделю или месяц с новым Telegram-сообщением. ## Разделы