Как создать собственный декоратор для discord.py? - PullRequest
0 голосов
/ 17 июня 2019

Я работаю над ботом.Для определенного винтика я хочу создать собственный декоратор проверки, который проверяет, играет ли человек, выполняющий команду, определенную роль.Роль хранится как класс роли в качестве переменной экземпляра.Когда я попытался запустить его, это не сработало.Как ты делаешь декоратор?

class Moderation(commands.Cog):
    def __init__(self, bot: commands.Bot):
        self.bot = bot
        self.mod_role = None  # Assume there's already a role here

    class Decorator:
        @classmethod
        def requires_mod(cls, func):
            async def decorator(self, ctx: commands.Context, *args, **kwargs):
                if self.mod_role not in ctx.author.roles:
                    await ctx.send("You do not have permission to use this command")
                func(ctx, *args, **kwargs)
            return decorator

    @commands.command()
    @Decorator.requires_mod
    async def purge(self, ctx: commands.Context, amt: int):
        await ctx.channel.purge(limit=amt+1)
        await ctx.send(f":white_check_mark: | Deleted {amt} messages.")

1 Ответ

1 голос
/ 18 июня 2019

Эта концепция встроена в расширение commands как Проверки

Даже специфичные для Cog проверки, такие как cog_check, не знают о Cogсам по себе: ни один из них не получает self в качестве аргумента.

Вам необходимо переписать чек так, чтобы он не зависел от self.Если вы знаете имена или идентификаторы ролей сейчас или при создании класса Moderation, вы можете использовать встроенную проверку has_any_role.

В противном случае проще всего использовать атрибут класса Moderation или глобальное значение для хранения роли:

from discord.ext import commands

def predicate(ctx):
    return Moderation.mod_role in ctx.author.roles

has_mod_role = commands.check(predicate)


class Moderation(commands.Cog):
    mod_role = None 

    def __init__(bot):
        self.bot = bot
        Moderation.mod_role = ... 

    @commands.command()
    @has_mod_role
    async def yourcommand(ctx, ...):
        ...
...