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

Wavelink 1.3.5:如何在曲目开始时发消息?解决ctx属性错误

Wavelink 1.3.5的默认Player类本身并不包含ctx属性,直接调用player.ctx自然会触发AttributeError。你需要在创建Player实例时手动绑定上下文,有两种可行方案:

方案一:使用自定义Player类扩展

通过继承wavelink.Player创建自定义类,在初始化时保存ctx:

import wavelink
from discord.ext import commands

class CustomPlayer(wavelink.Player):
    def __init__(self, ctx):
        super().__init__(ctx.guild.id)
        self.ctx = ctx  # 将命令上下文绑定到Player实例

# 播放命令中使用自定义Player
@bot.command()
async def play(ctx, *, query):
    player = ctx.guild.voice_client
    if not player:
        # 创建CustomPlayer并传入ctx
        player = await ctx.author.voice.channel.connect(cls=CustomPlayer, ctx=ctx)
    
    # 搜索并播放曲目
    track = await wavelink.YouTubeTrack.search(query, return_first=True)
    await player.play(track)

之后在事件处理中即可正常调用player.ctx:

@bot.event
async def on_wavelink_track_start(player, track):
    await player.ctx.send(f"🎵 开始播放:{track.title}")

方案二:手动为Player实例添加ctx属性

如果不想自定义Player类,可在创建Player后直接为实例添加ctx属性:

@bot.command()
async def play(ctx, *, query):
    player = ctx.guild.voice_client
    if not player:
        player = await ctx.author.voice.channel.connect(cls=wavelink.Player)
        player.ctx = ctx  # 手动绑定命令上下文
    
    track = await wavelink.YouTubeTrack.search(query, return_first=True)
    await player.play(track)

事件处理代码与方案一一致:

@bot.event
async def on_wavelink_track_start(player, track):
    await player.ctx.send(f"🎵 开始播放:{track.title}")

注意事项

  • 确保每个服务器的Player实例都绑定了对应命令的上下文,避免跨服务器发送消息错误。
  • 如果机器人在多服务器运行,两种方案都能保证上下文的独立性,因为都是在创建Player时绑定当前命令的ctx。

内容的提问来源于stack exchange,提问作者NotS1mp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 02:33:22