如何在discord.py机器人断开语音频道时清空队列?
解决discord.py机器人断开语音频道时清空播放队列的问题
首先要明确几个核心要点:
on_voice_state_update会触发服务器内所有成员的语音状态变化,必须先判断触发事件的成员是机器人自身- 要检测的是「之前在语音频道,之后完全退出」的状态变化,和你写的条件逻辑相反
下面是修正后的可运行代码示例:
@bot.event async def on_voice_state_update(member, before, after): # 只处理机器人自身的状态变更 if member.id != bot.user.id: return # 判断机器人是否从语音频道断开(之前在VC,之后不在任何VC) if before.channel is not None and after.channel is None: # 假设你用字典存储各服务器的播放队列,key为服务器ID,value为队列列表 guild_id = before.channel.guild.id if guild_id in bot.guild_queues: bot.guild_queues[guild_id].clear() # 可选:打印日志确认队列清空 print(f"已清空服务器 {guild_id} 的播放队列") # 如果是单服务器机器人,直接操作全局队列即可: # bot.queue.clear()
关键细节说明:
- 你原代码里的
before.voice是错误属性,正确获取语音频道的属性是before.channel和after.channel - 播放队列的存储方式根据你的实际代码调整,要是单服务器机器人,直接用全局列表存储队列,清空时执行
队列列表.clear()即可 - 确保队列对象是可修改的类型(比如Python列表),这样
clear()方法才能生效
内容的提问来源于stack exchange,提问作者MrPepe
相关产品推荐
相关产品推荐

