Base de bot de discord

Responders

Entenda o que são Responders e como eles funcionam

É possível definir algumas opções para os Responders na função setupCreators!

Veja mais detalhes na página sobre as funções criadoras

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

responder.ts
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

command.ts
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
                })
            ) 
        });
    }
});
responder.ts
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:

responder.ts
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:

TipoInteraçãoDetalhes
ResponderType.ButtonButtonInteractionÉ emitido quando um botão em uma mensagem é clicado
ResponderType.StringSelectStringSelectMenuInteractionÉ emitido quando uma ou mais opções em um menu de seleção em uma mensagem são selecionadas
ResponderType.UserSelectUserSelectMenuInteractionÉ emitido quando uma ou mais opções em um menu de seleção de usuário em uma mensagem são selecionadas
ResponderType.RoleSelectRoleSelectMenuInteractionÉ emitido quando uma ou mais opções em um menu de seleção de cargos em uma mensagem são selecionadas
ResponderType.ChannelSelectChannelSelectMenuInteractionÉ emitido quando uma ou mais opções em um menu de seleção de canais em uma mensagem são selecionadas
ResponderType.MentionableMentionableSelectMenuInteractionÉ emitido quando uma ou mais opções em um menu de seleção de menção em uma mensagem são selecionadas
ResponderType.SelectAnySelectMenuInteractionÉ emitido quando uma ou mais opções em um menu de seleção de qualquer tipo em uma mensagem são selecionadas
ResponderType.ModalModalSubmitInteractionÉ emitido quando um modal aberto por um comando é enviado
ResponderType.ModalComponentModalMessageModalSubmitInteractionÉ emitido quando um modal aberto por um componente de mensagem é enviado
ResponderType.ChatInputChatInputCommandInteractionSó pode ser emitido pela função emitResponder passando um comando do tipo ChatInputCommandInteraction como argumento
ResponderType.UserContextMenuUserContextMenuCommandInteractionSó pode ser emitido pela função emitResponder passando um comando do tipo UserContextMenuCommandInteraction como argumento
ResponderType.MessageContextMenuMessageContextMenuCommandInteractionSó pode ser emitido pela função emitResponder passando um comando do tipo MessageContextMenuCommandInteraction como argumento

Nesta página