feat(discord): полностью привести /newsession wizard к Telegram-флоу (Format, Location, публикация) #142
Open
opened 2026-06-15 16:40:56 +03:00 by Toutsu
·
3 comments
No Branch/Tag Specified
main
feature-discord-wizard-telegram-parity
fix/deploy-trivy-image-timeout
fix/deploy-scan-pull-images
feature/telegram-game-card-fields
feature/issue-136-wizard-format-location
fix/issue-135-wizard-publish-schedule
fix/issue-133-on-conflict-inference
fix/issue-130-no-limit-complete
fix/issue-129-libgssapi
fix/issue-127-wizard-capacity-club
fix/issue-125-test-cleanup
fix/issue-123-no-limit-wizard
feat/issue-112-wizard-refactor
feat/issue-111-game-creation-wizard
fix/issue-110-showcase-500
feat/issue-110-private-club-showcases
codex/feature-issue-108-portfolio
feat/profile-design-system
codex/fix-public-pages-500
feature/issue-40-master-profiles
feature/issue-39-game-catalog
codex/feature/issue-38-public-club-pages
refactor/issue-37-platform-neutral-handlers
codex/fix-template-topic-release
refactor/issue-36-platform-migration
fix/discord-nullable-telegram-columns
fix/discord-dapper-aot-missing
fix/discord-console-logging-deferred
fix/discord-guildinteractionuser-permissions
fix/discord-count-bigint-cast
fix/discord-slash-commands-guild-context
fix/discord-slash-command-registration
feature/issue-35-identity-linking
fix/discord-oauth-diagnostics
feature/issue-34-discord-oauth-dashboard
test/issue-33-regression-tests
chore/issue-32-discord-compose-wiring
codex/issue-31-platform-messenger-scheduler
feature/discord-reschedule-voting
codex/feature-issue-29-discord-join-leave
feature/issue-28-discord-newsession-listsessions
feature/issue-27-discord-session-batch-renderer
feature/issue-26-discord-netcord-gateway
codex/refactor-issue-25-platform-neutral-join-leave
feature/dashboard-design-refresh
feature/issue-58-health-checks
feature/issue-23-platform-identity
fix/issue-60-add-license
feature/issue-57-postgresql-backup
feature/trivy-security-scan
codex/feature/issue-21-telegram-topics
feature/issue-20-rsvp-reminders
feature/issue-15-session-audit-log
feature/issue-19-batch-join-link
fix/navmenu-mobile-overlap
feature/new-logo
issue-47-navmenu-icon-fix
issue-15-session-audit-log
issue-14-attendance-stats
issue-22-neutral-rendering
codex/ftest-telegram-landing-smoke
feat/player-list-kick-waitlist
codex/co-gm-delegation
v3.11.2
v3.11.1
v3.11.0
v3.10.0
v3.9.9
v3.9.8
v3.9.7
v3.9.6
v3.9.5
v3.9.4
v3.9.3
v3.9.2
v3.9.1
v3.9.0
v3.8.0
v3.7.1
v3.7.0
v3.6.0
v3.5.1
v3.5.0
v3.4.0
v3.3.0
v3.2.0
v3.1.1
v3.1.0
v3.0.10
v3.0.9
v3.0.8
v3.0.7
v3.0.6
v3.0.5
v3.0.4
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v2.8.0
v2.7.2
v2.7.1
v2.7.0
v2.6.0
v2.5.0
v2.4.0
v2.3.0
v2.2.0
v2.1.1
v2.1.0
v2.0.1
v2.0.0
v1.15.1
v1.15.0
v1.14.0
v1.13.0
v1.11.0
v1.10.6
v1.10.5
v1.10.4
v1.10.3
v1.10.2
v1.10.1
v1.10.0
v1.9.9
v1.9.8
v1.9.7
v1.9.6
v1.9.5
v1.9.4
v1.9.3
v1.9.2
v1.9.1
v1.9.0
v1.8.2
v1.8.1
v1.8.0
v1.7.0
v1.6.0
v1.5.0
v1.4.1
v1.4.0
v1.3.0
v1.2.0
v1.1.5
v1.1.4
v1.1.3
v1.1.2
v1.1.1
v1.1.0
v1.0.1
v1.0.0
Labels
Clear labels
area:bot
area:data
area:discord
area:infra
area:miniapp
area:platform
area:shared
area:web
in-progress
next-up
pending-approval
platform:discord
platform:multi
platform:telegram
priority:p0
priority:p0
priority:p1
priority:p2
priority:p3
security
type:bug
type:chore
type:feature
type:refactor
type:test
Telegram bot and worker logic
Database schema, migrations and persistence model
Discord bot service and Discord adapter
Infrastructure, runtime and deployment
Telegram Mini App dashboard
Platform-neutral abstractions and adapter boundaries
Shared domain and rendering contracts
Blazor web dashboard
В работе (issue взят агентом)
Recommended immediate backlog
Ждёт согласования плана решения
Discord-specific behavior or adapter work
Cross-platform or platform-neutral work
Telegram-specific behavior or adapter work
Critical priority
Блокирующий приоритет: задача должна быть выполнена до признания решения production-ready
High priority
Medium priority
Lower priority
Security-sensitive work
Bug fix or corrective work
Maintenance and supporting work
New product functionality
Structural change without direct feature growth
Testing and coverage work
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Toutsu/GmRelayBot#142
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
Discord-визард создания игры (
/newsession-wizard) сейчас пропускает ключевые шаги, которые есть в Telegram-визарде (/newsession). В результате создаётся сессия по старому маршруту без новых полей:CreateSessionCommandполяLink,Format,LocationAddressзахардкожены пустыми/null;/newsession-wizardвместо/newsession.Цель
Сделать Discord-путь создания игры полностью идентичным Telegram:
/newsessionзапускает пошаговый визард.Link,Format,LocationAddress) корректно сохраняются в БД.Связанные задачи
Acceptance criteria
/newsessionзапускает wizard, старый прямой/newsessionудалён/переименован.Format(Online/Offline) иLocation(ссылка или адрес).DiscordWizardSubmitter.BuildCommandпередаётLink,Format,LocationAddressаналогично Telegram.DiscordWizardSubmitter.IsCompleteпроверяет Format и Location, и разрешаетMaxPlayers = null(без лимита).batch_message_id.Контекст для исполнителя
GameCreationWizardвGmRelay.Sharedуже умеетFormat/Location— править не нужно.DiscordWizardStep.csсейчас не знает шагиFormatиLocation.DiscordWizardInteractionModule.csимеетStepsThatOpenModal— туда нужно добавитьLocation.DiscordPlatformMessenger.SendScheduleAsyncуже реализован,CreateThreadAsync— stub (для Discord не нужен thread).DiscordWizardSubmitterсейчас не принимаетIPlatformMessenger/NpgsqlDataSourceдля публикации.Предлагаемое решение
Использовать план, подготовленный для этой задачи. После утверждения плана — создать ветку
feature/discord-wizard-telegram-parity, реализовать по плану и открыть PR.План готов. Жду подтверждения перед стартом реализации.
План приведения Discord /newsession к Telegram-флоу
1. Переименование команды и удаление старого прямого
/newsessionsrc/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardCommand.cs:47—SlashCommand("newsession-wizard", ...)→SlashCommand("newsession", ...). Обновить XML-doc и сообщения, где упоминается/newsession-wizard.src/GmRelay.DiscordBot/Features/Sessions/DiscordNewSessionCommand.cs:19—SlashCommand("newsession", ...)→SlashCommand("newsession-legacy", ...)(или удалить модуль, если решим оставить только wizard). Предлагаю переименовать вnewsession-legacy, чтобы сохранитьDiscordNewSessionHandlerдля тестов/обратной совместимости.tests/GmRelay.Bot.Tests/Discord/DiscordStartupTests.cs:57,85— заменить ожиданиеnewsessionнаnewsession-legacyи добавитьnewsessionдля wizard-команды.DiscordWizardInteractionModule.cs— сообщения "запустите /newsession-wizard" → "/newsession".2. Добавление шагов
FormatиLocationв Discord-рендерерФайл
src/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardStep.cs:Renderswitch добавить:RenderFormat():RenderLocation(WizardPayload p):BuildModalдобавить:BuildConfirmDescriptionиBuildPoolConfirmDescriptionдобавить формат/ссылку/адрес — скопировать логикуWizardStepViewBuilder.AppendFormatLocation.3. Диспетчер взаимодействий — открытие модала
Файл
src/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardInteractionModule.cs:StepsThatOpenModalдобавитьWizardStepNames.Location.wizard:btn:choice:Format:online/offlineуже работает через общийWizardCallbackData.Choice— изменений не требуется.wizard:modal:Locationмаппится наWizardStepNames.Locationавтоматически (последний case вMapModalStepToWizardStep).4. Исправление
DiscordWizardSubmitterФайл
src/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardSubmitter.cs:IPlatformMessenger platformMessengerиNpgsqlDataSource dataSource.BuildCommand— заменить хардкод на:IsComplete— привести к Telegram:SubmitAsync— после успешного_shared.HandleAsyncвызывать публикацию (аналогPublishCreatedSessionAsyncв Telegram).5. Публикация созданной сессии в канал Discord
Новый приватный метод в
DiscordWizardSubmitter:Примечание:
CreateThreadAsyncдля Discord — stub, thread не используем.6. Тесты
tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardStepFormatLocationRenderTests.cs— новый файл:RenderFormat_ContainsOnlineAndOfflineButtonsRenderLocation_WhenOnline_OpensModalWithLinkPromptRenderLocation_WhenOffline_OpensModalWithAddressPromptBuildModal_Location_Online_ContainsLinkInputtests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardSubmitterBuildCommandTests.cs— дополнить:BuildCommand_WhenOnline_PropagatesLinkAndFormatBuildCommand_WhenOffline_PropagatesLocationAddressAndFormatBuildCommand_WhenOnlineWithoutLink_LeavesLinkEmptytests/GmRelay.Bot.Tests/Discord/DiscordWizardInteractionModuleSourceTests.cs— добавить:StepsThatOpenModal_ContainsLocationtests/GmRelay.Bot.Tests/Discord/DiscordStartupTests.cs— обновить имена команд (newsessionдля wizard,newsession-legacyдля старого).7. Версия и CI/CD
Directory.Build.props—<Version>3.11.0</Version>→3.12.0..gitea/workflows/deploy.yml—VERSION: 3.11.0→3.12.0.compose.yaml— теги образов3.11.0→3.12.0.src/GmRelay.Web/Components/Layout/NavMenu.razor:85—v3.11.0→v3.12.0.8. Верификация
Команды для локальной проверки:
Открытые вопросы
/newsession: оставляем как/newsession-legacy(минимальные изменения) или полностью удаляем модуль и handler? Предлагаю переименовать, чтобы не ломать существующие тестыDiscordNewSessionHandlerTests.PoolSystemDurationидёт сразу к слотам, а Format/Location добавляются послеCapacityв single-флоу. Telegram пул делает Format/Location после общих параметров. Нужно ли менять порядок пула? (Предлагаю — да, привести к Telegram, но это требует изменений вGameCreationWizardпул-ветке; обсудить отдельно.)Если утверждаешь план, начну ветку
feature/discord-wizard-telegram-parityи реализацию.Уточнения по пулу, версии и legacy получены. Финальный план зафиксирован.
Финальный план реализации
Решения
/newsession(DiscordNewSessionCommand+DiscordNewSessionHandler) полностью удаляем./newsession(бывший/newsession-wizard).Capacity→Format→Locationперед слотами.README.mdобновляется:/newsession-wizard→/newsession.Задачи
Task 1: Удалить legacy
/newsessionsrc/GmRelay.DiscordBot/Features/Sessions/DiscordNewSessionCommand.cs.src/GmRelay.DiscordBot/Features/Sessions/DiscordNewSessionHandler.cs.DiscordNewSessionHandlerизsrc/GmRelay.DiscordBot/Program.cs.tests/GmRelay.Bot.Tests/Discord/DiscordNewSessionHandlerTests.cs.tests/GmRelay.Bot.Tests/Discord/DiscordStartupTests.cs:DiscordNewSessionCommandиз списка slash-команд;DiscordWizardCommandкак/newsession.tests/GmRelay.Bot.Tests/Discord/DiscordProjectStructureTests.cs(если есть упоминания legacy).Task 2: Переименовать wizard-команду в
/newsessionsrc/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardCommand.cs:47—SlashCommand("newsession-wizard", ...)→SlashCommand("newsession", ...). Обновить XML-doc и пользовательские сообщения.src/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardInteractionModule.cs— заменить/newsession-wizardна/newsessionв сообщениях об ошибках.Task 3: Привести pool-флоу в
GameCreationWizardк TelegramФайл
src/GmRelay.Shared/Features/Sessions/CreateSession/Wizard/GameCreationWizard.cs:Capacityв пул-ветку (передFormat).PoolSystemDuration→Capacity→Format→Location→Visibility→PickClub→Publish→PoolAddSlots...ApplyPoolSystemDurationChoice, чтобы следующий шаг былCapacity.PreviousStep, чтобыBackизFormat/Locationвозвращал вCapacity/PoolSystemDurationдля пула.tests/GmRelay.Bot.Tests/(илиtests/GmRelay.Shared.Tests/) для pool-переходов.Task 4: Добавить
FormatиLocationв Discord-рендерерФайл
src/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardStep.cs:Renderswitch добавить:RenderFormat()с кнопками Online/Offline, Назад, Отмена.RenderLocation(WizardPayload p)сOpenModalStep = WizardStepNames.Locationи динамическим prompt (ссылка/адрес).BuildModalдобавить caseWizardStepNames.Location.BuildConfirmDescriptionиBuildPoolConfirmDescriptionдобавить формат/ссылку/адрес.Task 5: Диспетчер взаимодействий
Файл
src/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardInteractionModule.cs:WizardStepNames.LocationвStepsThatOpenModal.Format:online/offlineуже работает черезWizardCallbackData.Choice.Task 6: Исправить
DiscordWizardSubmitterФайл
src/GmRelay.DiscordBot/Features/Sessions/Wizard/DiscordWizardSubmitter.cs:IPlatformMessenger platformMessengerиNpgsqlDataSource dataSource.BuildCommand: передатьLink,Format,LocationAddressпо аналогии с Telegram.IsComplete: проверитьFormat,JoinLinkдля Online,LocationAddressдля Offline; убрать обязательностьSingle.MaxPlayers.SubmitAsync: после_shared.HandleAsyncвызвать публикацию schedule-сообщения.Task 7: Публикация созданной сессии
DiscordWizardSubmitterдобавить методPublishCreatedSessionAsync:IPlatformMessenger.SendScheduleAsyncсPlatformScheduleMessage.CreateThreadAsyncstub).sessions.batch_message_idдляbatch_id.Task 8: Версия, compose, CI/CD, README
Directory.Build.props:3.11.0→3.11.1..gitea/workflows/deploy.yml:VERSION: 3.11.0→3.11.1.compose.yaml: образы3.11.0→3.11.1.src/GmRelay.Web/Components/Layout/NavMenu.razor:v3.11.0→v3.11.1.README.md: заменить/newsession-wizardна/newsession.Task 9: Тесты
tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardStepFormatLocationRenderTests.cs.tests/GmRelay.Bot.Tests/Discord/Wizard/DiscordWizardSubmitterBuildCommandTests.cs.tests/GmRelay.Bot.Tests/Discord/DiscordWizardInteractionModuleSourceTests.cs.GameCreationWizard.Task 10: Верификация
После утверждения финального плана начинаю ветку
feature/discord-wizard-telegram-parity.Статус реализации
Ветка
feature/discord-wizard-telegram-parityзапушена:9709d09.Что сделано
DiscordNewSessionCommand/DiscordNewSessionHandlerи их тесты./newsession-wizardпереименован в/newsession;DiscordStartupTestsобновлён.GameCreationWizard(shared): для пула добавлен общий шагCapacityпередFormat/Location(PoolSystemDuration→Capacity→Format→Location→Visibility→PoolAddSlots).WizardPayload.Pool.MaxPlayersдобавлено для общего лимита пула.DiscordWizardStep: добавленыRenderFormatиRenderLocation(Location — модальный ввод).DiscordWizardInteractionModule:Locationдобавлен вStepsThatOpenModal.DiscordWizardSubmitter.BuildCommandтеперь прокидываетLink,Format,LocationAddressиLocationAddressаналогично Telegram.DiscordWizardSubmitter.IsCompleteпроверяетFormatиLocation/JoinLink;MaxPlayers = nullразрешён.CreateSessionHandler+IPlatformMessenger.SendScheduleAsync(DIIPlatformMessengerуже зарегистрирован вProgram.cs).WizardStepViewBuilder.BuildPoolConfirm/BuildSingleConfirm) показывает формат и ссылку/адрес.GameCreationWizardStepTransitionsTests: пулCapacity→Format, общийMaxPlayersпула.DiscordWizardStepCapacityRenderTests:RenderFormat,RenderLocation.DiscordWizardSubmitterBuildCommandTests: Online/Offline mapping, poolMaxPlayers.3.11.1синхронизирована вDirectory.Build.props,.gitea/workflows/deploy.yml,compose.yaml,NavMenu.razor,README.md.Отступление от первоначального плана
GameCreationWizard— в Telegram-флоу для пула раньше не было общегоCapacity, а Discord должен быть идентичен Telegram. Пользователь ранее подтвердил, что изменения shared state machine приемлемы.DiscordWizardSubmitterне стал приниматьIPlatformMessenger/NpgsqlDataSourceнапрямую: публикация уже работает черезCreateSessionHandler, который получаетIPlatformMessengerиз DI. Это минимизирует дублирование.Проверки
dotnet build— OK.dotnet test tests/GmRelay.Bot.Tests— 618 passed, 1 skipped.dotnet format --verify-no-changes— OK.dotnet list package --vulnerable --include-transitive— no vulnerable packages.Следующий шаг
Готов к PR / code review.