• v3.2.0 7a2965b43f

    Release v3.2.0 — Platform-neutral handler extraction complete
    Deploy Telegram Bot / build-and-push (push) Successful in 6m39s
    Deploy Telegram Bot / scan-images (push) Successful in 3m26s
    Deploy Telegram Bot / deploy (push) Successful in 29s
    Stable

    Toutsu released this 2026-05-27 16:11:45 +03:00 | 139 commits to main since this release

    🛠 Minor 3.2.0 — Завершение platform-neutral архитектуры

    Все оставшиеся Telegram handlers перенесены в GmRelay.Shared с platform-neutral контрактами. Discord Bot получил parity для reschedule voting.

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

    • src/GmRelay.Shared/Features/Sessions/* — извлечены 6 shared handlers: CreateSession, ListSessions, DeleteSession, ExportCalendar, HandleRescheduleTimeInput, HandleRescheduleVote
    • src/GmRelay.Bot/Infrastructure/Telegram/TelegramPlatformMessenger.cs — новые методы SendScheduleAsync, UpdateScheduleAsync, CreateThreadAsync, DeleteThreadAsync, UpdateGroupMessageAsync
    • src/GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleVoteHandler.cs — делегирует в shared HandleRescheduleVoteHandler
    • src/GmRelay.Bot/Program.cs — hotfix: добавлены недостающие DI-регистрации для shared DeleteSessionHandler и ListSessionsHandler
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.2.0

    🗡 Что это даёт

    • Новая платформа добавляется adapter-ом, без переписывания core flow
    • Telegram и Discord routers используют единые command contracts
    • Core handlers тестируются без Telegram SDK

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

    • версия обновлена до 3.2.0
    • Docker-образы используют тег 3.2.0
    • Gitea Actions run #269 (PR checks) — success
    • Gitea Actions run #271 (deploy) — success
    Downloads
  • v3.1.1 64216f5a26

    Release v3.1.1 — Telegram topics для batch из шаблонов
    Deploy Telegram Bot / build-and-push (push) Successful in 6m3s
    Deploy Telegram Bot / scan-images (push) Successful in 3m25s
    Deploy Telegram Bot / deploy (push) Successful in 29s
    Stable

    Toutsu released this 2026-05-27 14:18:40 +03:00 | 143 commits to main since this release

    🔧 Patch 3.1.1 — Telegram topics для batch из шаблонов

    Исправлено создание batch из шаблона через Web UI: в Telegram forum-группах новая пачка игр теперь получает отдельный topic так же, как batch, созданный через /newsession.

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

    • src/GmRelay.Web/Services/SessionService.cs — Web-путь создания batch из шаблона проверяет Telegram-чат, создаёт forum topic, сохраняет thread_id/topic_created_by_bot в новых sessions и отправляет расписание в созданный topic.
    • tests/GmRelay.Bot.Tests/Infrastructure/Telegram/TelegramTopicIntegrationSmokeTests.cs — добавлен regression test на создание и сохранение Telegram topic для template batches.
    • tests/GmRelay.Bot.Tests/Discord/DiscordProjectStructureTests.cs — синхронизированы release assertions под 3.1.1.
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.1.1.

    🗡 Что это даёт

    • Batch, созданный из Web-шаблона, больше не публикуется в общий чат forum-группы.
    • Дальнейшие групповые уведомления и удаление пустого bot-owned topic работают по сохранённому thread_id.
    • Поведение Web UI стало согласовано с /newsession в Telegram.

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

    • версия обновлена до 3.1.1
    • Docker-образы используют тег 3.1.1
    • Gitea Actions run #267 (PR checks) — success
    • Gitea Actions run #268 (deploy) — success
    • PR #105 интегрирован в main через merge commit 64216f5a262048c6337f27e9422766be59e57b16
    Downloads
  • v3.1.0 bfa979a224

    Release v3.1.0 — Завершение platform migration
    Deploy Telegram Bot / build-and-push (push) Successful in 6m43s
    Deploy Telegram Bot / scan-images (push) Successful in 3m25s
    Deploy Telegram Bot / deploy (push) Successful in 30s
    Stable

    Toutsu released this 2026-05-26 17:32:07 +03:00 | 145 commits to main since this release

    🛠 v3.1.0 — Завершение platform migration

    Завершена миграция core domain с устаревших telegram_* колонок на платформенно-нейтральную модель platform + external_*.

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

    • V024__deprecate_telegram_columns.sql — backfill external_user_id/external_username/platform для players, game_groups, calendar_subscriptions; deprecation comments на legacy колонки
    • V025__reschedule_proposals_telegram_external.sql — backfill proposed_by_external_user_id для Telegram reschedule proposals
    • Убраны все COALESCE(external_*, telegram_*) fallback'и из Shared handlers
    • Bot handlers переведены на platform = 'Telegram' AND external_user_id = @X
    • Web SessionService и CalendarSubscriptionService используют только external_*
    • DiscordBot убраны COALESCE fallback'и
    • Убран legacy gm_telegram_id join в HandleRsvpHandler (заменён на group_managers)
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.1.0

    🗡 Что это даёт

    • Core domain больше не требует legacy telegram_* поля
    • Безопасный rollback: старые telegram_* данные остаются нетронутыми
    • Discord-бот и Telegram-бот работают на единой identity модели

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

    • версия обновлена до 3.1.0
    • Docker-образы используют тег 3.1.0
    • Gitea Actions run #265 (PR checks) — success
    • Gitea Actions run #266 (deploy) — success
    Downloads
  • 🔧 Patch 3.0.10 — Исправление создания сессий в Discord
    Deploy Telegram Bot / build-and-push (push) Successful in 13m30s
    Deploy Telegram Bot / scan-images (push) Successful in 3m35s
    Deploy Telegram Bot / deploy (push) Successful in 33s
    Stable

    Toutsu released this 2026-05-26 13:30:01 +03:00 | 154 commits to main since this release

    🔧 Patch 3.0.10 — Исправление создания сессий в Discord

    Discord-команда /newsession падала с ошибкой PostgreSQL NOT NULL на legacy-колонках telegram_*. Миграция V023 убирает эти ограничения, позволяя Discord (и будущим платформам) создавать записи без Telegram-идентификаторов.

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

    • src/GmRelay.Bot/Migrations/V023__game_groups_telegram_chat_id_nullable.sqlDROP NOT NULL для:
      • game_groups.telegram_chat_id
      • game_groups.gm_telegram_id
      • players.telegram_id
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml, DiscordProjectStructureTests.cs → 3.0.10

    🗡 Что это даёт

    • Discord /newsession, /reschedule, /listsessions теперь работают корректно
    • Мульти-платформенная архитектура больше не блокируется legacy-ограничениями V001

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

    • версия обновлена до 3.0.10
    • Docker-образы используют тег 3.0.10
    • Gitea Actions run #256 (PR checks) — success
    • Gitea Actions run #257 (deploy) — success
    Downloads
  • v3.0.9 a9aa84af0f

    Release v3.0.9 — исправление Dapper.AOT в Discord-боте
    Deploy Telegram Bot / build-and-push (push) Successful in 5m58s
    Deploy Telegram Bot / scan-images (push) Successful in 3m19s
    Deploy Telegram Bot / deploy (push) Successful in 35s
    Stable

    Toutsu released this 2026-05-26 12:43:46 +03:00 | 156 commits to main since this release

    🔧 Patch 3.0.9 — Исправление Dapper.AOT в Discord-боте

    Исправлена критическая ошибка FileNotFoundException: Dapper.AOT, из-за которой Discord-бот полностью не работал — scheduler падал каждую минуту, а slash-команды возвращали "💥 An error occurred".

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

    • src/GmRelay.DiscordBot/GmRelay.DiscordBot.csproj — добавлен прямой PackageReference на Dapper.AOT 1.0.48 + подавлен DAP005 analyzer (DiscordBot использует vanilla Dapper в своих хендлерах)
    • tests/.../DiscordProjectStructureTests.cs — регрессионный тест, проверяющий наличие Dapper.AOT в DiscordBot csproj
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.0.9

    🗡 Что это даёт

    • Discord-бот теперь загружается без FileNotFoundException
    • /newsession, /reschedule, /listsessions должны работать
    • Логи бота доступны через docker logs discord

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

    • версия обновлена до 3.0.9
    • Docker-образы используют тег 3.0.9
    • Gitea Actions run #254 (PR checks) — success
    • Gitea Actions run #255 (deploy) — success
    Downloads
  • v3.0.8 92d5d9c2d3

    Release v3.0.8 — исправление Discord slash-команд
    Deploy Telegram Bot / build-and-push (push) Successful in 5m56s
    Deploy Telegram Bot / scan-images (push) Successful in 3m3s
    Deploy Telegram Bot / deploy (push) Successful in 31s
    Stable

    Toutsu released this 2026-05-26 11:57:45 +03:00 | 158 commits to main since this release

    🔧 Patch 3.0.8 — Исправление ошибок Discord slash-команд

    Исправлена ошибка "💥 An error occurred while creating the session" при использовании /newsession и /reschedule в Discord.

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

    • src/GmRelay.DiscordBot/Program.cs — добавлено builder.Logging.AddConsole() для диагностики через docker logs
    • src/GmRelay.DiscordBot/Features/Sessions/DiscordNewSessionCommand.cs — отложенный ответ (deferred response) вместо прямого ответа в 3 секунды
    • src/GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleCommand.cs — отложенный ответ (deferred response) вместо прямого ответа в 3 секунды
    • tests/GmRelay.Bot.Tests/Discord/DiscordNewSessionHandlerTests.cs — обновлён тест под новый паттерн message.Embeds = embeds
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.0.8

    🗡 Что это даёт

    • Команды /newsession и /reschedule теперь работают стабильно без таймаута Discord interaction
    • Логи Discord-бота теперь видны в docker logs для быстрой диагностики

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

    • версия обновлена до 3.0.8
    • Docker-образы используют тег 3.0.8
    • Gitea Actions run #251 (PR checks) — success
    • Gitea Actions run #252 (deploy) — success
    Downloads
  • v3.0.7 11e75d036a

    Release v3.0.7 — hotfix Discord REST guild 404
    Deploy Telegram Bot / build-and-push (push) Successful in 5m52s
    Deploy Telegram Bot / scan-images (push) Successful in 3m11s
    Deploy Telegram Bot / deploy (push) Successful in 30s
    Stable

    Toutsu released this 2026-05-26 11:08:07 +03:00 | 161 commits to main since this release

    🔧 Patch 3.0.7 — Исправление создания сессий и переносов в Discord

    Исправлена ошибка 404 (Not Found). Unknown Guild., возникавшая при вызове /newsession и /reschedule в Discord.

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

    • src/GmRelay.DiscordBot/Features/Sessions/DiscordNewSessionCommand.cs — вместо REST-вызовов GetGuildAsync/GetGuildUserAsync используем GuildInteractionUser.Permissions из payload interaction (Discord уже резолвит права пользователя в канале/гильдии). Сохранён best-effort вызов GetGuildAsync только для получения OwnerId с тихим проглатыванием 404.
    • src/GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleCommand.cs — аналогичное изменение.
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml, DiscordProjectStructureTests.cs → 3.0.7

    🗡 Что это даёт

    • /newsession и /reschedule в Discord теперь работают корректно даже если бот не имеет прямого REST-доступа к гильдии

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

    • версия обновлена до 3.0.7
    • Docker-образы используют тег 3.0.7
    • Gitea Actions run #248 (PR checks) — success
    • Gitea Actions run #249 (deploy) — success
    Downloads
  • v3.0.6 549c0c96ae

    Release v3.0.6 — hotfix Dapper COUNT bigint→int cast
    Deploy Telegram Bot / build-and-push (push) Successful in 5m27s
    Deploy Telegram Bot / scan-images (push) Successful in 2m49s
    Deploy Telegram Bot / deploy (push) Successful in 31s
    Stable

    Toutsu released this 2026-05-26 10:33:46 +03:00 | 163 commits to main since this release

    🔧 Patch 3.0.6 — Исправление ошибки списка сессий в Discord

    Исправлена ошибка "A parameterless default constructor or one matching signature is required for DiscordSessionListItemDto materialization", возникавшая при вызове /listsessions на серверах Discord.

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

    • src/GmRelay.DiscordBot/Features/Sessions/DiscordListSessionsHandler.cs — добавлены PostgreSQL ::int касты к агрегатам COUNT(...), чтобы vanilla Dapper 2.1.72 мог материализовать int поля DTO (PostgreSQL COUNT() возвращает bigint)
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.0.6

    🗡 Что это даёт

    • /listsessions в Discord теперь корректно отображает список активных игр с количеством зарегистрированных игроков и вейтлиста

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

    • версия обновлена до 3.0.6
    • Docker-образы используют тег 3.0.6
    • Gitea Actions run #246 (PR checks) — success
    • Gitea Actions run #247 (deploy) — success
    Downloads
  • v3.0.5 3cc3b373e5

    🔧 Patch 3.0.5 — Исправление Discord slash-команд после рестарта бота
    Deploy Telegram Bot / build-and-push (push) Successful in 4m59s
    Deploy Telegram Bot / scan-images (push) Successful in 2m20s
    Deploy Telegram Bot / deploy (push) Successful in 28s
    Stable

    Toutsu released this 2026-05-25 18:21:32 +03:00 | 165 commits to main since this release

    🔧 Patch 3.0.5 — Исправление "This command can only be used in a guild" в Discord

    Discord slash-команды (/listsessions, /newsession, /reschedule) и кнопки сессий возвращали ошибку "This command can only be used in a guild", даже когда вызывались внутри канала сервера.

    Root cause: Context.Guild в NetCord берется из gateway client cache (cache.Guilds.GetValueOrDefault(guildId)), а не из JSON payload интеракции. После рестарта бота guild может еще не быть в кэше, и Context.Guild = null.

    Fix: Используем Context.Interaction.GuildId из payload + REST API GetGuildAsync/GetGuildUserAsync.

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

    • DiscordListSessionsCommand.csContext.Interaction.GuildId вместо Context.Guild.Id
    • DiscordNewSessionCommand.cs — REST запросы для guild/member, GetResolvedPermissions на RestGuild + GuildUser
    • DiscordRescheduleCommand.cs — аналогично
    • DiscordSessionInteractionModule.cs — фикс CreateInput для кнопок (тот же баг)
    • Добавлен null guard в GetResolvedPermissions
    • Синхронизированы версии → 3.0.5

    🗡 Что это даёт

    • Discord slash-команды и кнопки работают корректно сразу после рестарта бота, независимо от состояния gateway cache.

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

    • версия обновлена до 3.0.5
    • Docker-образы используют тег 3.0.5
    • Gitea Actions run #244 (PR checks) — success
    • Gitea Actions run #245 (deploy) — success
    Downloads
  • v3.0.4 fa63886195

    🔧 Patch 3.0.4 — Исправление регистрации Discord slash-команд
    Deploy Telegram Bot / build-and-push (push) Successful in 5m1s
    Deploy Telegram Bot / scan-images (push) Successful in 2m22s
    Deploy Telegram Bot / deploy (push) Successful in 28s
    Stable

    Toutsu released this 2026-05-25 17:32:44 +03:00 | 167 commits to main since this release

    🔧 Patch 3.0.4 — Исправление регистрации Discord slash-команд

    Discord slash-команды /newsession, /listsessions, /reschedule не появлялись в клиенте, потому что AddApplicationCommands() по умолчанию регистрирует ApplicationCommandService<ApplicationCommandContext>, а наши модули наследуют ApplicationCommandModule<SlashCommandContext>. SlashCommandContext не является наследником ApplicationCommandContext в NetCord, поэтому AddModules(Assembly) никогда не находил эти модули. Команда /ping работала, так как она minimal API.

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

    • src/GmRelay.DiscordBot/Program.cs — заменено AddApplicationCommands() на AddApplicationCommands<SlashCommandInteraction, SlashCommandContext>()
    • Синхронизированы версии: Directory.Build.props, NavMenu.razor, compose.yaml, deploy.yml → 3.0.4
    • Обновлены тестовые ассерты версии в DiscordProjectStructureTests.cs

    🗡 Что это даёт

    • Все Discord slash-команды (/newsession, /listsessions, /reschedule, /ping) теперь корректно регистрируются и доступны в Discord.

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

    • версия обновлена до 3.0.4
    • Docker-образы используют тег 3.0.4
    • Gitea Actions run #241 (PR checks) — success
    • Gitea Actions run #242 (deploy) — success
    Downloads