Discord.js机器人实现跟随特定用户加入语音频道的问题求助
Discord.js 机器人实现指定用户语音跟随的解决方案
核心优化思路
不用遍历频道成员列表,voiceStateUpdate事件的oldState和newState本身就对应单个用户的状态变更,直接通过newState.member.id判断是否为目标用户即可,逻辑更简洁高效。
完整实现步骤与代码
- 定义目标用户ID常量
const TARGET_USER_ID = '替换为你要跟随的用户ID';
- 完善语音状态监听逻辑
client.on('voiceStateUpdate', async (oldState, newState) => { // 仅处理目标用户的状态变更 if (newState.member.id !== TARGET_USER_ID) return; // 目标用户离开语音频道时,机器人退出对应频道 if (newState.channelId === null) { if (oldState.guild.members.me.voice.channelId) { await oldState.guild.members.me.voice.disconnect(); console.log('目标用户离开,机器人退出频道'); } return; } // 目标用户从无频道状态加入新频道时,机器人跟进 if (oldState.channelId === null) { await newState.channel.join(); console.log('目标用户加入频道,机器人已跟进'); return; } // 目标用户切换频道时,机器人同步切换 if (oldState.channelId !== newState.channelId) { if (oldState.guild.members.me.voice.channelId) { await oldState.guild.members.me.voice.disconnect(); } await newState.channel.join(); console.log('目标用户切换频道,机器人已跟进'); } });
关键细节说明
- 用
async/await处理异步操作:join()和disconnect()都是异步方法,确保操作执行顺序正确。 - 避免重复操作:每次执行前判断机器人当前的语音状态,防止重复调用
join()引发异常。 - 覆盖全场景:包含用户加入、离开、切换频道三种核心场景,保证跟随逻辑完整。
内容的提问来源于stack exchange,提问作者ArvikDev
相关产品推荐
相关产品推荐

