-
released this
2026-04-27 15:03:38 +03:00 | 0 commits to main since this release🚀 Этап 4 — Расширение командных сценариев
Этот релиз закрывает следующую задачу этапа «Этап 4 — Расширение командных сценариев»: перенос сессии теперь работает как небольшое голосование по нескольким вариантам времени. GM больше не обязан угадывать единственный удобный слот — группа выбирает лучший вариант до заданного дедлайна.
✅ Закрытые issues
- #11 — feat: улучшить перенос сессии до голосования по нескольким вариантам времени: owner/co-GM предлагает 2-3 новых времени и дедлайн, участники голосуют кнопками в Telegram, сообщение показывает текущие результаты, а по дедлайну бот применяет победивший вариант или отклоняет перенос при ничьей/нуле голосов.
🧩 Что вошло в релиз
- сценарий
⏰ Перенеститеперь просит 2-3 варианта времени и строкуДедлайн: ДД.ММ.ГГГГ ЧЧ:ММ; - добавлен парсер
RescheduleVotingInput, который проверяет количество вариантов, повторы, будущие даты и дедлайн раньше первого предложенного времени; - голосование создаёт отдельную кнопку для каждого варианта и использует callback
reschedule_vote:<optionId>; - Telegram-сообщение голосования показывает дедлайн, варианты, счёт по каждому слоту, проголосовавших игроков и список тех, кто ещё не выбрал время;
- игрок может изменить голос до дедлайна: повторное нажатие обновляет его выбор вместо создания второго голоса;
- добавлен
RescheduleVotingDeadlineService, который раз в минуту финализирует просроченные голосования; - правило выбора зафиксировано явно: побеждает вариант с наибольшим числом голосов, а ничья или отсутствие голосов отклоняют перенос;
- при успешном переносе бот обновляет
scheduled_at, сбрасывает RSVP активных участников вPending, очищает старые confirmation/link сообщения и перерисовывает batch-сообщение; - DM-режим batch теперь отправляет игрокам личные уведомления о старте голосования и об итоговом результате переноса;
- база данных расширена миграцией
V009__add_multi_option_reschedule_votes.sql: добавленыvoting_deadline_at,selected_option_id,reschedule_optionsиreschedule_option_votes; - README и wiki обновлены под 1.7.0 и новый сценарий multi-slot переноса.
🛡 Что это даёт
- перенос стал удобнее для живых групп: GM предлагает несколько реалистичных слотов, а не один компромиссный вариант;
- участники видят текущую картину голосования прямо в Telegram и могут поменять решение до дедлайна;
- дедлайн убирает вечные подвисшие переносы: бот сам применяет победителя или оставляет старое время при спорном результате;
- Web и Telegram сохраняют общий источник правды в БД, а расписание в Telegram остаётся актуальным после финализации;
- существующие одиночные таблицы переноса не ломаются, а новые голосования используют отдельную multi-option модель.
📦 Версия и деплой
- версия проекта обновлена до 1.7.0 в
Directory.Build.props,compose.yaml, README, Web design system, wiki и Gitea Actions workflow; - Docker-образы и deploy-конфигурация используют тег 1.7.0;
- локально пройдены
dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj --collect:"XPlat Code Coverage"иdotnet build GM-Relay.slnx -c Release; - Gitea Actions run #44 успешно собрал, опубликовал и задеплоил bot/web образы.
Downloads
-
released this
2026-04-27 14:34:18 +03:00 | 1 commits to main since this release🚀 Этап 4 — Расширение командных сценариев
Этот релиз закрывает первую задачу этапа «Этап 4 — Расширение командных сценариев»: управлять группой теперь может не только один GM, но и назначенные помощники. Модель доступа разделена на owner/co-GM, а сценарии управления расписанием доступны в Telegram и Web Dashboard.
✅ Закрытые issues
- #9 — feat: поддержать co-GM и делегирование управления группой: добавлена роль
Ownerдля владельца группы иCoGmдля помощников; owner назначает co-GM в Web, а co-GM может управлять сессиями и batch-сценариями.
🧩 Что вошло в релиз
- добавлена доменная модель
GroupManagerRoleс ролямиOwnerиCoGm; - база данных расширена миграцией
V008__add_group_managers.sql: появилась таблицаgroup_managers, а существующиеgm_telegram_idмигрируют в owner-записи; /newsessionтеперь создаёт owner при первой регистрации группы и запрещает создание сессий посторонним пользователям в уже известной группе;- Telegram-кнопки отмены, удаления, переноса и повышения из листа ожидания проверяют доступ через
group_managers, поэтому owner и co-GM получают одинаковые права управления расписанием; /listsessionsпоказывает кнопки удаления для owner/co-GM, а обычные игроки видят только список игр;- Web Dashboard показывает роль пользователя на главной странице и блок управления группой на странице группы;
- owner может добавить co-GM по Telegram ID, имени и username, а также убрать co-GM без удаления игрока из базы;
AuthorizedSessionServiceпереведён с проверки одногоgm_telegram_idна проверку manager-роли группы;- README и wiki обновлены под 1.6.0 и новый сценарий делегирования.
🛡 Что это даёт
- кампанией можно управлять совместно: помощник GM может редактировать сессии, переносить игры, удалять устаревшие даты и работать с листом ожидания;
- owner сохраняет контроль над делегированием и остаётся единственной ролью, которая назначает или снимает co-GM;
- Telegram и Web используют одну модель доступа, поэтому права не расходятся между интерфейсами;
- существующие группы обновляются миграцией без ручного вмешательства.
📦 Версия и деплой
- версия проекта обновлена до 1.6.0 в
Directory.Build.props,compose.yaml, README, Web design system, wiki и Gitea Actions workflow; - Docker-образы и deploy-конфигурация используют тег 1.6.0;
- локально пройдены
dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj --collect:"XPlat Code Coverage"иdotnet build GM-Relay.slnx -c Release; - Gitea Actions run #43 успешно собрал, опубликовал и задеплоил bot/web образы.
Downloads
- #9 — feat: поддержать co-GM и делегирование управления группой: добавлена роль
-
released this
2026-04-27 10:12:17 +03:00 | 2 commits to main since this release🚀 Этап 3 — Базовый продуктовый рост
Этот релиз закрывает ещё одну продуктовую задачу этапа «Этап 3 — Базовый продуктовый рост»: важные сообщения теперь доходят не только через групповой чат, но и лично игрокам. При этом групповые уведомления сохранены как основной публичный источник состояния, а GM может управлять DM-дублированием на уровне batch.
✅ Закрытые issues
- #12 — feat: отправлять персональные уведомления игрокам в личные сообщения: добавлены DM-уведомления для RSVP за 24 часа, напоминания примерно за 1 час, ссылки перед стартом, отмены и переноса сессии; для batch доступен выбор режима
В группе и в личкуилиТолько в группе.
🧩 Что вошло в релиз
- добавлена доменная модель
SessionNotificationModeс режимамиGroupAndDirectиGroupOnly; - база данных расширена миграцией
V007__add_session_notification_mode.sql: у сессий появилсяnotification_mode, а T-1h reminder получил защиту от повторной обработки черезone_hour_reminder_processed_at; SessionSchedulerServiceтеперь обрабатывает отдельный T-1h trigger для персональных напоминаний;- RSVP за 24 часа по-прежнему публикуется в группе, но при
GroupAndDirectигроки получают личный DM с напоминанием подтвердиться в групповом сообщении; - ссылка перед игрой остаётся в группе и дополнительно отправляется подтверждённым игрокам в ЛС;
- отмена и перенос сессии отправляют персональные уведомления активным игрокам, не ломая групповые сообщения и перерисовку batch;
- добавлен graceful fallback: если Telegram не позволяет написать конкретному игроку в ЛС, ошибка логируется, а отправка остальным участникам продолжается;
- Web Dashboard получил dropdown режима уведомлений в batch bulk-блоке;
- clone batch наследует режим уведомлений исходной пачки;
- README и wiki обновлены под 1.5.0 и новый сценарий личных уведомлений.
🛡 Что это даёт
- игроки меньше зависят от видимости группового чата и получают критичные изменения прямо в личку;
- GM сохраняет публичную историю в группе и может отключить DM для конкретной пачки, если они не нужны;
- переносы, отмены и предыгровые напоминания становятся заметнее без ручной рассылки;
- отказ Telegram DM одному игроку не блокирует уведомления всей группе или остальным участникам.
📦 Версия и деплой
- версия проекта обновлена до 1.5.0 в
Directory.Build.props,compose.yaml, README, Web design system, wiki и Gitea Actions workflow; - Docker-образы и deploy-конфигурация используют тег 1.5.0;
- локально пройдены
dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj --collect:"XPlat Code Coverage"иdotnet build GM-Relay.slnx -c Release; - Gitea Actions run #42 успешно собрал, опубликовал и задеплоил bot/web образы.
Downloads
- #12 — feat: отправлять персональные уведомления игрокам в личные сообщения: добавлены DM-уведомления для RSVP за 24 часа, напоминания примерно за 1 час, ссылки перед стартом, отмены и переноса сессии; для batch доступен выбор режима
-
released this
2026-04-27 09:51:05 +03:00 | 3 commits to main since this release🛠 Web UI hotfix
Этот релиз закрывает точечную проблему читаемости в Web Dashboard: native dropdown у bulk-операций batch-сессий больше не открывается белым списком с почти белым текстом. Варианты вроде «Следующая неделя» и «Следующий месяц» теперь используют контрастный фон и текст, согласованные с тёмной темой GM-Relay.
✅ Решённые issues
- Отдельного Gitea issue для этого hotfix не было. Решён пользовательский дефект из Web Dashboard: нечитаемый шрифт в раскрытом списке выбора периода клонирования batch-сессии.
🧩 Что вошло в релиз
- добавлено явное CSS-оформление
select optionчерезvar(--bg-secondary)иvar(--text-primary); - сохранена совместимость с текущим тёмным dashboard theme без изменения разметки и логики bulk-операций;
- добавлен регрессионный тест
WebStylesTests, который проверяет наличие контрастных стилей для native select options; - README, wiki, Docker Compose, Web design system и Gitea Actions workflow обновлены под 1.4.1.
🛡 Что это даёт
- GM может уверенно выбирать клонирование batch на следующую неделю или месяц без визуального сбоя;
- dropdown остаётся читаемым в тёмной теме на системном native popup;
- будущие правки CSS не смогут незаметно убрать этот стиль без падения теста.
📦 Версия и деплой
- версия проекта обновлена до 1.4.1 в
Directory.Build.props,compose.yaml, README, Web UI, wiki и Gitea Actions workflow; - Docker-образы и deploy-конфигурация используют тег 1.4.1;
- локально пройдены
dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj --collect:"XPlat Code Coverage"иdotnet build GM-Relay.slnx -c Release; - Gitea Actions run #41 успешно собрал, опубликовал и задеплоил bot/web образы.
Downloads
-
released this
2026-04-27 09:37:40 +03:00 | 4 commits to main since this release🚀 Этап 3 — Базовый продуктовый рост
Этот релиз закрывает ещё одну продуктовую задачу этапа «Этап 3 — Базовый продуктовый рост»: Web Dashboard теперь умеет работать не только с отдельными сессиями, но и со всей пачкой игр. GM может быстро поддерживать campaign-style расписание без ручного редактирования каждой даты.
✅ Закрытые issues
- #10 — feat: добавить bulk-операции для batch-сессий в Web: добавлены общий
title/linkдля batch, массовый перенос пачки на фиксированный интервал, клонирование на следующую неделю или месяц и понятный UI на странице группы.
🧩 Что вошло в релиз
- на странице группы появился отдельный блок batch-операций для каждой видимой пачки сессий;
- общий
titleиjoin_linkтеперь можно обновить сразу для всех сессий одногоbatch_id; - массовый перенос пересчитывает даты пачки от новой первой даты с фиксированным шагом в днях;
- clone создаёт новый
batch_id, новые строкиsessions, новое Telegram batch-сообщение и пустой состав игроков; - Web после bulk-операций перечитывает список сессий, чтобы таблица и мобильные карточки оставались синхронны;
- исходное Telegram-сообщение расписания перерисовывается после обновления title/link и переноса;
- добавлен
BatchSchedulePlannerс unit-тестами для fixed-interval расписания и календарных clone-смещений; AuthorizedSessionServiceполучил проверки доступа на уровне batch, чтобы GM не мог менять чужие пачки по прямому GUID;- README, wiki, Docker Compose, Web design system и Gitea Actions workflow обновлены под 1.4.0.
🛡 Что это даёт
- GM может переименовать кампанию или заменить ссылку на созвон один раз для всей пачки;
- недельные и месячные кампании можно переносить без однотипного редактирования каждой сессии;
- повторяющееся расписание можно быстро склонировать на следующую неделю или месяц;
- новая пачка после клонирования стартует без старых записей игроков, поэтому состав набирается заново;
- Telegram-сообщение расписания остаётся актуальным источником правды после Web-операций.
📦 Версия и деплой
- версия проекта обновлена до 1.4.0 в
Directory.Build.props,compose.yaml, README, Web UI, wiki и Gitea Actions workflow; - Docker-образы и deploy-конфигурация используют тег 1.4.0;
- локально пройдены
dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj --collect:"XPlat Code Coverage"иdotnet build GM-Relay.slnx -c Release; - Gitea Actions run #40 успешно собрал, опубликовал и задеплоил bot/web образы.
Downloads
- #10 — feat: добавить bulk-операции для batch-сессий в Web: добавлены общий
-
released this
2026-04-27 09:03:35 +03:00 | 5 commits to main since this release🚀 Этап 3 — Базовый продуктовый рост
Этот релиз продолжает этап «Этап 3 — Базовый продуктовый рост»: игроки теперь могут самостоятельно снять запись с сессии прямо из Telegram-сообщения расписания. Бот корректно убирает игрока из основного состава или листа ожидания, обновляет batch-сообщение и автоматически отдаёт освободившееся место первому ожидающему.
✅ Закрытые issues
- #8 — feat: позволить игроку самостоятельно отменять запись на сессию: добавлена кнопка выхода из сессии, удаление записи игрока, обновление состава/очереди и автоматическое повышение из waitlist при освобождении места.
🧩 Что вошло в релиз
- у каждой активной сессии появилась кнопка
🚪 Выйти, доступная игрокам в исходном сообщении расписания; - добавлен
LeaveSessionHandler, который проверяет запись игрока по Telegram ID и удаляет его изsession_participants; - если активный игрок освобождает место и в листе ожидания есть участники, бот автоматически переводит первого ожидающего в основной состав;
- batch-сообщение перерисовывается после выхода, чтобы основной состав, занятые места и очередь оставались актуальными;
- callback-routing получил
leave_session:<sessionId>, а DI-регистрация обновлена для Native AOT-friendly маршрутизации; - добавлены тесты для кнопки выхода в
SessionBatchRendererи правила автоповышения после выхода участника; - README, Web-версия, Docker Compose, deploy workflow и wiki обновлены под 1.3.0;
- Gitea Actions workflow адаптирован под registry после обновления Gitea 1.26: публикация образов выполняется через обычные
docker build/docker pushшаги.
🛡 Что это даёт
- игрок может освободить место без участия GM;
- GM больше не нужно вручную чистить основной состав или очередь при отказах до игры;
- waitlist становится живой очередью: освободившееся место сразу получает первый ожидающий;
- Telegram-сообщение расписания остаётся единым источником актуального состава.
📦 Версия и деплой
- версия проекта обновлена до 1.3.0 в
Directory.Build.props,compose.yaml, README, Web UI, wiki и Gitea Actions workflow; - Docker-образы и deploy-конфигурация используют тег 1.3.0;
- локально пройдены
dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj --collect:"XPlat Code Coverage"иdotnet build GM-Relay.slnx -c Release; - Gitea Actions run #39 успешно собрал, опубликовал и задеплоил bot/web образы.
Downloads
-
released this
2026-04-24 13:37:25 +03:00 | 10 commits to main since this release🚀 Этап 3 — Базовый продуктовый рост
Этот релиз закрывает продуктовую задачу этапа «Этап 3 — Базовый продуктовый рост»: сессии теперь могут иметь лимит мест, а игроки сверх лимита попадают в лист ожидания вместо обычной записи. ГМ видит заполненность, очередь ожидания и может повышать игроков в основной состав из Telegram или Web.
✅ Закрытые issues
- #7 — feat: добавить лимит мест в сессии и лист ожидания: добавлены лимит мест, лист ожидания, продвижение игроков ГМом и отображение мест/очереди в Telegram и Web.
🧩 Что вошло в релиз
/newsessionполучил опциональное полеМест:/Лимит:/Максимум:для задания вместимости сессии;- база данных расширена миграцией
V006__add_session_capacity_waitlist.sql: у сессий появилсяmax_players, у участников — статус регистрации и порядок попадания в очередь; - запись через Telegram теперь добавляет игрока в основной состав при наличии мест или в лист ожидания при полном составе;
- карточки сессий показывают заполненность, основной состав и лист ожидания отдельными блоками;
- ГМ может повысить первого ожидающего игрока кнопкой в Telegram или через Web-интерфейс группы;
- RSVP-ответы, переносы и напоминания работают только с активными участниками, не трогая лист ожидания до повышения;
- Web теперь показывает занятые места, очередь ожидания, позволяет менять лимит мест и повышать игроков из ожидания;
- README и wiki обновлены под версию 1.2.0 и новый сценарий работы с лимитом мест;
- зависимости OpenTelemetry обновлены до безопасных patch-версий, чтобы сборка с warnings-as-errors не падала на NU1902.
🛡 Что это даёт
- ГМ может заранее ограничить размер партии без ручной модерации записей;
- игроки не теряются при переполненной сессии и сохраняют понятную очередь ожидания;
- основной состав, свободные места и ожидание видны в одном сообщении;
- игроки из листа ожидания не получают RSVP и ссылки на созвон до фактического повышения;
- Web и Telegram теперь отражают одинаковую модель регистрации.
📦 Версия и деплой
- версия проекта обновлена до 1.2.0 в
Directory.Build.props,compose.yaml, README, wiki и Gitea Actions workflow; - Docker-образы и deploy-конфигурация теперь используют тег 1.2.0;
- локально пройдены
dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj --collect:"XPlat Code Coverage"иdotnet build GM-Relay.slnx -c Release; - Gitea Actions run #34 успешно собрал, опубликовал и задеплоил образы после повторного запуска workflow.
Downloads
-
released this
2026-04-24 10:48:08 +03:00 | 11 commits to main since this release🧰 Dev/Runtime контур
Этот релиз закрывает задачу этапа «Этап 2 — Dev/Runtime контур»: Docker Compose теперь запускает PostgreSQL, bot и Web через обычную bridge-сеть без host networking и без заранее созданного external volume. Локальный старт стал переносимым для Windows, macOS и Linux.
✅ Закрытые issues
- #6 — chore: сделать compose-конфигурацию переносимой для локального запуска: убран
network_mode: host, сервисы переведены на обращение к PostgreSQL поdb:5432, volume БД создаётся compose-файлом, README обновлён подdocker compose up -d.
🧩 Что вошло в релиз
- bot и web подключены к обычной Docker bridge-сети
gmrelayи используют service namedbв connection string; - Web публикует порт через
GMRELAY_WEB_PORTсо значением8080по умолчанию; - PostgreSQL и Data Protection volumes стали обычными named volumes, создаваемыми при первом запуске compose;
- обязательные переменные окружения теперь валидируются compose-файлом до старта контейнеров;
- README и
.env.exampleобновлены под новый переносимый сценарий локального запуска.
🛡 Что это даёт
docker compose up -dбольше не требует ручного созданияgame_pgdata;- локальный запуск не зависит от Linux-only
network_mode: host; - bot/web используют одинаковый Docker service discovery на Linux, Windows и macOS;
- существующий volume
game_pgdataсохраняет совместимость, но больше не обязан быть external.
📦 Версия и деплой
- версия проекта обновлена до 1.1.5 в
Directory.Build.props,compose.yamlи Gitea Actions workflow; - Docker-образы и deploy-конфигурация теперь используют тег 1.1.5;
- Gitea Actions run #32 успешно собрал, опубликовал и задеплоил образы.
Downloads
- #6 — chore: сделать compose-конфигурацию переносимой для локального запуска: убран
-
released this
2026-04-24 10:27:24 +03:00 | 12 commits to main since this release🧪 Стабилизация платформы
Этот релиз закрывает ещё один пункт этапа «Стабилизация платформы»: статусы игровых сессий приведены к единой модели без устаревших значений. Теперь bot, Shared-рендеринг, Web UI и SQL-код опираются на один согласованный набор
Planned/ConfirmationSent/Confirmed/Cancelled.✅ Закрытые issues
- #5 — refactor: привести статусы сессий к единой модели без устаревших значений: удалены legacy-ветки
Recruiting/RecruitmentClosed, добавлен общий источник истины для допустимых session-status значений, а использование статусов в bot/web/shared приведено кSessionStatus.
🧩 Что вошло в релиз
SessionStatusрасширен до общего источника истины: добавлен canonical-наборAllи helper для проверки отменённых сессий;SessionBatchRendererбольше не содержит отдельную веткуRecruitmentClosedи используетSessionStatus.Cancelledдля закрытия кнопок отменённых сессий;- Web-страница группы убрана от legacy-переводов
Recruiting/RecruitmentClosed, аPlannedполучил явное отображение и стиль; - session-status SQL в bot-коде переведён с строковых литералов на параметры из
SessionStatusдля создания, отмены, списков, календаря и reschedule-потоков; - добавлены регрессионные тесты, которые фиксируют canonical-набор статусов и запрещают возврат legacy-значений в production-исходники.
🛡 Что это даёт
- UI и Telegram-рендеринг больше не расходятся в понимании жизненного цикла сессии;
- новые изменения сложнее случайно привязать к старым статусам, потому что тесты ловят такие регрессии;
- SQL-запросы, бизнес-логика и Web теперь используют одну доменную модель статусов.
📦 Версия и деплой
- версия проекта обновлена до 1.1.4 в
Directory.Build.props,compose.yamlи Gitea Actions workflow; - Docker-образы и deploy-конфигурация теперь используют тег 1.1.4.
Downloads
- #5 — refactor: привести статусы сессий к единой модели без устаревших значений: удалены legacy-ветки
-
released this
2026-04-23 21:09:19 +03:00 | 13 commits to main since this release🧪 Стабилизация платформы
Этот релиз продолжает этап «Стабилизация платформы» и закрывает задачу по тестовому покрытию ключевых сценариев бота и Web. Тестовый проект перестал быть заглушкой и теперь проверяет критичную бизнес-логику, на которой держатся расписания, RSVP и доступ в веб-интерфейсе.
✅ Закрытые issues
- #4 — Test Coverage: пустой smoke test заменён на осмысленный набор unit-тестов для парсинга
/newsession,TelegramAuthService.Verify,SessionBatchRenderer, RSVP flow (confirm/decline), переноса сессии и голосования, а также кейсов доступа к чужим группам и сессиям в Web.
🧩 Что вошло в релиз
- добавлен тестируемый парсер
NewSessionCommandParserдля разбора/newsessionи валидации дат; - вынесены правила
RsvpFlowRulesиRescheduleVoteRules, чтобы покрыть переходы состояний RSVP и голосования без хрупкой привязки к инфраструктуре; - добавлены тесты для
TelegramAuthService,SessionBatchRenderer, reschedule voting message иAuthorizedSessionService; - пакет тестов теперь покрывает ключевые bot/web-сценарии вместо одного пустого smoke test.
🛡 Что это даёт
- регрессии в расписаниях, подтверждениях участия и переносах будут ловиться до деплоя;
- изменения в Telegram auth и web-доступе теперь защищены автоматическими проверками;
- доработка бизнес-логики бота стала дешевле и безопаснее, потому что основные переходы состояний зафиксированы тестами.
📦 Версия и деплой
- версия проекта обновлена до 1.1.3 в
Directory.Build.props,compose.yamlи Gitea Actions workflow; - Docker-образы и deploy-конфигурация теперь используют тег 1.1.3.
Downloads
- #4 — Test Coverage: пустой smoke test заменён на осмысленный набор unit-тестов для парсинга