discord.py-rewrite-如何在齿轮中使用自定义检查?

时间:2019-05-03 08:52:51

标签: discord discord.py discord.py-rewrite

因此,在我的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 个答案:

答案 0 :(得分:1)

方法在创建类对象时创建一次,而不是为每个实例单独创建。您有两种选择:

  1. 将需要在两个位置出现的代码找出到仅包含该代码的第三个模块中,然后将其导入到其他两个文件中
  2. Bot的定义移至与执行机器人程序不同的模块中,并将my_check设为staticmethod。然后,您可以通过Bot.my_check而不是通过特定实例来访问它。
  3. setup内定义齿轮,以使类在创建bot实例时就知道。

答案 1 :(得分:0)

好的,谢谢。因此,如果我在另一个文件中写入支票,它会像这样:

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()