将具有角色的机器人命令列入黑名单?

Blacklisting bot commands with role?

您好,您是否可以按角色简单地将某人列入黑名单,禁止其使用所有机器人命令?我目前正在寻找一种方法来为我在 Discord 重写分支上的机器人执行此操作。

谢谢

最简单的方法可能是使用 global check,使用 bot.check 装饰器。以下操作基于角色 name,但您可以使用 id 编写等效版本:

from discord.utils import get

@bot.check
async def globally_blacklist_roles(self, ctx):
    blacklist = ["BAD_ROLE_1", "BAD_ROLE_2"]  # Role names
    return not any(get(ctx.guild.roles, name=name) in ctx.author.roles for name in blacklist)

例如,您可以通过为列入黑名单的角色缓存 Role 对象来实现一些加速。

如果您使用的是 cogs,您可以通过给它一个特殊的名称 __global_check_once__global_check 来表明您希望协程成为全局检查。这是documented here__global_check_once 似乎是您要查找的内容,但您可能想要进行试验。我认为唯一的区别是当你使用带有子命令的命令组时它被调用了多少次

class Blacklisted(commands.CheckFailure): pass

class YourCog:
    def __init__(self, bot):
        self.bot = bot

    def __global_check_once(self, ctx):
        blacklist = ["BAD_ROLE_1", "BAD_ROLE_2"]  # Role names
        if any(get(ctx.guild.roles, name=name) in ctx.author.roles for name in blacklist):
            raise Blacklisted()
        else:
            return True

    async def on_command_error(self, ctx, error):
        if isinstance(error, Blacklisted):
            await ctx.send("You cannot use this command.")
def __global_check_once(self, ctx):
    blacklist = ["Blacklisted", "Blacklist"]  # Role names
    return not any(get(ctx.guild.roles, name=name) in ctx.author.roles for name in blacklist)

async def __global_check_once_error(ctx, error):
    if isinstance(error, __global_check_once):
        await ctx.send('You cannot use that command!')