Discord.js v13多音乐bot使用@discordjs/voice连接语音频道异常问题
问题根源
你遇到的多bot接入语音频道冲突是@discordjs/voice库的分组机制导致的:该库本身不自动关联你创建的Discord.Client实例,默认所有语音连接请求共享同一个全局分组,同服务器下的连接会被直接复用,不会区分请求来自哪个bot客户端。你打印的bot ID正确只能说明你上层触发逻辑的实例是对的,但语音库层面没有做实例隔离,所以会复用第一个bot的已存在连接。
修复方法
你只需要给joinVoiceChannel方法新增group参数,用每个bot的唯一ID作为分组值,就能实现不同bot的语音连接完全隔离。
另外需要确保你传入的adapterCreator参数是从当前调用请求对应的botClient实例中获取的对应服务器的适配器,不能混用其他bot的适配器,正确的获取方式为botClient.guilds.cache.get(guildID).voiceAdapterCreator。
修改后核心代码
function playMusic(bot, botClient, channel, guildID, adapterCreator) { try { console.log("BOT ID: " + bot.id); console.log("BOT USER ID: " + botClient.user.id); let vc = joinVoiceChannel({ channelId: channel.id, guildId: guildID, adapterCreator: adapterCreator, group: botClient.user.id // 新增分组参数,用bot自身ID隔离连接 }); let resource = createAudioResource(createReadStream('resources/audio.mp3'), { inlineVolume : true }); var player = createAudioPlayer(); vc.subscribe(player); player.play(resource); return player; } catch(ex) { console.log(ex); return undefined; } }
配套注意事项
后续你需要获取/销毁指定bot的语音连接时,也需要传入对应的group参数,否则会拿错其他bot的连接,示例:
// 获取指定bot在指定服务器的连接 const connection = getVoiceConnection(guildID, botClient.user.id); // 销毁连接 connection?.destroy();
内容的提问来源于stack exchange,提问作者C3010
相关产品推荐
相关产品推荐

