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
// ...
import { createComponents } from "@magicyan/discord";

await interaction.reply({ 
    flags: ["Ephemeral", "IsComponentsV2"], 
    components: createComponents(
        new StringSelectMenuBuilder({
            customId: "/fruits",
            placeholder: "Selecione frutas",
            options: [
                { emoji: "🍎", label: "Maçã", value: "apple" },
                { emoji: "🍉", label: "Melancia", value: "melon" },
                { emoji: "🍊", label: "Laranja", value: "orange" }
            ]
        })
    ) 
});
// ...

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: "/fruits",
    types: [ResponderType.StringSelect], cache: "cached",
    async run(interaction) {
        const selected = interaction.values[0];
        interaction.update({ 
            components: createComponents(
                `${selected} Selecionada`
            ), 
        });
    },
});

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({ 
            components: createComponents(
                `${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;
        }
    },
});

Nesta página