Как вы создаете собственные декораторы для discord.py?

Я знаю, что задавал этот вопрос раньше, но новое обновление внезапно сломало мой код. Вот что у меня есть:

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__(self, bot: commands.Bot):
        self.bot = bot
        self.mod_role = ...

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

Раньше это работало, но теперь роль Moderation.mod_role изменилась с роли, определенной в функции, на None, поэтому команды не работают с людьми, даже если у них есть необходимая роль.

Я использую python 3.8 и discord.py 1.3.1.


person Nice Try NSA    schedule 18.02.2020    source источник
comment
Итак, вы использовали код другого человека (не принимая его ответ), а затем повторно разместили тот же код, спрашивая, как исправить это через несколько месяцев? Вы смотрели ссылки на документацию, которые они вам предоставили? Они упомянули, что смотрели Проверки, так что попробуйте это перед предполагая, что SO сделает всю работу за вас.   -  person APhillips    schedule 19.02.2020
comment
Отвечает ли это на ваш вопрос? Как создать собственный декоратор для discord.py?   -  person APhillips    schedule 19.02.2020
comment
Какая остальная часть вашей self.mod_role = ... строки? Вот что здесь на самом деле не удается.   -  person Patrick Haugh    schedule 19.02.2020


Ответы (1)


Я исправил проблему с помощью глобальных переменных. Вот мой код, если у кого-то еще есть эта проблема:

def has_mod_role():
    def predicate(ctx):
        return mod_role in ctx.author.roles
    return commands.check(predicate)


class Moderation(commands.Cog):
    mod_role = None

    def __init__(self, bot: commands.Bot):
        self.bot = bot
        global mod_role
        mod_role = ...

    @commands.command()
    @has_mod_role()
    async def command(self, ctx, ...):
        ...
person Nice Try NSA    schedule 19.02.2020