-
released this
2026-05-12 12:52:19 +03:00 | 288 commits to main since this release🛠 Minor 1.14.0 — Telegram Topics для расписаний
Релиз закрепляет поддержку Telegram Topics для расписаний из issue #21: расписание теперь остается в выбранной теме форума, а бот создает новую тему только при запуске
/newsessionиз корня forum-чата.✅ Решённые issues
- #21 — feat: закрепить поддержку Telegram Topics для расписаний.
🧩 Что вошло в релиз
TelegramTopicRouting— единая логика выбора topic/thread id, создания bot-owned topic и классификации ошибок прав Telegram API.CreateSessionHandler—/newsessionв существующей теме используетmessage.MessageThreadId; из корня форума создает отдельную тему и сообщает про права admin/Manage Topics при ошибке.V015__add_topic_ownership.sql— добавленоsessions.topic_created_by_bot, чтобы отличать темы бота от пользовательских.DeleteSessionHandler— удаляет только пустые bot-owned topics и не трогает выбранные пользователем темы.- Confirmation, reminders, cancel/reschedule и Web Dashboard notifications — отправляют групповые сообщения в сохраненный
thread_id. - PR checks — Trivy ставится latest, NuGet dependency scan получает
packages.lock.json, workflow падает при 0 dependency targets, Dockerfile misconfig findings исправлены. - Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml, README → 1.14.0.
🗡 Что это даёт
- ГМ может создать расписание прямо в нужной Telegram topic, и дальнейшие обновления/уведомления остаются там же.
- Если бот должен создать тему сам, нехватка прав администратора объясняется понятным сообщением.
- Удаление расписаний больше не удаляет пользовательские forum topics.
- CI теперь явно проверяет, что Trivy действительно видит dependency targets и Dockerfile config targets.
📦 Версия и деплой
Downloads
-
released this
2026-05-11 14:01:53 +03:00 | 293 commits to main since this release🛠 Minor 1.13.0 — довести RSVP и напоминания до полного набора событий
Реализован полный набор событий для RSVP и напоминаний из issue #20.
🧩 Что вошло в релиз
src/GmRelay.Bot/Infrastructure/Scheduling/ISystemClock.cs— добавлена абстракция часов + FakeSystemClock для тестов.src/GmRelay.Bot/Infrastructure/Scheduling/ISessionTriggerStore.cs— выделен интерфейс хранилища триггеров, SQL-запросы используют параметр@Nowвместоnow().src/GmRelay.Bot/Infrastructure/Scheduling/SessionSchedulerService.cs— публичныйTickAsyncдля unit-тестов, защита от дублей черезconfirmation_sent_at IS NULL.src/GmRelay.Bot/Features/Confirmation/SendConfirmation/SendConfirmationHandler.cs— записываетconfirmation_sent_at, добавлен guardconfirmation_sent_at IS NULL.src/GmRelay.Bot/Features/Sessions/RescheduleSession/RescheduleVotingDeadlineService.cs— используетISystemClock, сбрасываетconfirmation_sent_atпри переносе.src/GmRelay.Bot/Features/Sessions/RescheduleSession/HandleRescheduleTimeInputHandler.cs— сбрасываетconfirmation_sent_atпри немедленном переносе.src/GmRelay.Bot/Migrations/V014__add_confirmation_sent_at.sql— миграция БД для идемпотентности T-24h RSVP.tests/GmRelay.Bot.Tests/Infrastructure/Scheduling/SessionSchedulerServiceTests.cs— 8 unit-тестов: все триггеры, идемпотентность, обработка ошибок.- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 1.13.0
🗡 Что это даёт
- RSVP-уведомления за 24 часа теперь идемпотентны: повторный запуск worker-а не рассылает дубликаты.
- Напоминание за 1 час и ссылка перед игрой (T-5мин) проходят через тестируемый scheduler с fake clock.
- Ошибки отправки логируются без падения worker-а.
- Reschedule flow корректно сбрасывает confirmation state, позволяя повторить RSVP после переноса.
📦 Версия и деплой
Downloads
-
released this
2026-05-10 18:23:47 +03:00 | 298 commits to main since this release🛠 Minor 1.11.0 — Ссылка на игру в карточке батча
Добавлено отображение ссылки на игру (
join_link) в Telegram-карточке батча сессий.✅ Решённые issues
- #19 — feat: выровнять /newsession с batch-сценарием лендинга
🧩 Что вошло в релиз
SessionBatchDto— добавлено полеJoinLinkSessionViewItem— добавлено полеJoinLinkSessionBatchViewBuilder— прокидывание ссылки из DTO в ViewModelCreateSessionHandler,SessionService— обновлены все вызовы конструктора- Все 7 SQL-запросов, загружающих
SessionBatchDto, обновлены сjoin_link AS JoinLink TelegramSessionBatchRenderer(Bot + Web) — рендеринг гиперссылки🔗 Ссылка на игрупод датой и количеством мест- Добавлены тесты на наличие ссылки в выводе рендерера
🗡 Что это даёт
- Мастер и игроки видят ссылку на игру прямо в карточке батча в Telegram.
- Ссылка отображается под каждой датой сессии, перед списком игроков.
- Пустая или отсутствующая ссылка скрывается автоматически.
📦 Версия и деплой
Downloads
-
released this
2026-05-08 14:01:53 +03:00 | 300 commits to main since this release🔧 Patch 1.10.6 — Фикс наложения логотипа на бургер-меню в мобильной версии
Исправлен визуальный баг: на мобильных экранах (≤768px) логотип в
.nav-headerнаезжал на фиксированную кнопку бургер-меню при наведении.🧩 Что вошло в релиз
NavMenu.razor.css—.nav-header: добавленpadding-left: 3.75remв@media (max-width: 768px)- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 1.10.6
🗡 Что это даёт
- Корректное отображение шапки на мобильных устройствах и в Telegram Mini App.
- Логотип больше не перекрывает кнопку меню.
📦 Версия и деплой
Downloads
-
released this
2026-05-08 13:30:31 +03:00 | 302 commits to main since this release🎨 Patch 1.10.5 — Новый логотип на всём Dashboard
Замена emoji-иконок на новый фирменный логотип GM-Relay (золотой d20 в чат-бабле) во всех разделах Web Dashboard.
✅ Что изменено
- NavMenu — 🐢 заменён на
logo.png - Login — 🎲 заменён на
logo.png - Mini App — 🎲 заменён на
logo.png - Favicon — обновлён на новую иконку
- CSS — адаптированы стили
.nav-brand-icon,.login-logo,.mini-app-logoподobject-fit: contain
🧩 Технические детали
src/GmRelay.Web/wwwroot/logo.png— новый ассетsrc/GmRelay.Web/wwwroot/favicon.png— заменёнNavMenu.razor/Login.razor/MiniApp.razor— emoji →<img>app.css/NavMenu.razor.css— перевод размеров сfont-sizeнаwidth/height
🗡 Что это даёт
- Единый узнаваемый бренд на всех экранах веб-панели
- Подготовка к публикации Mini App в Telegram (красивая иконка)
📦 Версия и деплой
- версия обновлена до 1.10.5
- Docker-образы используют тег
1.10.5 - Gitea Actions run #146 — success
Downloads
- NavMenu — 🐢 заменён на
-
released this
2026-05-07 16:30:58 +03:00 | 305 commits to main since this release🔧 Patch 1.10.4 — Фикс выравнивания иконки в шапке (v2)
Вторая итерация фикса #47: emoji 🐢 в
.nav-brand-iconвсё ещё наезжал на текст GM-Relay при hover.✅ Решённые issues
- #47 — иконка-emoji в NavMenu наезжает на текст GM-Relay
🧩 Что вошло в релиз
NavMenu.razor.css—.nav-brand:align-items: baseline(вместо center)NavMenu.razor.css—.nav-brand-icon:vertical-align: middle; margin-top: -2px- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 1.10.4
🗡 Что это даёт
- Правильное выравнивание emoji-иконки и текста по базовой линии в шапке Web Dashboard.
📦 Версия и деплой
- версия обновлена до 1.10.4
- Docker-образы используют тег 1.10.4
- Gitea Actions run #144 — success
Downloads
-
released this
2026-05-07 16:07:16 +03:00 | 309 commits to main since this release🔧 Patch 1.10.3 — Фикс выравнивания иконки в шапке
Исправлен визуальный баг: emoji 🐢 в
.nav-brand-iconнаезжал на текстGM-Relayиз-за встроенного line-height системного шрифта emoji.✅ Решённые issues
- #47 — иконка-emoji в NavMenu наезжает на текст GM-Relay
🧩 Что вошло в релиз
NavMenu.razor.css—.nav-brand-icon:line-height: 1; display: inline-flex; align-items: center;NavMenu.razor.css—.nav-brand:gapувеличен с0.625remдо0.75rem
🗡 Что это даёт
- Правильное выравнивание иконки и текста по базовой линии в шапке Web Dashboard.
📦 Версия и деплой
- версия обновлена до 1.10.3
- Docker-образы используют тег 1.10.3
- Gitea Actions run #139 — success
Downloads
-
released this
2026-05-07 15:52:50 +03:00 | 310 commits to main since this release🛠 1.10.2 — Аудит-лог изменений сессий
Этот patch-релиз закрывает фичу #15: GM теперь видит полную историю всех значимых изменений сессии (время, ссылка, название, лимит мест, статус, участники) прямо в Web Dashboard.
✅ Решённые issues
- #15 — сохранять историю изменений сессии для анализа активности
🧩 Что вошло в релиз
SessionAuditLogEntry— доменная модель записи аудита.- Таблица
session_audit_log+ миграцияV013. ISessionStore.LogSessionChangeAsync/GetSessionHistoryAsync— логирование и чтение.- Инструментирование
AuthorizedSessionService:UpdateSessionForGmAsync,PromoteWaitlistedPlayerForGmAsync,RescheduleBatchForGmAsync,RemovePlayerFromSessionForGmAsync— все пишут аудит. SessionHistory.razor— страница/session/{id}/historyс таблицей, бейджами типов изменений и навигацией.- Ссылки "История" добавлены в
GroupDetails.razor(desktop + mobile). - Тесты: 4 новых unit-теста на аудит-лог в
AuthorizedSessionServiceTests.
🛡 Что это даёт
- Прозрачность: GM видит кто, когда и что менял в сессии.
- Отладка: легко отследить последствия случайных изменений.
- Аналитика: исторические данные для будущих фич (например, частота переносов).
📦 Версия и деплой
- версия обновлена до 1.10.2
- Docker-образы используют тег 1.10.2
- локально пройдены
dotnet test— 106 passed, 0 failed - Gitea Actions run #137 — success
Downloads
-
released this
2026-05-07 14:33:02 +03:00 | 318 commits to main since this release1.10.1 — Статистика посещаемости групп
Этот patch-релиз закрывает фичу #14: GM теперь видит агрегированную аналитику по посещаемости каждой игровой группы прямо в Web Dashboard.
✅ Решённые issues
- #14 — добавить статистику посещаемости и активности игроков для GM
🧩 Что вошло в релиз
PlayerAttendanceStats— новый record вGmRelay.Web.Servicesс метриками: TotalSessions, ConfirmedCount, DeclinedCount, NoResponseCount, WaitlistedCount, AttendanceRate, CancellationAffectedCountISessionStore.GetGroupAttendanceStatsAsync(Guid)+ реализация вSessionServiceчерез SQL агрегацию поsession_participantsиsessionsGroupStats.razor— новая страница/group/{id}/statsс сортируемой таблицей итоговой статистики по игрокам (по всем столбцам, ASC/DESC)- Цветные бейджи посещаемости на странице: зелёный (≥80%), жёлтый (50-79%), красный (<50%)
- Кнопка «📊 Статистика посещаемости» добавлена на странице группы (
GroupDetails.razor) - SQL query считает: TotalSessions = COUNT(DISTINCT s.id), Confirmed = COUNT(rsvp=Confirmed), Declined = COUNT(rsvp=Declined), Pending = COUNT(rsvp=Pending), Waitlisted = COUNT(registration_status=Waitlisted), CancellationAffected = COUNT(отменённые/перенесённые сессии с ответом игрока)
FakeSessionStoreв тестах синхронизирован: добавлен stubGetGroupAttendanceStatsAsync
🛡 Что это даёт
- GM видит рейтинг надёжности состава: кто регулярно подтверждает, кто часто отклоняет, кто не отвечает
- Помогает принимать решения о составе: высокий no-response rate = сигнал напомнить о правилах RSVP
- Прозрачная статистика по вейтлисту: сколько раз игрок не попал в основной состав
- Нет breaking changes: существующие группы и сессии работают без миграции
📦 Версия и деплой
- версия проекта обновлена до 1.10.1 в
Directory.Build.props,compose.yamlи Gitea Actions workflow - Docker-образы и deploy-конфигурация используют тег 1.10.1
- локально пройден
dotnet build GM-Relay.slnx -c Release— 0 warnings, 0 errors - Gitea Actions run #131 успешно собрал и опубликовал bot/web образы
Downloads
-
released this
2026-05-06 12:32:47 +03:00 | 345 commits to main since this release🏗 1.10.0 — Platform-neutral рендеринг расписаний
Этот minor-релиз — архитектурный рефакторинг: рендеринг расписаний из Shared вынесен в platform-specific adapters, готовя кодовую базу к Discord MVP.
✅ Решённые issues
- #22 — вынести platform-agnostic рендеринг из SessionBatchRenderer
🧩 Что вошло в релиз
SessionBatchViewModel+SessionBatchViewBuilderвGmRelay.Shared.Rendering— platform-neutral view model без зависимости от Telegram.BotTelegramSessionBatchRendererвGmRelay.BotиGmRelay.Web— рендерит HTML + InlineKeyboardMarkup из view modelDiscordSessionBatchRenderer— заглушка в Shared для будущего Discord MVP (#26)Telegram.Botпакет полностью убран изGmRelay.Shared.csprojBatchMessageEditorперенесён из Shared в Bot и Web (с комментарием// NOTE: duplicatedдля последующего refactoring)- Все вызовы обновлены: 7 handler-ов в Bot + 3 места в Web
SessionService - Старый
SessionBatchRendererи его тесты удалены - Новые тесты:
SessionBatchViewBuilderTestsиTelegramSessionBatchRendererTestsс parity-проверкой - ADR-002 добавлен: Platform-neutral batch rendering decision record
- Wiki обновлена: раздел «Архитектура» отражает новый rendering pipeline
🛡 Что это даёт
- Shared-слой больше не зависит от Telegram-типов — шаг к мультиплатформенности
- Чистая архитектура: сборка данных (view model) отделена от их отрисовки (renderer)
- Легче добавить Discord-рендерер: достаточно реализовать интерфейс renderer'а
- Нет breaking changes для API Telegram-бота и Web Dashboard
📦 Версия и деплой
- версия проекта обновлена до 1.10.0 в
Directory.Build.props,compose.yaml, README, Web UI badge и Gitea Actions workflow - Docker-образы и deploy-конфигурация используют тег 1.10.0
- локально пройдены
dotnet test tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj— 95 passed, 0 failed - локально пройден
dotnet build GM-Relay.slnx -c Release— 0 warnings, 0 errors - Gitea Actions run #123 успешно собрал, опубликовал и задеплоил bot/web образы
Downloads