Responders
Entenda o que são Responders e como eles funcionam
É possível definir algumas opções para os Responders na função setupCreators!
O que são Responders?
A função createResponder é poderosa para lidar com diferentes tipos de interações do discord. Com ela podemos responder botões, menus de seleção e modais, ou todos ao mesmo tempo.
Para criar um Responder é preciso importar a função e o enum
import { createResponder } from "#base";
import { ResponderType } from "@constatic/base";Veja um simples exemplo abaixo, vamos enviar um botão através de um comando e responder ele usando a função createResponder
import { createCommand } from "#base";
import { createComponents } from "@magicyan/discord";
import { ApplicationCommandType, ButtonBuilder, ButtonStyle } from "discord.js";
createCommand({
name: "ping",
description: "Comando de ping",
dmPermission: false,
type: ApplicationCommandType.ChatInput,
async run(interaction){
await interaction.reply({
flags: ["Ephemeral", "IsComponentsV2"],
components: createComponents(
new ButtonBuilder({
customId: "/ping/button",
label: "Ping",
style: ButtonStyle.Success
})
)
});
}
});import { createResponder } from "#base";
import { ResponderType } from "@constatic/base";
createResponder({
customId: "/ping/button",
types: [ResponderType.Button], cache: "cached",
async run(interaction) {
await interaction.reply({
flags: ["Ephemeral", "IsComponentsV2"],
content: createComponents(
"pong"
)
});
},
});Dessa forma estamos respondendo a um componente de botão fixo em uma mensagem onde o customId é /ping/button, então qualquer botão que nosso bot enviar que tiver esse customId, será respondido por essa função definida no run do nosso Responder.
Note que criamos um customId que começa com / (barra). Nessa base, todos os componentes e modais que forem manipulados nos Responders, devem ter o customId iniciado com / (barra), pois o manipulador trata os Responders como rotas HTTP, assim como você pode ver nesta página.
Os Responders usam o evento interactionCreate, o que significa que mesmo que o bot reinicie, se alguém usar esse botão novamente, ele ainda será respondido com a função definida. O mesmo ocorre para menus de seleção e modais.
Podemos responder interações de tipos diferentes mas com o mesmo customId definindo mais tipos no array types:
createResponder({
customId: "/form/register",
types: [
ResponderType.Button,
ResponderType.ModalComponent
], cache: "cached",
async run(interaction) {
if (interaction.isButton()){
await interaction.showModal({
// ^ ButtonInteraction
customId: interaction.customId,
// ...
})
return;
}
const { fields } = interaction;
// ^ ModalMessageModalSubmitInteraction
// ...
},
});No exemplo acima temos um botão que abre um modal e no mesmo Responder pegamos os dados passados para o modal de mesmo customId. O type narrowing definido pelas chegagens com os type guards das interações, restringiu o tipo delas dentro dos blocos.
Confira todos os tipos de interações que os Respoders podem receber:
| Tipo | Interação | Detalhes |
|---|---|---|
ResponderType.Button | ButtonInteraction | É emitido quando um botão em uma mensagem é clicado |
ResponderType.StringSelect | StringSelectMenuInteraction | É emitido quando uma ou mais opções em um menu de seleção em uma mensagem são selecionadas |
ResponderType.UserSelect | UserSelectMenuInteraction | É emitido quando uma ou mais opções em um menu de seleção de usuário em uma mensagem são selecionadas |
ResponderType.RoleSelect | RoleSelectMenuInteraction | É emitido quando uma ou mais opções em um menu de seleção de cargos em uma mensagem são selecionadas |
ResponderType.ChannelSelect | ChannelSelectMenuInteraction | É emitido quando uma ou mais opções em um menu de seleção de canais em uma mensagem são selecionadas |
ResponderType.Mentionable | MentionableSelectMenuInteraction | É emitido quando uma ou mais opções em um menu de seleção de menção em uma mensagem são selecionadas |
ResponderType.Select | AnySelectMenuInteraction | É emitido quando uma ou mais opções em um menu de seleção de qualquer tipo em uma mensagem são selecionadas |
ResponderType.Modal | ModalSubmitInteraction | É emitido quando um modal aberto por um comando é enviado |
ResponderType.ModalComponent | ModalMessageModalSubmitInteraction | É emitido quando um modal aberto por um componente de mensagem é enviado |
ResponderType.ChatInput | ChatInputCommandInteraction | Só pode ser emitido pela função emitResponder passando um comando do tipo ChatInputCommandInteraction como argumento |
ResponderType.UserContextMenu | UserContextMenuCommandInteraction | Só pode ser emitido pela função emitResponder passando um comando do tipo UserContextMenuCommandInteraction como argumento |
ResponderType.MessageContextMenu | MessageContextMenuCommandInteraction | Só pode ser emitido pela função emitResponder passando um comando do tipo MessageContextMenuCommandInteraction como argumento |