-
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, HandleRescheduleVotesrc/GmRelay.Bot/Infrastructure/Telegram/TelegramPlatformMessenger.cs— новые методыSendScheduleAsync,UpdateScheduleAsync,CreateThreadAsync,DeleteThreadAsync,UpdateGroupMessageAsyncsrc/GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleVoteHandler.cs— делегирует в sharedHandleRescheduleVoteHandlersrc/GmRelay.Bot/Program.cs— hotfix: добавлены недостающие DI-регистрации для sharedDeleteSessionHandlerи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
📦 Версия и деплой
Downloads
-
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.
📦 Версия и деплой
Downloads
-
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— backfillexternal_user_id/external_username/platformдляplayers,game_groups,calendar_subscriptions; deprecation comments на legacy колонкиV025__reschedule_proposals_telegram_external.sql— backfillproposed_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_idjoin вHandleRsvpHandler(заменён наgroup_managers) - Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 3.1.0
🗡 Что это даёт
- Core domain больше не требует legacy
telegram_*поля - Безопасный rollback: старые
telegram_*данные остаются нетронутыми - Discord-бот и Telegram-бот работают на единой identity модели
📦 Версия и деплой
Downloads
-
released this
2026-05-26 13:30:01 +03:00 | 154 commits to main since this release🔧 Patch 3.0.10 — Исправление создания сессий в Discord
Discord-команда
/newsessionпадала с ошибкой PostgreSQLNOT NULLна legacy-колонкахtelegram_*. Миграция V023 убирает эти ограничения, позволяя Discord (и будущим платформам) создавать записи без Telegram-идентификаторов.🧩 Что вошло в релиз
src/GmRelay.Bot/Migrations/V023__game_groups_telegram_chat_id_nullable.sql—DROP NOT NULLдля:game_groups.telegram_chat_idgame_groups.gm_telegram_idplayers.telegram_id
- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml,DiscordProjectStructureTests.cs→ 3.0.10
🗡 Что это даёт
- Discord
/newsession,/reschedule,/listsessionsтеперь работают корректно - Мульти-платформенная архитектура больше не блокируется legacy-ограничениями V001
📦 Версия и деплой
Downloads
-
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.AOT1.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
📦 Версия и деплой
Downloads
-
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 logssrc/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для быстрой диагностики
📦 Версия и деплой
Downloads
-
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-доступа к гильдии
📦 Версия и деплой
Downloads
-
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 (PostgreSQLCOUNT()возвращаетbigint)- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 3.0.6
🗡 Что это даёт
/listsessionsв Discord теперь корректно отображает список активных игр с количеством зарегистрированных игроков и вейтлиста
📦 Версия и деплой
Downloads
-
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 APIGetGuildAsync/GetGuildUserAsync.🧩 Что вошло в релиз
DiscordListSessionsCommand.cs—Context.Interaction.GuildIdвместоContext.Guild.IdDiscordNewSessionCommand.cs— REST запросы для guild/member,GetResolvedPermissionsнаRestGuild+GuildUserDiscordRescheduleCommand.cs— аналогичноDiscordSessionInteractionModule.cs— фиксCreateInputдля кнопок (тот же баг)- Добавлен null guard в
GetResolvedPermissions - Синхронизированы версии → 3.0.5
🗡 Что это даёт
- Discord slash-команды и кнопки работают корректно сразу после рестарта бота, независимо от состояния gateway cache.
📦 Версия и деплой
Downloads
-
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.
📦 Версия и деплой
Downloads