Los comandos de barra se han agregado a Discord.Net junto con Interaction Framework.
Al revisar la documentación, descubrí que podemos usar SlashCommandAttribute dentro de un módulo que hereda de InteractionModuleBase . Más información se puede encontrar aquí .
Tenga en cuenta que ya he tenido este bot funcionando durante más de un año, por lo que funciona completamente con comandos básicos, y estoy tratando de actualizarlo para que funcione con comandos de barra ahora.
Lo que he probado son los siguientes pasos:
Dentro de mi método principal, escuché el evento listo para el cliente:
_client.Ready += _client_Ready;Dentro de la función _client_Ready, puede encontrar el siguiente código:
private async Task _client_Ready() { _interactionService = new InteractionService(_client); await _interactionService.AddModulesAsync(Assembly.GetEntryAssembly(), _serviceProvider); await _interactionService.RegisterCommandsToGuildAsync(_guildId); }Creé un módulo que hereda de InteractionModuleBase de la siguiente manera:
public class TestingSlashCommandModule : InteractionModuleBase<SocketInteractionContext> { [SlashCommand("test-slash", "Echo an input")] public async Task Echo(string input) { await RespondAsync(input); } }Cuando ejecuto el bot y voy a mi servidor de discordia, puedo ver el comando de barra registrado:
Sin embargo, cuando trato de usarlo, aparece un error en Discord que dice que la aplicación no respondió y que el punto de interrupción dentro de la función Echo no se está alcanzando en absoluto.
No estoy seguro de si así es como se pretende usar los comandos de barra porque aparentemente hay otra forma de hacerlo, pero no se ve tan limpio como los módulos con los atributos.
¿Alguien ha podido usar comandos de barra dentro de los módulos usando SlashCommandAttribute y cómo?
Pude arreglar eso después de encontrar una sección en la documentación llamada Ejecución de comandos
Tuve que agregar un detector de eventos a InteractionCreated en _client dentro del evento _client_Ready :
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); }; }Después de hacer esto, los comandos de barra se ejecutan dentro de los módulos y puedo ver el resultado.