使用 SlashCommandAttribute 不适用于 Discord.Net

Using SlashCommandAttribute not working with Discord.Net

斜杠命令已添加到 Discord.Net 以及交互框架。

通过阅读文档,我发现我们可以在继承自 InteractionModuleBase 的模块中使用 SlashCommandAttribute。可以找到更多信息 here.

请注意,我已经使用这个机器人 运行ning 一年多了,所以它完全可以使用基本命令,我现在正在尝试更新它以使用斜杠命令。

我试过的是以下步骤:

  1. 在我的主要方法中,我监听了客户端就绪事件:

    _client.Ready += _client_Ready;
    
  2. 在_client_Ready函数里面,可以找到如下代码:

     private async Task _client_Ready()
     {
         _interactionService = new InteractionService(_client);
         await _interactionService.AddModulesAsync(Assembly.GetEntryAssembly(), _serviceProvider);
         await _interactionService.RegisterCommandsToGuildAsync(_guildId);
     }
    
  3. 我创建了一个继承自 InteractionModuleBase 的模块,如下所示:

    public class TestingSlashCommandModule : InteractionModuleBase<SocketInteractionContext>
    {
        [SlashCommand("test-slash", "Echo an input")]
        public async Task Echo(string input)
        {
            await RespondAsync(input);
        }
    }
    

当我 运行 机器人进入我的 discord 服务器时,我可以看到注册的斜杠命令:

但是,当我尝试使用它时,我在 Discord 上收到一条错误消息,指出应用程序没有响应,并且 Echo 函数内的断点根本没有被击中。

我不确定这是否是斜杠命令的用途,因为显然 another way 可以做到这一点,但它看起来不像具有属性的模块那么干净。

有没有人能够在使用 SlashCommandAttribute 的模块中使用斜杠命令,如何做到的?

在文档中找到名为 Executing Commands

的部分后,我得以修复该问题

我必须在 _client_Ready 事件中的 _client 上向 InteractionCreated 添加一个事件侦听器:

private async Task _client_Ready()
{
    _interactionService = new InteractionService(_client);
    await _interactionService.AddModulesAsync(Assembly.GetEntryAssembly(), _serviceProvider);
    await _interactionService.RegisterCommandsToGuildAsync(_guildId);

    _client.InteractionCreated += async interaction =>
    {
        var scope = _serviceProvider.CreateScope();
        var ctx = new SocketInteractionContext(_client, interaction);
        await _interactionService.ExecuteCommandAsync(ctx, scope.ServiceProvider);
    };
}

执行此操作后,将在模块内执行斜杠命令,我可以看到结果。