discord.js v13检测用户加入语音频道及voiceStateUpdate事件无响应排查
Discord.js v13 voiceStateUpdate事件无响应排查与实现方案
核心问题排查与解决
1. 必须配置正确的Intents
v13开始Discord.js要求显式声明机器人需要获取的事件权限,语音状态变更需要GUILD_VOICE_STATES intent,同时基础的GUILDS intent也不能少。示例代码:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_VOICE_STATES ] });
2. 确认事件监听逻辑正确
v13中voiceStateUpdate事件的监听写法未发生根本性变化,参数为oldState(变更前的语音状态)和newState(变更后的语音状态)。你可以通过对比channelId来判断用户是加入还是离开频道:
// 初始化语音人数变量 let activeVoiceUsers = 0; client.on('voiceStateUpdate', (oldState, newState) => { // 用户从无频道变为有频道:加入语音 if (!oldState.channelId && newState.channelId) { activeVoiceUsers++; console.log(`当前语音频道人数:${activeVoiceUsers}`); } // 用户从有频道变为无频道:离开语音 else if (oldState.channelId && !newState.channelId) { activeVoiceUsers--; console.log(`当前语音频道人数:${activeVoiceUsers}`); } });
3. 检查机器人服务器权限
确保机器人在目标服务器中拥有「查看频道」权限,否则无法接收该服务器的语音状态变更事件。
官方文档参考
Discord.js v13官方文档中对voiceStateUpdate事件的定义、参数说明以及Intents的要求,可在其官方文档的事件章节中查阅,核心内容包括事件触发条件、状态对象的属性说明。
内容的提问来源于stack exchange,提问作者ali-kingX
相关产品推荐
相关产品推荐

