【问题标题】:Why does my bot break after I add @commands.has_permissions(administrator=True)?为什么我添加 @commands.has_permissions(administrator=True) 后我的机器人会中断?
【发布时间】:2021-07-15 02:53:38
【问题描述】:

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

@commands.has_permissions(administrator=True)

然后代码中断,我得到这个错误:

文件“C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\discord\abc.py”,第 427 行,在 permissions_for 角色 = member.roles AttributeError:“用户”对象没有属性“角色”

但问题是错误不在机器人代码所在的文件中。错误出现在一些随机的站点包文件夹中。

整个命令代码:

@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")

【问题讨论】:

  • 您确定错误中的所有行都没有引用您的代码吗?
  • 是的,因为代码只有 70 行
  • 尝试删除@commands.has_permissions 装饰器,然后执行print(type(ctx), type(ctx.author), type(ctx.message.author))
  • 这是我运行命令时得到的:

标签: python discord discord.py


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我没有在代码中的任何地方添加 commands.Context,所以我认为这不应该是问题所在。第二个原因,我不知道装饰器命令是什么。我已将帖子编辑为命令的完整代码。
  • 最简单的解释是在DM中调用了该命令
  • 这个命令是在测试服务器中使用的,而不是在 dms 中。
猜你喜欢
  • 2021-05-22
  • 2020-04-07
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
相关资源
最近更新 更多