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

Discord.js v13语音状态更新问题:Bot无法常驻指定VC

Discord机器人语音频道常驻问题修复

问题根源

现有代码存在以下问题导致不符合需求:

  • 属性名错误:Discord.js v13+ 中语音状态的频道ID属性是channelId,不是channelID,旧属性名会导致判断失效
  • 未区分服务器和频道规则:没有针对服务器1的特定频道、服务器2的全频道设置常驻逻辑,统一执行了只剩Bot就断开的操作
  • 判断逻辑混乱:原有的newState.channel判断逻辑没有正确过滤需要处理的状态更新事件

修正后的代码

client.on('voiceStateUpdate', (oldState, newState) => {
    // 定义需要常驻的频道和服务器规则
    const PERMANENT_CHANNEL = '1073655275141210122'; // 服务器1的常驻频道
    const PERMANENT_GUILD = '服务器2的ID'; // 替换成你的服务器2ID

    // 获取Bot当前所在的语音频道
    const botVoiceChannel = oldState.guild.me.voice.channel;
    if (!botVoiceChannel) return; // Bot不在任何语音频道时直接返回

    // 情况1:Bot在服务器1的指定常驻频道,直接跳过断开逻辑
    if (botVoiceChannel.id === PERMANENT_CHANNEL) {
        return;
    }

    // 情况2:Bot在服务器2的任何频道,直接跳过断开逻辑
    if (botVoiceChannel.guild.id === PERMANENT_GUILD) {
        return;
    }

    // 其他服务器/频道:只剩Bot时断开
    // 检查当前频道成员数,排除机器人(如果需要)
    const humanMembers = botVoiceChannel.members.filter(member => !member.user.bot);
    if (humanMembers.size === 0) {
        botVoiceChannel.leave();
    }
});

代码说明

  1. 规则定义:先明确需要常驻的频道ID和服务器ID,方便后续判断
  2. Bot状态检查:先确认Bot当前在语音频道里,避免无意义的判断
  3. 常驻规则判断:
    • 如果Bot在服务器1的指定频道,直接返回,不执行断开逻辑
    • 如果Bot在服务器2的任何频道,直接返回,不执行断开逻辑
  4. 通用断开逻辑:其他服务器的频道中,当频道内没有人类成员时,Bot才断开

之前修改无效的原因

  1. 第一次修改只针对单个频道做了返回,但没有处理服务器2的全频道常驻需求,同时原代码的属性名错误导致判断可能不生效
  2. 第二次修改的!newState.channel逻辑没有正确过滤事件,且依然没有区分服务器和频道的常驻规则,也没修复属性名错误

内容的提问来源于stack exchange,提问作者user21193073

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:01:11