DiscordJS v14实现依赖选择项的Slash命令是否可行?
可以实现,这里提供两种主流方案:
方案一:使用斜杠命令的自动补全(Autocomplete)功能
这是最贴合原生斜杠命令体验的实现方式,步骤如下:
- 注册斜杠命令时,将第一个选项(choice1)设为静态可选值(包含"A"和"B"),第二个选项(choice2)开启自动补全属性,不预设静态选项。
- 当用户选定choice1的选项后,Discord会向你的服务端发送自动补全请求,请求中会携带用户已选择的choice1值。
- 服务端根据choice1的值返回对应选项列表:
- 若choice1为"A",返回
["One", "Two"] - 若choice1为"B",返回
["Three", "Four"]
- 若choice1为"A",返回
- 用户在choice2的输入框中就能看到动态生成的可选值,直接选择即可完成命令输入。
以下是Discord.js框架下的伪代码示例:
// 注册斜杠命令 client.application.commands.create({ name: "dynamiccmd", description: "带动态选项的斜杠命令", options: [ { name: "choice1", type: ApplicationCommandOptionType.String, description: "第一个选择项", required: true, choices: [ { name: "A", value: "A" }, { name: "B", value: "B" } ] }, { name: "choice2", type: ApplicationCommandOptionType.String, description: "第二个选择项", required: true, autocomplete: true // 开启自动补全 } ] }); // 监听自动补全请求 client.on("interactionCreate", async interaction => { if (!interaction.isAutocomplete()) return; const selectedChoice1 = interaction.options.getString("choice1"); let dynamicChoices = []; switch(selectedChoice1) { case "A": dynamicChoices = ["One", "Two"].map(item => ({ name: item, value: item })); break; case "B": dynamicChoices = ["Three", "Four"].map(item => ({ name: item, value: item })); break; } await interaction.respond(dynamicChoices); });
方案二:分两步的交互消息选择
如果不想依赖自动补全,也可以通过两次交互实现:
- 注册仅包含choice1选项的斜杠命令。
- 用户执行命令并选择"A"或"B"后,机器人发送一个包含下拉选择菜单的消息,菜单选项根据用户的choice1选择动态生成(选A则显示One/Two,选B则显示Three/Four)。
- 用户在下拉菜单中完成第二个选项的选择后,机器人再执行后续逻辑。
这种方式交互步骤更多,但对新手来说逻辑更直观。
总结:优先推荐自动补全方案,完全匹配你需要的“斜杠命令内先后选择两个选项,第二个选项随第一个动态变化”的需求,且体验更流畅。
内容的提问来源于stack exchange,提问作者SchinkTasia
相关产品推荐
相关产品推荐

