You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:35:18