Wavelink中on_wavelink_track_end失效,队列歌曲无法自动播放如何修复?
修复音乐Bot队列后续歌曲无法自动播放的问题
问题现象
- 播放完一首歌曲后,队列中的后续歌曲无法自动播放。
问题分析
- 监听器参数错误:
on_wavelink_track_end的参数列表中包含了不存在的interaction参数,Wavelink的on_track_end事件触发时不会传入交互对象,导致后续调用interaction.response.send_message抛出异常,直接中断了自动播放逻辑。 - 冗余变量与类型注解错误:代码中重复获取
vc变量且类型注解错误,实际上可以直接使用事件传入的player参数完成操作,无需重复获取。 - 消息发送方式错误:在非用户交互触发的事件中,使用
interaction.response.send_message是无效的,该方法仅适用于用户发起的交互命令上下文。
修复步骤
- 修正
on_wavelink_track_end的参数列表,移除错误的interaction参数。 - 删除冗余的
vc变量,直接使用事件传入的player对象执行播放操作。 - 将消息发送方式替换为通过服务器系统频道发送(或其他指定频道),避免依赖无效的交互上下文。
- 调整
loop属性的初始化位置,避免覆盖已有的循环状态设置。
修改后的代码
1. 修正后的on_wavelink_track_end监听器
@commands.Cog.listener() async def on_wavelink_track_end(self, player: wavelink.Player, track: wavelink.YouTubeTrack, reason): if player.loop: return await player.play(track) if not player.queue.is_empty: next_song = await player.queue.get_wait() await player.play(next_song) # 发送播放通知到服务器系统频道(若频道存在) if player.guild.system_channel: await player.guild.system_channel.send(f"正在播放 🎵 {next_song.title}")
2. 调整后的play命令
@app_commands.command(name="play", description="播放") @app_commands.describe(search="搜尋") async def play(self, interaction : discord.Interaction, search: str): guild = interaction.guild track = await wavelink.YouTubeTrack.search(search, return_first=True) if not guild.voice_client: vc: wavelink.Player = await interaction.user.voice.channel.connect(cls=wavelink.Player) # 仅在创建新播放器时初始化loop属性 setattr(vc, "loop", False) else: vc: wavelink.Player = guild.voice_client if vc.queue.is_empty and not vc.is_playing(): await vc.play(track) await interaction.response.send_message(f"正在播放 🎵 {track.title}") else: await vc.queue.put_wait(track) await interaction.response.send_message(f'新增 🎵 {track.title} 至佇列')
内容的提问来源于stack exchange,提问作者ezak
相关产品推荐
相关产品推荐

