Wavelink 1.3.5:如何在曲目开始时发消息?解决ctx属性错误
解决Wavelink 1.3.5中Player无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
相关产品推荐
相关产品推荐

