调用MusicBot方法时出现位置参数缺失错误求助
问题描述
调用MusicBot.play()时,MusicBot.on_wavelink_track_start()提示缺少必需的位置参数player;调用MusicBot.stop()时,MusicBot.on_wavelink_track_end()提示缺少player和reason参数,核对文档参数位置后仍未解决。
错误日志
INFO - discord.client : logging in using static token INFO - discord.gateway : Shard ID None has connected to Gateway (Session ID: 97560cd953************ac231ca3cb). INFO - bot : User: Bot#2026 (ID: 1085520364706222181) 2023-03-24 12:11:43 INFO cogs.music {} is ready ERROR - discord.client : Ignoring exception in on_wavelink_track_start Traceback (most recent call last): File "C:\Users\the00\Desktop\bot\env\Lib\site-packages\discord\client.py", line 441, in _run_event await coro(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ TypeError: MusicBot.on_wavelink_track_start() missing 1 required positional argument: 'player' ERROR - discord.client : Ignoring exception in on_wavelink_track_end Traceback (most recent call last): File "C:\Users\the00\Desktop\bot\env\Lib\site-packages\discord\client.py", line 441, in _run_event await coro(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ TypeError: MusicBot.on_wavelink_track_end() missing 2 required positional arguments: 'player' and 'reason'
相关代码
class MusicBot(commands.Cog): vc : wavelink.Player = None current_track = None music_channel = None history = None def __init__(self, bot): self.bot = bot self.history = list() async def setup(self): """ Connecting to lavalink """ node = wavelink.Node(uri="http://localhost:2333", password="mypass") await wavelink.NodePool.connect(client=self.bot, nodes=[node]) @commands.Cog.listener() async def on_wavelink_node_ready(self, node: wavelink.Node): logger.info(f"{node.players} is ready") @commands.Cog.listener() async def on_wavelink_track_start(self, track:wavelink.YouTubeTrack, player:wavelink.Player): await self.music_channel.send(f"{track.title} started playing") @commands.Cog.listener() async def on_wavelink_track_end(self, track:wavelink.YouTubeTrack, player:wavelink.Player, reason): await self.music_channel.send(f"{track.title} finished") await self.history.append(track.title) @commands.command() async def join(self, ctx): channel = ctx.message.author.voice.channel self.music_channel = ctx.message.channel if channel: self.vc = await channel.connect(cls=wavelink.Player) await ctx.send(f"Joined {channel.name}")
解决方案
问题出在Wavelink事件的参数顺序错误,调整事件回调的参数顺序即可解决:
on_wavelink_track_start的正确参数顺序是:player在前,track在后on_wavelink_track_end的正确参数顺序是:player在前,track中间,reason最后
修改后的事件代码如下:
@commands.Cog.listener() async def on_wavelink_track_start(self, player:wavelink.Player, track:wavelink.YouTubeTrack): await self.music_channel.send(f"{track.title} started playing") @commands.Cog.listener() async def on_wavelink_track_end(self, player:wavelink.Player, track:wavelink.YouTubeTrack, reason): await self.music_channel.send(f"{track.title} finished") self.history.append(track.title) # 列表append是同步操作,无需加await
补充说明
Wavelink触发事件时,第一个参数始终是触发该事件的Player实例,这是框架的设计规范,若你参考的旧文档存在参数顺序差异,以当前使用的Wavelink版本的官方定义为准。
内容的提问来源于stack exchange,提问作者rishi
相关产品推荐
相关产品推荐

