为什么我添加 @commands.has_permissions(administrator=True) 后我的机器人会崩溃?

时间:2021-04-20 22:09:12

标签: python discord discord.py

机器人工作得很好,但是当我添加时

@commands.has_permissions(administrator=True)

然后代码中断,我收到此错误:

文件“C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\abc.py”,第 427 行,在权限中 角色 = 成员.角色 AttributeError: 'User' 对象没有属性 'roles'

但问题是错误不在机器人代码所在的文件中。错误位于某个随机的站点包文件夹中。

整个命令代码:

@client.command(aliases=["Server"])
@commands.has_permissions(administrator=True) 
async def ServerInfo(ctx):
  guild = ctx.guild
  embed = discord.Embed(title="Server Info", colour = 0xFF0000, timestamp=datetime.datetime.utcnow())
  embed.add_field(name = "Server name:", value = f"{guild.name}", inline = False)
  embed.add_field(name = "Members:", value = f"{len(guild.members)}", inline = False)
  embed.add_field(name = "Boosters", value = f"{guild.premium_subscribers}", inline = False)
  await ctx.send(embed=embed)
  print("ServerInfo works")

1 个答案:

答案 0 :(得分:1)

这非常非常奇怪。我将尝试解释为什么会发生这种情况,但我需要的信息不仅仅是一行代码。如果你能用完整的命令更新你的帖子,那会很有帮助。

该错误是由于尝试从 .roles 对象获取 discord.User 所致。只有 discord.Member 对象具有 .roles 属性。您添加的装饰器将检查 ctx.author.roles,其中 ctx.author 应该discord.Member。显然不是。

以下是我能想到的几个可能的原因:

  • 您使用自己创建的 commands.Context 调用了该命令,并为其指定了用户而不是成员。
  • 您没有将装饰器添加到命令中。如果您将此装饰器置于诸如 reaction_add 之类的事件上,并且消息作者已离开服务器,则可能会发生这种情况。

一个好的起点是移除装饰器,然后打印 ctxctx.message.authorctx.author 的类型。