Discord.py中on_member_update监听昵称变更运行异常报参数错误
问题原因
on_member_update 是discord.py的原生事件,本身不传递ctx上下文参数,仅会传入修改前的成员对象和修改后的成员对象两个参数。你的函数多定义了ctx参数,导致框架触发事件时传参数量不匹配,触发参数缺失报错。
修复方案
除了修正参数定义外,还需要同步调整依赖ctx的逻辑,同时优化原有代码的边界问题:
- 移除参数定义中的多余
ctx参数 - 替换Embed的时间戳来源,使用标准UTC时间即可
- 修正昵称判断逻辑,用户无服务器昵称时显示全局用户名,避免输出
None - 增加昵称变更判断,避免用户其他信息(如身份组、头像)变更时误触发通知
- 优化头像获取逻辑,适配默认头像场景避免报错
修复后代码
import discord from discord.ext import commands @commands.Cog.listener() async def on_member_update(self, member_before, member_after): # 仅昵称变更时触发通知 if member_before.nick == member_after.nick: return # 处理昵称展示逻辑,无昵称时显示全局用户名 nickname_before = member_before.nick if member_before.nick else member_before.name nickname_after = member_after.nick if member_after.nick else member_after.name embed = discord.Embed( timestamp = discord.utils.utcnow(), color = discord.Colour.random(), title = "成员昵称变更" ) embed.add_field(name = "变更前昵称", value = nickname_before, inline = True) embed.add_field(name = "变更后昵称", value = nickname_after, inline = True) embed.set_thumbnail(url = member_after.display_avatar.url) embed.set_author(name = f"{self.osamu.user}", icon_url = self.osamu.user.display_avatar.url) channel = self.osamu.get_channel(898199584726188042) await channel.send(embed = embed)
内容的提问来源于stack exchange,提问作者Itz-Toothless
相关产品推荐
相关产品推荐

