• Release v1.14.0 — Telegram Topics для расписаний
    Deploy Telegram Bot / build-and-push (push) Successful in 4m1s
    Deploy Telegram Bot / deploy (push) Successful in 12s
    Stable

    Toutsu 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.

    📦 Версия и деплой

    • версия обновлена до 1.14.0
    • Docker-образы используют тег 1.14.0
    • Gitea Actions run #165 (PR checks) — success
    • Gitea Actions run #166 (deploy) — success
    Downloads
  • Release v1.13.0 — довести RSVP и напоминания до полного набора событий
    Deploy Telegram Bot / build-and-push (push) Successful in 3m54s
    Deploy Telegram Bot / deploy (push) Successful in 13s
    Stable

    Toutsu 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, добавлен guard confirmation_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 после переноса.

    📦 Версия и деплой

    • версия обновлена до 1.13.0
    • Docker-образы используют тег 1.13.0
    • Gitea Actions run #155 (PR checks) — success
    • Gitea Actions run #156 (deploy) — success
    Downloads
  • Release v1.11.0 — Join Link in Batch Cards
    Deploy Telegram Bot / build-and-push (push) Successful in 4m12s
    Deploy Telegram Bot / deploy (push) Successful in 13s
    Stable

    Toutsu 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 — добавлено поле JoinLink
    • SessionViewItem — добавлено поле JoinLink
    • SessionBatchViewBuilder — прокидывание ссылки из DTO в ViewModel
    • CreateSessionHandler, SessionService — обновлены все вызовы конструктора
    • Все 7 SQL-запросов, загружающих SessionBatchDto, обновлены с join_link AS JoinLink
    • TelegramSessionBatchRenderer (Bot + Web) — рендеринг гиперссылки 🔗 Ссылка на игру под датой и количеством мест
    • Добавлены тесты на наличие ссылки в выводе рендерера

    🗡 Что это даёт

    • Мастер и игроки видят ссылку на игру прямо в карточке батча в Telegram.
    • Ссылка отображается под каждой датой сессии, перед списком игроков.
    • Пустая или отсутствующая ссылка скрывается автоматически.

    📦 Версия и деплой

    • версия обновлена до 1.11.0
    • Docker-образы используют тег 1.11.0
    • Gitea Actions run #150 (PR checks) — success
    • Gitea Actions run #151 (deploy) — success
    Downloads
  • Release v1.10.6 — Fix mobile NavMenu overlap
    Deploy Telegram Bot / build-and-push (push) Successful in 3m47s
    Deploy Telegram Bot / deploy (push) Successful in 11s
    Stable

    Toutsu 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.
    • Логотип больше не перекрывает кнопку меню.

    📦 Версия и деплой

    • версия обновлена до 1.10.6
    • Docker-образы используют тег 1.10.6
    • Gitea Actions run #147 (PR checks) — success
    • Gitea Actions run #148 (deploy) — success
    Downloads
  • Release v1.10.5 — New App Icon Dashboard-wide
    Deploy Telegram Bot / build-and-push (push) Successful in 3m43s
    Deploy Telegram Bot / deploy (push) Successful in 11s
    Stable

    Toutsu 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
  • Release v1.10.4 — NavMenu Icon Alignment Fix v2
    Deploy Telegram Bot / build-and-push (push) Successful in 3m42s
    Deploy Telegram Bot / deploy (push) Successful in 9s
    Stable

    Toutsu 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
  • Release v1.10.3 — NavMenu Icon Alignment Fix
    PR Checks / test-and-build (pull_request) Successful in 3m17s
    Deploy Telegram Bot / build-and-push (push) Successful in 3m47s
    Deploy Telegram Bot / deploy (push) Failing after 7s
    Stable

    Toutsu 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
  • Release v1.10.2 — Session Audit Log
    PR Checks / test-and-build (pull_request) Successful in 3m11s
    Deploy Telegram Bot / build-and-push (push) Successful in 3m52s
    Deploy Telegram Bot / deploy (push) Failing after 7s
    Stable

    Toutsu 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
  • v1.10.1 — Attendance Statistics
    Deploy Telegram Bot / build-and-push (push) Successful in 3m57s
    Deploy Telegram Bot / deploy (push) Successful in 12s
    Stable

    Toutsu released this 2026-05-07 14:33:02 +03:00 | 318 commits to main since this release

    1.10.1 — Статистика посещаемости групп

    Этот patch-релиз закрывает фичу #14: GM теперь видит агрегированную аналитику по посещаемости каждой игровой группы прямо в Web Dashboard.

    Решённые issues

    • #14 — добавить статистику посещаемости и активности игроков для GM

    🧩 Что вошло в релиз

    • PlayerAttendanceStats — новый record в GmRelay.Web.Services с метриками: TotalSessions, ConfirmedCount, DeclinedCount, NoResponseCount, WaitlistedCount, AttendanceRate, CancellationAffectedCount
    • ISessionStore.GetGroupAttendanceStatsAsync(Guid) + реализация в SessionService через SQL агрегацию по session_participants и sessions
    • GroupStats.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 в тестах синхронизирован: добавлен stub GetGroupAttendanceStatsAsync

    🛡 Что это даёт

    • 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 Release0 warnings, 0 errors
    • Gitea Actions run #131 успешно собрал и опубликовал bot/web образы
    Downloads
  • Release v1.10.0 — Platform-neutral batch rendering
    Deploy Telegram Bot / build-and-push (push) Successful in 7m24s
    Deploy Telegram Bot / deploy (push) Successful in 12s
    Stable

    Toutsu 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.Bot
    • TelegramSessionBatchRenderer в GmRelay.Bot и GmRelay.Web — рендерит HTML + InlineKeyboardMarkup из view model
    • DiscordSessionBatchRenderer — заглушка в Shared для будущего Discord MVP (#26)
    • Telegram.Bot пакет полностью убран из GmRelay.Shared.csproj
    • BatchMessageEditor перенесён из 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.csproj95 passed, 0 failed
    • локально пройден dotnet build GM-Relay.slnx -c Release0 warnings, 0 errors
    • Gitea Actions run #123 успешно собрал, опубликовал и задеплоил bot/web образы
    Downloads