我怎么能有两个相互对抗的命令装饰器?

时间:2021-03-24 06:45:34

标签: python discord discord.py

我有一个命令可以删除用户输入的指定数量的消息。我希望只有我和具有管理员角色的人才能访问此命令。我以前用 if 语句实现过这个,它工作得非常好。但是,现在我正在尝试使用命令装饰器来做同样的事情,它只允许管理员使用命令 - 而不是我。这是我正在使用的代码:

@bot.command(description="clears entered amount of messages")
@commands.is_owner() # checks if user is owner
@commands.has_permissions(administrator=True) # checks if user is admin
async def delete(ctx, amount : int):
    await ctx.channel.purge(limit = amount + 1)

我认为 @commands.has_permissions(administrator=True) 阻止了我使用该命令,因为我不是其中一台服务器的管理员。我试过改变他们的订单,is_owner() 支票低于 has_permissions() 支票;尽管如此,它仍然不允许我使用该命令。如何使用装饰器克服这个问题?

3 个答案:

答案 0 :(得分:1)

您可以创建一个自定义装饰器来检查您是机器人的所有者还是管理员

def owner_or_admin():
    def predicate(ctx):
        owner = ctx.author.id == bot.owner_id # Comparing the author of the message with the owner of the bot
        perms = ctx.author.guild_permissions.administrator # Checking for admin perms
        return owner or perms
    return commands.check(predicate)


@bot.command(description="clears entered amount of messages")
@owner_or_admin()
async def delete(ctx, amount : int):
    await ctx.channel.purge(limit = amount + 1)

编辑:我刚刚发现 commands.check_any - 检查是否有任何通过的检查会通过,即使用逻辑 OR

@bot.command()
@commands.check_any(commands.is_owner(), commands.has_permissions(administrator=True))
async def delete(ctx, amount: int):
    await ctx.channel.purge(limit=amount + 1)

答案 1 :(得分:0)

这对我来说似乎不一样,

@bot.command(description="clears entered amount of messages")
@commands.is_owner() # checks if user is owner
@commands.has_permissions(administrator=True) # checks if user is admin
async def delete(ctx, amount : int):
    await ctx.channel.purge(limit = amount + 1)

我可以清除消息。 我怀疑你没有正确设置你的不和谐权限, 尝试确保您已启用manage_messages权限

阅读 Discord API 了解更多信息

答案 2 :(得分:0)

感谢@ŁukaszKwieciński,我了解到我需要制作一个自定义装饰器来检查机器人所有权和管理员角色,如果两者都为 False,则返回 False,如果为 True其中之一为真。

def owner_or_admin():
    def predicate(ctx):
        owner = False
        perms = False
        if ctx.author.id == bot.owner_id:
            owner = True
        if ctx.author.guild_permissions.administrator:
            perms = True 
        return owner or perms
    return commands.check(predicate)

@bot.command(description="clears entered amount of messages")
@owner_or_admin()
async def delete(ctx, amount : int):
    await ctx.channel.purge(limit = amount + 1)