bug(discord): slash-команды кроме /ping не отвечают в тестовой группе #94

Closed
opened 2026-05-25 15:39:00 +03:00 by Toutsu · 4 comments
Owner

Контекст

Discord-бот gmrelay_bot подключён к тестовой группе/серверу. По ручной проверке в Discord 25 мая 2026 примерно в 15:18-15:29 MSK бот не реагирует на основные команды управления сессиями.

Цель этой задачи: зафиксировать фактуру и оставить место для отдельного разбора позже. Причина пока не расследовалась.

Наблюдения из ручной проверки

  • Пользователь Toutsu написал Тест в канале #общее; видимого ответа бота нет.
  • /ping сработал как Discord slash interaction: в UI видно Toutsu использует ping, бот gmrelay_bot ответил Pong!.
  • После сообщения /listsessions видимого ответа от бота нет.
  • Повторный /ping снова сработал и вернул Pong!, то есть бот в целом онлайн и способен отвечать на slash interaction.
  • После сообщений /help и /newsession видимого ответа от бота нет.
  • На скриншоте /listsessions, /help, /newsession выглядят как обычные сообщения пользователя, а не как UI-событие использует ..., в отличие от /ping. Это может означать, что Discord не распознаёт эти команды как зарегистрированные slash-команды, но это пока не подтверждено.

Факты из репозитория

  • В README заявлены Discord slash-команды /newsession и /listsessions, а также сценарий создания/публикации расписания через Discord.
  • В коде есть команды:
    • src/GmRelay.DiscordBot/Features/Sessions/DiscordNewSessionCommand.cs с [SlashCommand("newsession", "Create a new game session")].
    • src/GmRelay.DiscordBot/Features/Sessions/DiscordListSessionsCommand.cs с [SlashCommand("listsessions", "Show upcoming game sessions in this server")].
    • src/GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleCommand.cs с [SlashCommand("reschedule", "Initiate reschedule voting for a session")].
  • /ping регистрируется явно в src/GmRelay.DiscordBot/Program.cs через host.AddSlashCommand("ping", ...), и именно он работает в тестовой группе.
  • DiscordOptions сейчас валидирует только Discord:Token; README при этом отдельно упоминает client id для slash-команд. Это не вывод о причине, а пункт для проверки конфигурации при будущем разборе.
  • В README указано, что при приглашении Discord application bot нужны scopes/права bot и applications.commands.

Что проверить при разборе

  • Присутствуют ли /newsession, /listsessions, /reschedule в списке slash-команд Discord application в тестовом сервере.
  • Был ли бот приглашён/переавторизован с scope applications.commands.
  • Регистрируются ли module-based команды NetCord при старте worker, или сейчас фактически регистрируется только явно добавленный /ping.
  • Нужна ли регистрация команд на guild-level для тестовой группы, чтобы не ждать глобального распространения команд.
  • Есть ли ошибки регистрации команд/NetCord gateway в логах GmRelay.DiscordBot при старте.
  • Соответствуют ли переменные окружения документации: DISCORD_BOT_TOKEN, client id/application id и Discord__* настройки.
  • Проверить, что у бота есть нужные права в канале #общее для ответа и отправки embed/components.

Ожидаемое поведение

  • /ping отвечает Pong!.
  • /listsessions должен вернуть расписание или понятное сообщение, что предстоящих игр нет.
  • /newsession должен быть доступен как slash-команда с обязательными параметрами title и time и отвечать результатом создания или понятной ошибкой.
  • Неподдержанная /help либо не должна документироваться/использоваться, либо должна быть добавлена как отдельная команда помощи.

Артефакт

Скриншот ручной проверки приложен в исходном обращении к Codex. Если потребуется, его стоит перенести в Gitea вручную как вложение к этой issue.

