如何使用Discord.js v13实时获取语音频道成员的说话状态
如何用Discord.js v13实时检测语音频道成员的说话状态
如果你想在自己的Discord.js v13应用里复现Discord自带的“绿圈说话状态”效果,实时检测语音频道里每位成员的说话状态,其实可以借助@discordjs/voice库来实现——这也是我后来解决这个问题的关键方向,参考了Recorder BOT的示例代码后,整理出了可行的实现方案,下面直接上代码和关键点说明:
const { Client, Intents, VoiceChannel } = require('discord.js') const { joinVoiceChannel, getVoiceConnection, entersState, VoiceConnectionStatus } = require('@discordjs/voice'); const client = new Client({ intents: ['GUILD_VOICE_STATES', 'GUILD_MESSAGES', 'GUILDS'] }); client.on("messageCreate", async (message) => { if(message.content.toLowerCase() === "test") { // 检查是否已有语音连接 var connection = getVoiceConnection(message.guildId) if(!connection){ // 加入当前用户所在的语音频道 connection = joinVoiceChannel({ channelId: message.member.voice.channelId, guildId: message.guildId, adapterCreator: message.guild.voiceAdapterCreator, selfDeaf: false, selfMute: true, // 机器人静音避免干扰频道成员 }); } try { // 等待连接进入就绪状态 await entersState(connection, VoiceConnectionStatus.Ready, 20e3); // 监听成员开始说话的事件 connection.receiver.speaking.on("start", (userId) => { console.log( `${userId} 开始说话了` ); }); // 监听成员停止说话的事件 connection.receiver.speaking.on("end", (userId) => { console.log( `${userId} 停止说话了` ); }); console.log( "已准备好检测说话状态" ); } catch (error) { console.warn("连接语音频道出错:", error); } } }); client.login('YOUR-TOKEN')
关键要点说明:
- 权限与意图:必须启用
GUILD_VOICE_STATES、GUILDS和GUILD_MESSAGES这几个Intents,否则机器人无法获取语音状态和消息事件。 - 语音连接:通过
joinVoiceChannel让机器人加入目标语音频道,设置selfMute: true是为了让机器人静音,避免干扰频道内的正常交流。 - 说话状态监听:核心是
connection.receiver.speaking这个事件发射器,它会在成员开始说话(start事件)和停止说话(end事件)时触发,你可以在这两个事件回调里处理自己的业务逻辑,比如更新UI上的“绿圈”状态标识。
内容的提问来源于stack exchange,提问作者kjmtks
相关产品推荐
相关产品推荐

