使用discord js的每个公会斜线命令的不同选择

Different choices for each guild slash command using discord js

我正在构建一个将在多个公会(a.k.a 服务器)上使用的 discord 机器人。该机器人有一个名为 'send' 的命令,该命令在一个选项中有一组 选择

const { SlashCommandBuilder } = require('@discordjs/builders');

module.exports = {

    data: new SlashCommandBuilder()
        .setName('send')
        .setDescription('Do stuff')
        .addStringOption(option =>
            option.setName('choices') // setting the choices
                .setDescription('users will chose one of the options bellow')
                .setRequired(true)
                .addChoice('choice1', 'potato')
                .addChoice('choice2', 'tomato')
                .setRequired(true))
        

    async execute(interaction) {

       //do stuff

        }; }};

所有其他应用程序命令都是全局的,但此特定命令必须为每个不同的公会提供自定义选择。所有这些选择都存储在 mongo 数据库中,并带有相应的公会 ID。

数据库查询没问题,但我正在努力寻找 'deploy' 自动执行此命令的解决方案,每个服务器都有不同的选择。这是我提出这个问题的目标,找到一个解决方案来为每个公会部署具有不同选择的命令。

如果需要,我可以提供我的 deploy-commands.js 代码(在 this tutorial 之后)以及更多详细信息。

感谢帮助

如评论中所述,无法使用来自数据库的数据进行选择。解决方法是使用 'autocomplete' 选项。

为此,我们在构建器中添加一个 .setAutocomplete(true) 。现在,我们需要处理自动完成交互,并用我们想要从数据库中获取的值填充它。

'filter' 我们正在处理的交互类型很重要。使用 if 语句,我们需要验证交互是 autocomplete 还是 command。下面是结果代码:

const { SlashCommandBuilder } = require('@discordjs/builders');
    const mongo = require('../structures/mongo')

module.exports = {
    data: new SlashCommandBuilder()
        .setName('send')
        .setDescription('items list')
        .addStringOption((option) =>
            option
                .setName('items')
                .setDescription('Select your item from the list')
                .setRequired(true)
                .setAutocomplete(true)),

    async execute(interaction) {

        const guildID = interaction.member.guild.id;
        //query DB for the options 

        let guild = await mongo.getGuild(guildID)

        //loop through guild token and set to autocomplete 

        for (let i = 0; i < guild.guild_tokens.length; i++) {
            choices.push({
                name: `${guild.guild_tokens[i].name}`,
                value: `${i}`,
            })
            tokens.push(`${guild.guild_tokens[i].name}`)
        }

        if (interaction.isAutocomplete()) {
            interaction.respond(choices)
                .catch(console.error);
        }

        // Must handle interactions (command ones) inside the if statement
        if (interaction.isCommand()) {

           //  do stuff 

    }
};

附带一提,一开始我对交互有疑问,因为在我的 'interactionCreate' 文件中,如果交互不是命令,我会 returning。如果交互是 'autocomplete' 类型,将该文件更改为非 return 也很重要:

module.exports = { 名称:“交互创建”, 异步执行(交互){

    if (!(interaction.isCommand() || (interaction.type == 'APPLICATION_COMMAND_AUTOCOMPLETE'))) {
        console.log('fuck')
        return;

    }

    const command = interaction.client.commands.get(interaction.commandName);


    if (!command) return;

    try {
        await command.execute(interaction)

    } catch (err) {
        if (err) console.error(err);

    }
}

}