## Контекст Discord-бот `gmrelay_bot` подключён к тестовой группе/серверу. По ручной проверке в Discord 25 мая 2026 примерно в 15:18-15:29 MSK бот не реагирует на основные команды управления сессиями. Цель этой задачи: зафиксировать фактуру и оставить место для отдельного разбора позже. Причина пока не расследовалась. ## Наблюдения из ручной проверки - Пользователь `Toutsu` написал `Тест` в канале `#общее`; видимого ответа бота нет. - `/ping` сработал как Discord slash interaction: в UI видно `Toutsu использует ping`, бот `gmrelay_bot` ответил `Pong!`. - После сообщения `/listsessions` видимого ответа от бота нет. - Повторный `/ping` снова сработал и вернул `Pong!`, то есть бот в целом онлайн и способен отвечать на slash interaction. - После сообщений `/help` и `/newsession` видимого ответа от бота нет. - На скриншоте `/listsessions`, `/help`, `/newsession` выглядят как обычные сообщения пользователя, а не как UI-событие `использует ...`, в отличие от `/ping`. Это может означать, что Discord не распознаёт эти команды как зарегистрированные slash-команды, но это пока не подтверждено. ## Факты из репозитория - В README заявлены Discord slash-команды `/newsession` и `/listsessions`, а также сценарий создания/публикации расписания через Discord. - В коде есть команды: - `src/GmRelay.DiscordBot/Features/Sessions/DiscordNewSessionCommand.cs` с `[SlashCommand("newsession", "Create a new game session")]`. - `src/GmRelay.DiscordBot/Features/Sessions/DiscordListSessionsCommand.cs` с `[SlashCommand("listsessions", "Show upcoming game sessions in this server")]`. - `src/GmRelay.DiscordBot/Features/Sessions/DiscordRescheduleCommand.cs` с `[SlashCommand("reschedule", "Initiate reschedule voting for a session")]`. - `/ping` регистрируется явно в `src/GmRelay.DiscordBot/Program.cs` через `host.AddSlashCommand("ping", ...)`, и именно он работает в тестовой группе. - `DiscordOptions` сейчас валидирует только `Discord:Token`; README при этом отдельно упоминает client id для slash-команд. Это не вывод о причине, а пункт для проверки конфигурации при будущем разборе. - В README указано, что при приглашении Discord application bot нужны scopes/права `bot` и `applications.commands`. ## Что проверить при разборе - Присутствуют ли `/newsession`, `/listsessions`, `/reschedule` в списке slash-команд Discord application в тестовом сервере. - Был ли бот приглашён/переавторизован с scope `applications.commands`. - Регистрируются ли module-based команды NetCord при старте worker, или сейчас фактически регистрируется только явно добавленный `/ping`. - Нужна ли регистрация команд на guild-level для тестовой группы, чтобы не ждать глобального распространения команд. - Есть ли ошибки регистрации команд/NetCord gateway в логах `GmRelay.DiscordBot` при старте. - Соответствуют ли переменные окружения документации: `DISCORD_BOT_TOKEN`, client id/application id и `Discord__*` настройки. - Проверить, что у бота есть нужные права в канале `#общее` для ответа и отправки embed/components. ## Ожидаемое поведение - `/ping` отвечает `Pong!`. - `/listsessions` должен вернуть расписание или понятное сообщение, что предстоящих игр нет. - `/newsession` должен быть доступен как slash-команда с обязательными параметрами `title` и `time` и отвечать результатом создания или понятной ошибкой. - Неподдержанная `/help` либо не должна документироваться/использоваться, либо должна быть добавлена как отдельная команда помощи. ## Артефакт Скриншот ручной проверки приложен в исходном обращении к Codex. Если потребуется, его стоит перенести в Gitea вручную как вложение к этой issue.
Toutsu added the type:bugpriority:p1area:discordplatform:discord labels 2026-05-25 15:39:00 +03:00
Author
Owner

Реализовано в PR #95 и выпущено в v3.0.2.

Ключевая причина: /ping регистрировался напрямую, а module-based slash-команды NetCord не добавлялись через host.AddModules(typeof(Program).Assembly). После релиза /newsession, /listsessions и /reschedule должны регистрироваться при старте Discord worker.

