Base de bot de discordResponders

Menus de seleção

Como responder menus de seleção do discord com a estrutura Responder

Criando Responder para menu de seleção

É possível criar um Responder que pode aceitar vários tipos de menus de seleção, veja um exemplo:

command.ts
// ...
const row = createRow(
    new StringSelectMenuBuilder({
        customId: "/select/fruits",
        placeholder: "Select fruits",
        options: [
            { emoji: "🍎", label: "Maçã", value: "apple" },
            { emoji: "🍉", label: "Melancia", value: "melon" },
            { emoji: "🍊", label: "Laranja", value: "orange" }
        ]
    })
);
interaction.reply({ flags: ["Ephemeral"], components: [row] });
// ...

Acima está o código para enviar um menu de seleção comum como resposta do comando. Logo abaixo você pode ver um Responder com ResponderType.StringSelect nos tipos, assim a função run deste Responder será executada quando alguém selecionar neste menu de seleção:

responder.ts
createResponder({
    customId: "/select/fruits",
    types: [ResponderType.StringSelect], cache: "cached",
    async run(interaction) {
        const selected = interaction.values[0];
        interaction.update({ flags: ["Ephemeral"], content: `${selected} Selecionada`, components: [] });
    },
});

Você pode combinar diversos tipos de menus de seleção diferentes:

responder.ts
createResponder({
    customId: "/ban/user", cache: "cached",
    types: [
        ResponderType.StringSelect,
        ResponderType.UserSelect,
    ],
    async run(interaction) {
        const { guild, values: [selected] } = interaction;

        await interaction.update({});

        if (interaction.isUserSelectMenu()){
            const member = guild.members.get(selected);
            await member.ban(); 
        } else {
            const member = guild.members.cache.find(m => m.user.username === selected);
            await member.ban(); 
        }

        await interaction.editReply({ 
            flags: ["Ephemeral"], components: [] 
            content: `${userMention(selected)} foi banido!`, 
        });
    },
});

Abaixo estão todos os tipos de menus de seleção:

Menu de seleçãoResponderType
StringsResponderType.StringSelect
UsuáriosResponderType.UserSelect
CanaisResponderType.ChannelSelect
CargosResponderType.RoleSelect
MençõesResponderType.MentionableSelect

É possível combinar com qualquer tipo, dessa forma você pode ter um botão, um menu de seleção e um modal com o mesmo customId e todos serão respondidos nesta função, basta fazer verificações:

responder.ts
createResponder({
    customId: "/menus/main", cache: "cached",
    types: [
        ResponderType.Button,
        ResponderType.StringSelect,
        ResponderType.ModalComponent,
    ],
    async run(interaction) {
        switch (true) {
            case interaction.isButton():
                console.log("Botão")
                return;
            case interaction.isStringSelect():
                console.log("Menu de seleção", interaction.values);
                return;
            default:
                console.log("Modal", interaction.fields);
                return;
        }
    },
});