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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:53:09