discord.py音乐机器人播放状态检测与队列自动播放问题处理
问题原因
你当前的逻辑错误出在入队判断条件:仅判断ctx.voice_client.source是否存在,但歌曲播放完毕后,source对象不会自动销毁,只是播放器停止了输出,所以哪怕没有正在播放的音频,也会触发入队逻辑。
修复方案
discord.py的VoiceClient内置了播放状态检测方法,直接调用即可判断当前是否有活跃的播放任务:
is_playing():返回True表示当前正在播放音频is_paused():返回True表示当前音频处于暂停状态、尚未播放结束
你只需要修改play命令中的入队判断条件即可,修改后的代码如下:
@commands.command() async def play(self, ctx, *, song=None): if song is None: return await ctx.send("你得告诉我要播放什么我才能放歌") if ctx.voice_client is None: return await ctx.send("你都不在语音频道里,我放歌给谁听啊?") if not("youtube.com/watch?" in song or "https://youtu.be/" in song): await ctx.send("正在搜索歌曲,请稍等") result = await self.search_song(1, song, get_url=True) if result is None: return await ctx.send("找不到你说的这首歌,试试重新输入正确的歌名搜索?") song = result[0] # 仅当当前正在播放/暂停时才将歌曲入队 if ctx.voice_client.is_playing() or ctx.voice_client.is_paused(): queue_len = len(self.song_queue[ctx.guild.id]) self.song_queue[ctx.guild.id].append(song) return await ctx.send(f"歌曲已加入队列,当前排位 {queue_len+1}。") await self.play_song(ctx, song) await ctx.send(f"现在播放:{song}")
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

