-
released this
2026-05-25 17:32:44 +03:00 | 183 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
-
released this
2026-05-25 16:47:55 +03:00 | 186 commits to main since this release🔧 Patch 3.0.3 — Slash-команды Discord modules
Доведен до конца фикс issue #94: после v3.0.2 Discord все еще показывал только
/ping, потому что NetCord module-команды были объявлены с[SlashCommand]на классе, а не на методе.🧩 Что вошло в релиз
src/GmRelay.DiscordBot/Features/Sessions/DiscordNewSessionCommand.cs—[SlashCommand("newsession", ...)]перенесен наExecuteAsyncsrc/GmRelay.DiscordBot/Features/Sessions/DiscordListSessionsCommand.cs—[SlashCommand("listsessions", ...)]перенесен наExecuteAsyncsrc/GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleCommand.cs—[SlashCommand("reschedule", ...)]перенесен наExecuteAsynctests/GmRelay.Bot.Tests/Discord/DiscordStartupTests.cs— regression-тесты на method-level attributes и реальное обнаружение команд черезApplicationCommandService<SlashCommandContext>.AddModules(assembly)- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 3.0.3
🗡 Что это даёт
/newsession,/listsessionsи/rescheduleтеперь регистрируются NetCord как отдельные slash-команды- Discord должен показывать эти команды в slash-меню рядом с
/pingпосле обновления команд Discord - Тесты теперь ловят оба условия: корректное место атрибута и фактическое обнаружение команд NetCord service
📦 Версия и деплой
Downloads
-
released this
2026-05-25 16:16:06 +03:00 | 188 commits to main since this release🔧 Patch 3.0.2 — Регистрация slash-команд Discord
Исправлена проблема, из-за которой в тестовой Discord-группе работал только
/ping, а/newsession,/listsessionsи/rescheduleне появлялись как настоящие slash-команды Discord.🧩 Что вошло в релиз
src/GmRelay.DiscordBot/Program.cs— добавлена регистрация NetCord application command modules черезhost.AddModules(typeof(Program).Assembly)после создания hosttests/GmRelay.Bot.Tests/Discord/DiscordStartupTests.cs— regression-тест на регистрацию module-based slash-командREADME.md— убрана неиспользуемая переменнаяDISCORD_BOT_CLIENT_ID; Discord worker требуетDISCORD_BOT_TOKEN, аDISCORD_CLIENT_IDотносится к Web Dashboard OAuthtests/GmRelay.Bot.Tests/Discord/DiscordProjectStructureTests.cs— тест на актуальность Discord env-документации- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 3.0.2
🗡 Что это даёт
/newsession,/listsessionsи/rescheduleрегистрируются вместе с/pingпри старте Discord worker- Discord больше не должен воспринимать эти команды как обычный текст, если bot приглашён со scope
applications.commands - Документация больше не уводит диагностику в неиспользуемый client id для slash-команд
📦 Версия и деплой
Downloads
-
released this
2026-05-25 15:35:53 +03:00 | 190 commits to main since this release🔧 Patch 3.0.1 — Исправление привязки Discord↔Telegram
Исправлена критическая ошибка привязки аккаунтов Discord и Telegram, при которой игры из Telegram-аккаунта становились недоступны после связывания.
🧩 Что вошло в релиз
src/GmRelay.Web/Program.cs—SameSite=Laxдля auth cookie (вместо Strict), что позволяет Discord OAuth callback видеть существующую Telegram-сессию и создавать привязку вместо новой Discord-сессииsrc/GmRelay.Web/Program.cs—/auth/telegramendpoint теперь тоже поддерживает linking (Discord → Telegram через Telegram Login Widget)src/GmRelay.Web/Components/Pages/Profile.razor— Telegram Login Widget для Discord-пользователей + plain HTML-ссылка «Привязать Discord» вместо кнопки сforceLoad(устраняет обрыв Blazor circuit)src/GmRelay.Web/Program.cs— при linking через Telegram Login Widget Telegram всегда становится primary-аккаунтом (сохраняет доступ к историческим группам/играм)src/GmRelay.Bot/Migrations/V021__add_avatar_url.sql— добавлена колонкаavatar_urlв таблицуplayerssrc/GmRelay.Bot/Migrations/V022__fix_discord_telegram_links.sql— миграция для разворота на проде существующих неправильно ориентированныхplayer_linkstests/GmRelay.Bot.Tests/Web/CookieAuthOptionsTests.cs— тест наSameSiteMode.Lax- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 3.0.1
🗡 Что это даёт
- Единый профиль для Telegram и Discord — игры из обеих платформ видны в одном месте
- Discord-пользователи могут привязать Telegram через Login Widget в
/profile - Telegram-пользователи могут привязать Discord через «Привязать Discord» в
/profile - Больше нет обрыва Blazor circuit при нажатии на кнопку привязки
📦 Версия и деплой
- версия обновлена до 3.0.1
- Docker-образы используют тег 3.0.1
- Gitea Actions run (deploy main) — success
Downloads
-
released this
2026-05-25 14:16:08 +03:00 | 195 commits to main since this release🚀 Major 3.0.0 — Связка Telegram и Discord identity
Реализована единая мультиплатформенная модель аккаунта: один пользователь может связать Telegram и Discord identity без дублирования игрока/мастера.
🧩 Что вошло в релиз
src/GmRelay.Bot/Migrations/V020__player_identity_links.sql— таблицыplayer_links(secondary → primary) иidentity_audit_logsrc/GmRelay.Web/Services/SessionService.cs— резолв effective player id для всех permission-методов, методыLinkIdentity/UnlinkIdentity/GetLinkedIdentitiessrc/GmRelay.Web/Program.cs— Discord callback автоматически делает linking при уже аутентифицированном пользователе, endpoints/api/me/identitiessrc/GmRelay.Web/Components/Pages/Profile.razor— страница управления связанными аккаунтамиsrc/GmRelay.Web/Components/Layout/NavMenu.razor— ссылка на профиль, версия v3.0.0- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 3.0.0
🔧 Hotfix
- Исправлена загрузка профиля:
Profile.razorтеперь используетISessionStoreнапрямую вместоHttpClient(избегает 302 redirect от отсутствия cookie в Blazor Server interactive mode) - Привязка Discord через
forceLoad: trueдля обхода Blazor circuit navigation
🗡 Что это даёт
- Пользователь может управлять группами и сессиями из любой связанной платформы
- Нельзя незаметно захватить чужую identity (conflict detection + audit trail)
- Единый dashboard для всех platform identities
📦 Версия и деплой
Downloads
-
released this
2026-05-25 12:22:17 +03:00 | 203 commits to main since this release🛠 Patch 2.8.0 — Discord OAuth и платформонезависимый Web Dashboard
Реализован Discord OAuth 2.0 login flow для Web Dashboard (issue #34) и рефакторен слой авторизации на платформонезависимую модель. Discord- и Telegram-аккаунты полностью разделены — никакой связи между ними.
🧩 Что вошло в релиз
src/GmRelay.Web/Services/DiscordAuthService.cs— Discord OAuth Authorization Code Flow сidentify+guildsscopessrc/GmRelay.Web/Program.cs— endpoints/auth/discordи/auth/discord/callbackс CSRF-защитой через state-cookiesrc/GmRelay.Web/Services/ClaimsPrincipalExtensions.cs— платформонезависимая идентификация(platform, external_user_id)src/GmRelay.Web/Services/AuthorizedSessionService.cs— все методы переведены на*ForCurrentUserAsyncsrc/GmRelay.Web/Components/Pages/*.razor— Razor Pages обновлены для поддержки Discord и Telegram пользователейsrc/GmRelay.Bot/Migrations/V019__audit_log_platform_identity.sql— миграция audit log на platform-agnostic identity- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 2.8.0
🗡 Что это даёт
- Владельцы Discord-серверов и co-GM могут авторизоваться в Web Dashboard через Discord OAuth
- Dashboard показывает только группы и сессии, доступные текущему пользователю, независимо от платформы
- Telegram Login Widget продолжает работать как раньше
📦 Версия и деплой
Downloads
-
released this
2026-05-21 18:00:48 +03:00 | 224 commits to main since this release🧪 Patch 2.7.2 — Регрессионные тесты platform rendering и Discord MVP
Добавлены регрессионные тесты для платформенно-нейтрального рендеринга и базового Discord-флоу, чтобы защитить Telegram parity и Discord MVP от случайных регрессий.
🧩 Что вошло в релиз
SessionBatchViewBuilderTests.cs— 3 теста на edge-cases семантической модели (пустые сессии, confirmed-статус, null max-players)TelegramSessionBatchRendererTests.cs— 5 тестов на parity Telegram-рендерера (HTML-кодирование, confirmed-кнопки, отсутствие join-ссылки)DiscordSessionBatchRendererTests.cs— 4 теста на Discord embed/button states (синий confirmed, пустой список игроков, inline-поля, URL embed)DiscordLandingPromisesSmokeTests.cs— сквозной smoke-тест Discord MVP (join/leave/waitlist → RSVP → reschedule voting → DM notifications → dashboard sync) через FakeDiscordMessenger без реального Discord APIDirectory.Build.props,compose.yaml,.gitea/workflows/deploy.yml,NavMenu.razor— версия синхронизирована до 2.7.2
🗡 Что это даёт
- Любое изменение текста/кнопок в Telegram или Discord рендерерах теперь ломает тесты — проблема обнаруживается до merge
- Discord MVP interaction flow можно проверять локально без Discord API credentials
- Семантическая модель
SessionBatchViewBuilderзащищена от случайных изменений
📦 Версия и деплой
Downloads
-
released this
2026-05-21 14:59:46 +03:00 | 230 commits to main since this release🔧 Patch 2.7.1 — Завершение compose/deploy wiring для Discord bot
Завершает инфраструктурную обвязку Discord worker, запущенную в рамках issue #32.
🧩 Что вошло в релиз
.env.example— добавленDISCORD_BOT_TOKEN.src/GmRelay.DiscordBot/Dockerfile— добавленwgetдля healthcheck.src/GmRelay.DiscordBot/Infrastructure/Health/DiscordHealthCheckHostedService.cs— health check endpoint на порту 8082.src/GmRelay.DiscordBot/Program.cs— зарегистрированDiscordHealthCheckHostedService.compose.yaml— добавлен healthcheck для сервисаdiscord.- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 2.7.1.
🗡 Что это даёт
- Discord bot теперь имеет полноценный healthcheck и деплоится наравне с Telegram bot и Web dashboard.
docker compose up -dкорректно поднимает все три сервиса с проверкой здоровья.
📦 Версия и деплой
Downloads
-
released this
2026-05-21 12:50:59 +03:00 | 238 commits to main since this release🛠 Minor 2.7.0 — Platform-aware scheduler notifications
Релиз закрывает issue #31: scheduler, RSVP, confirmation и reminder flows больше не завязаны напрямую на Telegram API и отправляют platform-specific уведомления через общий
IPlatformMessenger.✅ Решённые issues
- #31 — refactor: перевести scheduler и уведомления на IPlatformMessenger
🧩 Что вошло в релиз
src/GmRelay.Shared/Infrastructure/Scheduling/— общийSessionSchedulerService,ISessionTriggerStoreиPlatformSchedulerOptionsс фильтрацией по платформе.src/GmRelay.Shared/Features/Confirmation/иsrc/GmRelay.Shared/Features/Reminders/— shared handlers для RSVP, confirmation, one-hour reminder и join-link уведомлений.src/GmRelay.Shared/Features/Notifications/PlatformDirectNotificationSender.cs— единая отправка direct session notifications через platform messenger.src/GmRelay.Shared/Platform/— расширены notification contracts и semantic methods вIPlatformMessenger.src/GmRelay.Bot/Infrastructure/Telegram/TelegramPlatformMessenger.cs— Telegram adapter сохраняет существующее поведение для confirmation, reminders, join links, direct notifications и reschedule vote updates.src/GmRelay.DiscordBot/Infrastructure/Discord/DiscordPlatformMessenger.cs— Discord adapter получил MVP-поддержку confirmation, join-link/direct notifications и обновления reschedule voting messages.src/GmRelay.DiscordBot/Features/Sessions/DiscordSessionInteractionModule.cs— Discord RSVP component interaction подключён к sharedHandleRsvpHandler.- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,.gitea/workflows/deploy.yml,README.md→2.7.0.
🛡 Что это даёт
- Scheduler больше не зависит от Telegram API types.
- Telegram уведомления сохраняют прежнюю семантику и topic/thread routing.
- Discord получает расширяемую точку для scheduler notifications без переписывания фоновых сервисов.
- Reschedule deadline services обновляют platform messages через messenger abstraction.
📦 Версия и деплой
Downloads
-
released this
2026-05-20 13:21:31 +03:00 | 242 commits to main since this release🛠 Patch 2.6.0 — Голосование за перенос сессий в Discord
Реализовано полноценное голосование за перенос сессий через Discord interactions. GM может инициировать голосование с 2–3 вариантами времени и дедлайном, игроки голосуют кнопками, а по истечении дедлайна результат применяется автоматически.
🧩 Что вошло в релиз
V018__discord_reschedule_proposals.sql— колонкиsource_platformиproposed_by_external_user_idвreschedule_proposalsGmRelay.Shared/Features/Sessions/RescheduleSession/— выделены платформенно-нейтральные типы (RescheduleVoteRules,RescheduleVotingInput,RescheduleDtos,RescheduleVotingFinalizer)GmRelay.Bot/RescheduleVotingDeadlineService.cs— рефакторинг подRescheduleVotingFinalizer, фильтрация поsource_platform = 'Telegram'GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleCommand.cs— slash-команда/rescheduleGmRelay.DiscordBot/Features/Sessions/DiscordRescheduleVoteHandler.cs— обработка голосований по кнопкамGmRelay.DiscordBot/Features/Sessions/DiscordRescheduleVotingDeadlineService.cs— фоновый сервис финализации голосованийGmRelay.DiscordBot/Rendering/DiscordRescheduleVotingRenderer.cs— рендеринг embed и кнопок- Синхронизированы версии:
Directory.Build.props,NavMenu.razor,compose.yaml,deploy.yml→ 2.6.0
🗡 Что это даёт
- Discord-пользователи могут полноценно голосовать за перенос сессий без Telegram/Web
- Автоматическое применение результата по дедлайну
- Telegram flow остаётся неизменным — нет регрессий
📦 Версия и деплой
Downloads