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(); } });
代码说明
- 规则定义:先明确需要常驻的频道ID和服务器ID,方便后续判断
- Bot状态检查:先确认Bot当前在语音频道里,避免无意义的判断
- 常驻规则判断:
- 如果Bot在服务器1的指定频道,直接返回,不执行断开逻辑
- 如果Bot在服务器2的任何频道,直接返回,不执行断开逻辑
- 通用断开逻辑:其他服务器的频道中,当频道内没有人类成员时,Bot才断开
之前修改无效的原因
- 第一次修改只针对单个频道做了返回,但没有处理服务器2的全频道常驻需求,同时原代码的属性名错误导致判断可能不生效
- 第二次修改的
!newState.channel逻辑没有正确过滤事件,且依然没有区分服务器和频道的常驻规则,也没修复属性名错误
内容的提问来源于stack exchange,提问作者user21193073
相关产品推荐
相关产品推荐

