Черный список команд ботов с ролью? - PullRequest
0 голосов
/ 15 октября 2018

Привет. В любом случае, вы могли бы просто занести кого-нибудь в черный список, используя все команды ботов по ролям?В настоящее время я ищу способ сделать это для своего бота, который находится в ветке переписывания Discord.

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 октября 2018
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!')
0 голосов
/ 15 октября 2018

Самый простой способ, если возможно, использовать глобальную проверку , используя декоратор 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.Это задокументировано здесь .Похоже, что __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.")
...