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