能否检测Discord用户修改用户名(非昵称)并推送消息到指定频道?
问题原因
你当前使用的display_name属性是服务器专属的用户昵称,只有用户在当前服务器修改了自己的专属昵称时才会触发变更,自然检测不到全局用户名的改动。
Discord 目前有三类用户名称属性,差异如下:
display_name:用户在当前服务器的专属昵称,优先级最高,未自定义时等同于全局显示名global_name:用户的全局显示名,所有服务器默认展示的名称,可随时修改name:用户的唯一账号用户名(@后面的ID,新用户无#后缀),修改频率较低
修复方案
如果你需要监听全局用户名/显示名的变更,优先使用 on_user_update 事件,该事件会在用户修改全局资料时触发,不受单服务器限制。
另外你现有代码中还存在新旧名称写反的问题,修改后的代码示例如下:
# 监听全局用户资料变更(discord.py v2.0+ 支持) @client.event async def on_user_update(before, after): # 检测全局显示名变更 if before.global_name != after.global_name: embed = discord.Embed(colour=discord.Colour.from_rgb(162, 28, 29), title=f"用户全局显示名变更") embed.add_field(name='修改前', value=before.global_name if before.global_name else before.name) embed.add_field(name='修改后', value=after.global_name if after.global_name else after.name) channel = client.get_channel(你的频道ID) await channel.send(embed=embed) # 检测唯一用户名变更 if before.name != after.name: embed = discord.Embed(colour=discord.Colour.from_rgb(162, 28, 29), title=f"用户唯一用户名变更") embed.add_field(name='修改前', value=f"{before.name}#{before.discriminator}" if before.discriminator != "0" else before.name) embed.add_field(name='修改后', value=f"{after.name}#{after.discriminator}" if after.discriminator != "0" else after.name) channel = client.get_channel(你的频道ID) await channel.send(embed=embed) # 如果你同时需要保留服务器昵称变更的检测,可以保留原事件做修正 @client.event async def on_member_update(before, after): if before.display_name != after.display_name: embed = discord.Embed(colour=discord.Colour.from_rgb(162, 28, 29), title=f"用户服务器昵称变更") embed.add_field(name='修改前', value=before.display_name) embed.add_field(name='修改后', value=after.display_name) channel = client.get_channel(你的频道ID) await channel.send(embed=embed)
注意事项
如果你的discord.py版本低于2.0,需要先升级库版本才能使用on_user_update事件,低版本可以在on_member_update事件中额外判断before.name/before.global_name和对应after属性的差异来实现全局变更检测。
内容的提问来源于stack exchange,提问作者Connor Hancock
相关产品推荐
相关产品推荐

