You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会自动处理权限过滤、搜索匹配的逻辑。


  • 如果你坚持使用带自定义自动补全的字符串选项(比如要给频道加自定义备注、展示额外状态),按以下逻辑实现:
  1. 保留你原有的SlashCommandBuilder定义,确保命令部署时setAutocomplete(true)的配置已经同步到Discord端。
  2. 在interactionCreate事件监听中单独处理自动补全交互,过滤出activity命令下channel选项的自动补全请求。
  3. 拉取当前服务器的语音频道列表,根据用户当前输入的关键词做匹配过滤,最多返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:00:59