使用 SlashCommandAttribute 不适用于 Discord.Net
Using SlashCommandAttribute not working with Discord.Net
斜杠命令已添加到 Discord.Net 以及交互框架。
通过阅读文档,我发现我们可以在继承自 InteractionModuleBase
的模块中使用 SlashCommandAttribute
。可以找到更多信息 here.
请注意,我已经使用这个机器人 运行ning 一年多了,所以它完全可以使用基本命令,我现在正在尝试更新它以使用斜杠命令。
我试过的是以下步骤:
在我的主要方法中,我监听了客户端就绪事件:
_client.Ready += _client_Ready;
在_client_Ready函数里面,可以找到如下代码:
private async Task _client_Ready()
{
_interactionService = new InteractionService(_client);
await _interactionService.AddModulesAsync(Assembly.GetEntryAssembly(), _serviceProvider);
await _interactionService.RegisterCommandsToGuildAsync(_guildId);
}
我创建了一个继承自 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);
};
}
执行此操作后,将在模块内执行斜杠命令,我可以看到结果。
斜杠命令已添加到 Discord.Net 以及交互框架。
通过阅读文档,我发现我们可以在继承自 InteractionModuleBase
的模块中使用 SlashCommandAttribute
。可以找到更多信息 here.
请注意,我已经使用这个机器人 运行ning 一年多了,所以它完全可以使用基本命令,我现在正在尝试更新它以使用斜杠命令。
我试过的是以下步骤:
在我的主要方法中,我监听了客户端就绪事件:
_client.Ready += _client_Ready;
在_client_Ready函数里面,可以找到如下代码:
private async Task _client_Ready() { _interactionService = new InteractionService(_client); await _interactionService.AddModulesAsync(Assembly.GetEntryAssembly(), _serviceProvider); await _interactionService.RegisterCommandsToGuildAsync(_guildId); }
我创建了一个继承自 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);
};
}
执行此操作后,将在模块内执行斜杠命令,我可以看到结果。