Discord机器人/info user命令判断新用户名时触发属性错误
问题解决:Discord机器人/info user命令新用户名判断逻辑失效及错误修复
错误根源分析
- 变量覆盖导致属性访问失败:原代码中满足条件时,将
member变量重新赋值为字符串(从discriminator处理而来),后续代码访问member.display_avatar、member.id等属性时,因字符串无这些属性直接报错。 - 新用户名判断逻辑错误:Discord新用户名系统的用户discriminator固定为
"0",而非简单以0结尾(旧系统用户也可能有discriminator以0结尾的情况)。 - 语法错误:原代码中
set_thumbnail的URL拼接多了一个右括号,导致URL格式错误。 - 未处理None值情况:若
member.discriminator为None,调用endswith方法会直接抛出AttributeError。
修复后的代码
@info.command(name="user", description="Mostra informações sobre um usuário") async def _info(self, interaction: discord.Interaction, member: discord.Member): await interaction.response.defer() # 判断是否使用新用户名系统 if member.discriminator == "0": display_username = member.name # 新用户名直接用唯一ID else: display_username = f"{member.name}#{member.discriminator}" # 旧用户名带 discriminator info_embed = discord.Embed(color=discord.Color.green()) info_embed.set_thumbnail(url=member.display_avatar.url) info_embed.add_field(name=":placard: Nome", value=f"```{display_username}```", inline=True) info_embed.add_field(name=":identification_card: Identidade", value=f"```{member.id}```", inline=True) info_embed.add_field(name=":link: Menção", value=f"{member.mention}", inline=True) created = member.created_at.timestamp() info_embed.add_field(name=":calendar_spiral: Conta Criada", value=f'<t:{int(created)}:F> (<t:{int(created)}:R>)', inline=True) joined = member.joined_at.timestamp() info_embed.add_field(name=":date: Entrou em", value=f'<t:{int(joined)}:F> (<t:{int(joined)}:R>)', inline=False) await interaction.followup.send(embed=info_embed)
关键修改说明
- 保留原Member对象:不再覆盖
member变量,而是创建display_username变量专门存储显示用的用户名,确保后续能正常访问用户的所有属性。 - 正确判断新用户名:直接对比
discriminator是否为"0",符合Discord新用户名系统的规则。 - 修复URL语法错误:移除了
set_thumbnail中多余的右括号,确保头像URL正确。 - 避免None值报错:通过直接对比字符串的方式,避免了调用
endswith可能引发的None值错误。
内容的提问来源于stack exchange,提问作者moguel
相关产品推荐
相关产品推荐