Проверки: PR checks run #236 — success, deploy run #237 — success.

Реализовано в PR #95 и выпущено в [v3.0.2](https://git.codeanddice.ru/Toutsu/GmRelayBot/releases/tag/v3.0.2). Ключевая причина: `/ping` регистрировался напрямую, а module-based slash-команды NetCord не добавлялись через `host.AddModules(typeof(Program).Assembly)`. После релиза `/newsession`, `/listsessions` и `/reschedule` должны регистрироваться при старте Discord worker. Проверки: PR checks run #236 — success, deploy run #237 — success.
Toutsu reopened this issue 2026-05-25 16:20:18 +03:00
Author
Owner

Переоткрываю: после деплоя v3.0.2 ручная проверка в Discord показала, что /ping доступен как slash-команда, а /listsessions и /newsession всё ещё отображаются/отправляются как обычный текст.

Новый проверяемый root-cause: host.AddModules(...) добавлен, но сами module-based команды объявлены как [SlashCommand] на классе. В reference NetCord module pattern атрибут SlashCommand расположен на методе внутри ApplicationCommandModule, поэтому scanner может не регистрировать наши ExecuteAsync методы как команды.

Переоткрываю: после деплоя v3.0.2 ручная проверка в Discord показала, что `/ping` доступен как slash-команда, а `/listsessions` и `/newsession` всё ещё отображаются/отправляются как обычный текст. Новый проверяемый root-cause: `host.AddModules(...)` добавлен, но сами module-based команды объявлены как `[SlashCommand]` на классе. В reference NetCord module pattern атрибут `SlashCommand` расположен на методе внутри `ApplicationCommandModule`, поэтому scanner может не регистрировать наши `ExecuteAsync` методы как команды.
Author
Owner

После ручной проверки Discord стало ясно, что v3.0.2 закрыл только часть причины: AddModules(...) добавлен, но сами NetCord module-команды не регистрировались как отдельные slash-команды.

Новая root-cause гипотеза подтверждена тестом: [SlashCommand] был на классе модуля, а NetCord в таком случае трактует его как group-level команду и не сканирует методы как standalone slash-команды. Исправление перенесло атрибуты на ExecuteAsync и добавило тест, который проверяет обнаружение /newsession, /listsessions, /reschedule через ApplicationCommandService<SlashCommandContext>.AddModules(assembly).

PR: #96

После ручной проверки Discord стало ясно, что v3.0.2 закрыл только часть причины: `AddModules(...)` добавлен, но сами NetCord module-команды не регистрировались как отдельные slash-команды. Новая root-cause гипотеза подтверждена тестом: `[SlashCommand]` был на классе модуля, а NetCord в таком случае трактует его как group-level команду и не сканирует методы как standalone slash-команды. Исправление перенесло атрибуты на `ExecuteAsync` и добавило тест, который проверяет обнаружение `/newsession`, `/listsessions`, `/reschedule` через `ApplicationCommandService<SlashCommandContext>.AddModules(assembly)`. PR: https://git.codeanddice.ru/Toutsu/GmRelayBot/pulls/96
Author
Owner

Исправление доведено до релиза.

Что сделано:

Ожидаемая проверка в Discord: slash-меню для gmrelay_bot должно начать показывать /newsession, /listsessions, /reschedule рядом с /ping после обновления команд Discord.

Исправление доведено до релиза. Что сделано: - PR #96: https://git.codeanddice.ru/Toutsu/GmRelayBot/pulls/96 - Merge commit на `main`: `9375fa45b24a7a07e4416bbe329198fa6dd8da4e` - Release v3.0.3: https://git.codeanddice.ru/Toutsu/GmRelayBot/releases/tag/v3.0.3 - PR checks run #238: success - Deploy run #239: success Ожидаемая проверка в Discord: slash-меню для `gmrelay_bot` должно начать показывать `/newsession`, `/listsessions`, `/reschedule` рядом с `/ping` после обновления команд Discord.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Toutsu/GmRelayBot#94