如何在 discord.py 中检查特定用户的权限

How to check permissions of a specific user in discord.py

我有一个 discord 审核机器人,禁止功能的代码是这样的:

    @client.command(name="ban")
async def banpeep(ctx,member: discord.Member, *reason):
    if has_permissions(ban_members=True) or has_permissions(administrator=True): 
        reason=' '.join(reason)
        if reason == '':
            reason = "Deserves to be banned"
        await member.ban(reason=reason)
        embed=discord.Embed(title=f"Banned {member} for reason: "+reason,color=0x72d345)
        await ctx.send(embed=embed)
        message=ctx.message
        await message.add_reaction(str(""))
        if not member.bot:
            await member.send(f"You have been banned from the server by {ctx.author} for reason: {reason}")
    elif has_permissions(ban_members=False) and has_permissions(administrator=False):
        embed = discord.Embed(title="You don't have permission to ban members!",color=0x72d345)
        await ctx.send(embed=embed)

抱歉,Whosebug 破坏了我的缩进,但您可以看出我的意图。错误是 has_permissions() 检查机器人的权限,而不是用户的权限。我想检查作者是否有权禁止成员或者是管理员。我最近发现了这个错误,一个普通用户通过发送此命令来禁止我服务器的一半成员。我是从 discord.commands import has_permissions 开始做的,所以这就是我不做 commands.has_permissions 的原因。如何检查特定用户的权限?我会做类似 ctx.author.check_permissions() 之类的事情吗?我想像 has_permissions 一样获取数据。我花了 3 个多小时查看堆栈溢出答案和文档,但所有这些都不适合我正在做的事情,或者只是过时了。我不知道这是否是重写,但我是从源代码安装的,所以我认为它是重写。

你应该用这样的方式开始命令:

@client.command(aliases=['purge'])
@commands.has_permissions(manage_messages=True)
async def clear(self, ctx, amount=5):
  Code goes here

这将检查用户是否具有括号中指定的权限。有错就加上这个

@ban.error
async def ban_error(self, ctx, error):
    if isinstance(error, commands.MissingPermissions):
        await ctx.send('Sorry you are not allowed to use this command!')

has_permissions() 装饰器应该像这样位于异步语句的顶部。

@client.command(name = "ban")
@has_permissions(ban_members = True)
async def banpeep(ctx, member: discord.Member, *, reason):

另请注意,如果用户拥有 administrator 权限,他们将拥有 ban_member 权限。