Discord Bot语音播放器执行stop指令无法停止问题求助
问题原因
你的代码存在4个核心问题导致stop指令失效:
stop指令的判断逻辑被嵌套在play baka radio的判断分支内部,只有发送内容完全匹配play baka radio时才会执行stop判断,单独发送stop消息根本进不到对应逻辑。player和语音连接connection是play分支内的局部变量,每次触发play都会生成新的实例,stop逻辑既拿不到正在运行的播放器实例,也不会被独立触发。player.stop()方法不需要传入resource参数,传入参数属于无效用法。- 代码里
message.channel.send(...) + player.play(resource)的写法存在语法错误,加号在这里没有任何实际逻辑作用,两个操作应该独立执行。
修复方案
你需要将语音连接、播放器实例按服务器维度做持久化存储,把stop指令的判断逻辑移到play分支外部独立执行,修正语法错误和错误的API调用。参考修复代码如下:
// 放在messageCreate事件监听外部,按服务器ID存储对应语音实例 const guildVoiceMap = new Map() client.on('messageCreate', async (message) => { const msgContent = message.content?.toLowerCase().trim() if (!msgContent) return // 播放指令逻辑 if (msgContent === 'play baka radio') { if (!message.member.voice?.channel) return message.channel.send('你需要先加入语音频道才能执行这个命令') const guildId = message.guildId // 存在旧播放实例时先清理,避免重复创建连接 if (guildVoiceMap.has(guildId)) { const oldIns = guildVoiceMap.get(guildId) oldIns.player.stop() oldIns.connection.destroy() } const connection = joinVoiceChannel({ channelId: message.member.voice.channelId, guildId: guildId, adapterCreator: message.guild.voiceAdapterCreator }) const player = createAudioPlayer() const resource = createAudioResource('https://nrf1.newradio.it:10328/alfaanime') connection.subscribe(player) // 存储当前服务器的语音实例 guildVoiceMap.set(guildId, { connection, player }) // 分开执行两个操作,移除错误的加号拼接 message.channel.send({ content: "正在播放", embeds: [embed2], files: ['./logo/bkrlogo.png'] }) player.play(resource) } // 停止指令逻辑,独立于播放分支判断 if (msgContent === 'stop') { const guildId = message.guildId const currentIns = guildVoiceMap.get(guildId) if (!currentIns) return message.channel.send('当前没有正在运行的语音播放任务') // stop方法无需传参 currentIns.player.stop() currentIns.connection.destroy() guildVoiceMap.delete(guildId) message.channel.send('已停止播放并退出语音频道') } })
补充说明
如果需要更稳定的运行效果,可以给player添加idle、error事件监听,在播放结束、出现异常时自动销毁连接、清理Map里存储的实例,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Danny Alvarado
相关产品推荐
相关产品推荐

