Discord.js V13 如何为斜杠命令自动补全选项添加语音频道
Discord斜杠命令语音频道自动补全实现方法
- 如果你不需要自定义自动补全的展示规则,优先用Discord原生的频道选项,不需要手写任何自动补全逻辑,直接修改命令定义即可:
const { SlashCommandBuilder, ChannelType } = require('discord.js'); new SlashCommandBuilder() .setName('activity') .setDescription('开启YouTube Together活动') .addChannelOption(option => option.setName('channel') .setDescription('选择要开启活动的语音频道') .addChannelTypes(ChannelType.GuildVoice) // 强制限定选项仅展示服务器内的语音频道 .setRequired(true) )
后续命令执行时直接调用interaction.options.getChannel('channel')就能拿到选中的语音频道对象,不需要额外做ID查询,Discord会自动处理权限过滤、搜索匹配的逻辑。
- 如果你坚持使用带自定义自动补全的字符串选项(比如要给频道加自定义备注、展示额外状态),按以下逻辑实现:
- 保留你原有的SlashCommandBuilder定义,确保命令部署时
setAutocomplete(true)的配置已经同步到Discord端。 - 在
interactionCreate事件监听中单独处理自动补全交互,过滤出activity命令下channel选项的自动补全请求。 - 拉取当前服务器的语音频道列表,根据用户当前输入的关键词做匹配过滤,最多返回25个候选项(Discord自动补全接口的硬上限),返回响应即可。
对应实现代码:
const { InteractionType, ChannelType } = require('discord.js'); client.on('interactionCreate', async interaction => { // 拦截自动补全交互 if (interaction.type === InteractionType.ApplicationCommandAutocomplete) { // 匹配对应命令和选项 if (interaction.commandName === 'activity' && interaction.options.getFocused(true).name === 'channel') { const userInput = interaction.options.getFocused().toLowerCase(); // 过滤当前服务器内、用户和机器人都有连接权限的语音频道 const validVoiceChannels = interaction.guild.channels.cache.filter(channel => channel.type === ChannelType.GuildVoice && channel.permissionsFor(interaction.user).has('Connect') && channel.permissionsFor(client.user).has('Connect') ); // 根据用户输入匹配频道名,最多取25个候选项 const options = validVoiceChannels .filter(channel => channel.name.toLowerCase().includes(userInput)) .first(25) .map(channel => ({ name: channel.name, // 自动补全列表展示的名称 value: channel.id // 选中后实际传给命令的值,用ID避免重名问题 })); return interaction.respond(options); } } // 原有斜杠命令处理逻辑 if (interaction.isChatInputCommand()) { if (interaction.commandName === 'activity') { // 字符串选项拿到的是频道ID,查一下就能拿到频道对象 const targetChannel = await interaction.guild.channels.fetch(interaction.options.getString('channel')); // 后续编写开启YouTube Together的逻辑即可 } } })
注意事项:
- 自动补全请求必须在3秒内返回响应,否则会被Discord判定超时,不要在过滤逻辑里加数据库查询等耗时操作
- 候选项的value建议存频道ID,不要存频道名,避免服务器内出现同名频道导致逻辑错误
- 服务器语音频道超过25个时必须加关键词匹配过滤,否则返回的列表不全,用户找不到目标频道
内容的提问来源于stack exchange,提问作者barbarossa
相关产品推荐
相关产品推荐

