javascript 如何添加超过25个选择到自动完成选项discord.js v14

dsf9zpds  于 2023-04-04  发布在  Java
关注(0)|答案(3)|浏览(107)

我正在尝试创建一个选项,有自动完成,但工作超过25个选择,我已经看到其他机器人这样做,我只是失去了我将如何能够做到这一点。我已经有基本的自动完成设置,它只是不允许我添加超过25个选择。我使用discord.js v14(我有28个选项添加rn,它只与25虽然工作。泰提前!)

if (interaction.options.getSubcommand() === "botanical" ) { 
            const focusedOption = interaction.options.getFocused(true);
            let choices;

            if (focusedOption.name === 'search') {
                choices = ['agrimony', 'allspice', 'almond', 'aloe', 'anise', 'apple', 'avocado', 'basil', 'bayLaurel', 'bergamot', 'birch', 'calendula', 'cardamom', 'chamomile', 'cinnamon', 'comfrey', 'hemp', 'lavender', 'mint', 'motherwort', 'mugwort', 'rose', 'rosemary', 'sage', 'thyme', 'valerian', 'vervain', 'yarrow', 'valerian', 'vervain', 'yarrow'];
            }
            const filtered = choices.filter(choice => choice.startsWith(focusedOption.value));
            await interaction.respond(
                filtered.map(choice => ({ name: choice, value: choice })),
            );
        }
a8jjtwal

a8jjtwal1#

你所拥有的实际上已经非常接近能够实现你想要的功能;现在你需要做的就是将过滤后的数组切片,最多只显示25个,这样它就不会在初始时产生错误:

if (interaction.options.getSubcommand() === "botanical" ) { 
        const focusedOption = interaction.options.getFocused(true);
        let choices;

        if (focusedOption.name === 'search') {
            choices = ['agrimony', 'allspice', 'almond', 'aloe', 'anise', 'apple', 'avocado', 'basil', 'bayLaurel', 'bergamot', 'birch', 'calendula', 'cardamom', 'chamomile', 'cinnamon', 'comfrey', 'hemp', 'lavender', 'mint', 'motherwort', 'mugwort', 'rose', 'rosemary', 'sage', 'thyme', 'valerian', 'vervain', 'yarrow', 'valerian', 'vervain', 'yarrow'];
         }
        const filtered = choices.filter(choice => choice.startsWith(focusedOption.value));

        let options;
        if (filtered.length > 25) {
            options = filtered.slice(0, 25);
        } else {
            options = filtered;
        }

        await interaction.respond(
            options.map(choice => ({ name: choice, value: choice })),
        );
    }

可能有一种更紧凑的方式可以编写上面的代码,但为了回答这个问题,我已经将切片部分与一个额外的options变量集成在一起,以维护上面已经编写的内容。
希望这有帮助!

附录

您可能还想做的其他事情是通过在filter函数中执行类似focusedOption.value.toLowerCase()的操作来使focusedOption不区分大小写。

webghufk

webghufk2#

答案很简单,你不能这么做,Discord有25个选项的限制,你无法绕过这个限制,也无法在一个选择器中添加超过25个选项

2lpgd968

2lpgd9683#

我最终找到了一个discord.py解决方案,如果其他人正在寻找它,它非常相似。
当使用rps_autocomplete函数来设置命令的选项时,你可以将它设置为一次只显示25个过滤数组。我现在可以有100多个自动完成选项和计数。

async def rps_autocomplete(self, interaction: discord.Interaction, current: str) -> List[app_commands.Choice[str]]:
    with open('./choices.json') as f:
        choices = json.load(f)['choices'] 
    choices = [app_commands.Choice(name=choice, value=choice) for choice in choices if current.lower() in choice.lower()][:25]
    return choices

然后,您可以通过调用rps_autocomplete函数来设置命令中的选项:

@app_commands.autocomplete(something=rps_autocomplete)
async def test(self, interaction: discord.Interaction, something: str):

您也可以将选项设置为列表而不是.json,但我发现如果它有点长,它会占用命令文件上一些不必要的空间。

相关问题