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
相关产品推荐
相关产品推荐

