discord.py-rewrite - 如何在 cogs 中使用自定义检查?
discord.py-rewrite - How to use custom checks in cogs?
因此,在我的 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:
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
没有在我的检查和冷却时间中定义。谁能帮我解决这个问题?
方法在创建 class 对象时创建一次,而不是针对每个实例单独创建。您有几个选择:
- 将需要出现在这两个地方的代码提取到只包含该代码的第三个模块中,然后将其导入到您的其他两个文件中
- 将您的
Bot
定义从您的 bot 的执行移到一个单独的模块中,并使 my_check
成为 staticmethod
。然后你可以通过 Bot.my_check
而不是通过特定实例访问它。
- 在
setup
中定义您的 cog,以便 class 在创建时知道 bot
实例。
因此,在我的 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:
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
没有在我的检查和冷却时间中定义。谁能帮我解决这个问题?
方法在创建 class 对象时创建一次,而不是针对每个实例单独创建。您有几个选择:
- 将需要出现在这两个地方的代码提取到只包含该代码的第三个模块中,然后将其导入到您的其他两个文件中
- 将您的
Bot
定义从您的 bot 的执行移到一个单独的模块中,并使my_check
成为staticmethod
。然后你可以通过Bot.my_check
而不是通过特定实例访问它。 - 在
setup
中定义您的 cog,以便 class 在创建时知道bot
实例。