discord.py-rewrite - Как использовать пользовательские проверки в Cogs? - PullRequest
0 голосов
/ 03 мая 2019

Итак, в моем bot.py основном файле у меня есть:

class Bot(commands.Bot):

    # BOT ATTRIBUTES

    class default_cooldown:
        maxcommands = ...
        seconds = ...
        mode = ...

    class my_exception(commmands.CommandError): pass

    def my_check(self):
        def predicate(ctx):
            if ctx.author in a_list: return True
            raise self.my_exception

bot = Bot(...)

Теперь у меня также есть Cog-файл, в котором я хочу использовать проверку Bot().my_check() и мой класс Bot().default_cooldown():

class Cog(commands.Cog):

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

    @commands.command()
    @self.bot.my_check()
    @commands.cooldown(self.bot.default_cooldown().maxcommands, self.bot.default_cooldown().seconds, self.bot.default_cooldown().mode)
    async def a_command(self, ctx):
        pass

Но я получаю сообщение о том, что self не определено в моей проверке и перезарядке. Может кто-нибудь помочь мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Методы создаются один раз при создании объекта класса, а не индивидуально для каждого экземпляра. У вас есть несколько вариантов:

  1. Вынесите код, который должен появиться в обоих местах, в третий модуль, содержащий только этот код, а затем импортируйте его в оба ваших других файла
  2. Переместите ваше определение Bot в отдельный модуль от выполнения вашего бота и сделайте my_check a staticmethod. Затем вы можете получить к нему доступ через Bot.my_check вместо определенного экземпляра.
  3. Определите свой Cog внутри setup, чтобы класс знал об экземпляре bot при его создании.
0 голосов
/ 03 мая 2019

Хорошо, спасибо.Поэтому, если я напишу свои чеки в другом файле, это будет выглядеть так:

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

    def my_check(self):
        def predicate(ctx):
            if ctx.author.id in self.bot.a_list: return True
            raise self.bot.my_exception

, а затем как мне получить доступ к my_check() в моем Cog?

...