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

discord.py机器人检测用户名变更返回None的修复及TBU角色分配问题

问题原因

Discord.py库中,当用户未设置服务器昵称时,member.nick属性会返回None,你现有代码未对空值做处理,直接对None执行字符串包含判断、Embed字段赋值操作时就会触发报错。

修复要点

  • 对nick属性做空值兜底,无昵称时默认替换为用户全局用户名member.name,既解决了None报错问题,也符合你需要同时检测昵称、全局用户名是否包含TBU的需求
  • 简化冗余代码,无需重复调用get_user、get_channel方法获取相同的通知对象
  • 优化TBU检测逻辑的分支判断,避免重复触发相同通知

修复后完整代码

@client.event
async def on_member_update(before, after):
    # 昵称无变化直接跳过执行
    if before.nick == after.nick:
        return
    
    # 空昵称兜底,无服务器昵称时取用户全局用户名
    before_nick = before.nick if before.nick is not None else before.name
    after_nick = after.nick if after.nick is not None else after.name
    
    # 构建通知Embed
    embed = discord.Embed(title=f"昵称变更")
    embed.add_field(name='用户', value=before.mention)
    embed.add_field(name='变更前', value=before_nick)
    embed.add_field(name='变更后', value=after_nick)
    
    # 仅获取一次通知对象
    notify_channel = client.get_channel(526517582963146762)
    admin_user = client.get_user(174749290902716417)
    
    # 发送基础变更通知
    await notify_channel.send(embed=embed)
    await admin_user.send(embed=embed)
    
    # TBU检测逻辑,后续可替换为角色增减逻辑
    if "TBU" in after_nick:
        await admin_user.send(f"检测到用户{before.mention}的名称新增TBU标识", embed=embed)
    elif "TBU" in before_nick and "TBU" not in after_nick:
        await admin_user.send(f"检测到用户{before.mention}的名称移除了TBU标识", embed=embed)

后续角色功能实现提示

需要分配/移除角色时,可参考以下逻辑实现,注意提前确认bot拥有管理角色权限,且bot的角色层级高于目标TBU角色:

# 替换为你的TBU角色ID
TBU_ROLE_ID = 你自己的角色ID
tbu_role = after.guild.get_role(TBU_ROLE_ID)

if "TBU" in after_nick and tbu_role not in after.roles:
    await after.add_roles(tbu_role)
elif "TBU" not in after_nick and tbu_role in after.roles:
    await after.remove_roles(tbu_role)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 05:21:04