如何在 Discord.py 中的 Cog 中加载扩展?

How can I load an extension inside a Cog in Discord.py?

我有一个文件 ticket.py,我目前正在使用 client.load_extension(ticket).

将命令加载到我的机器人中

ticket.py 看起来像这样:

@commands.command(name='ticket')
async def ticket(ctx,*, args=None):
    //do stuff

def setup(bot):
    bot.add_command(ticket)

然后我将其加载到主文件中:

client=commands.Bot(command_prefix='!')
client.load_extension("ticket")

工作正常,但目前,ticket 命令未与 Cog 相关联。我想知道如何将它加载到 Cog 中(例如,以便它与 Utilities Cog 相关联)。

通常,我会简单地在 class:

中定义命令
class Utilities(commands.Cog):
    @commands.command(name='ticket')
    async def ticket(self, ctx, *, args=None):
        //do stuff

但是,我的代码相当冗长乏味,我更愿意在单独的文件中处理它(因此 ticket.py,它在 main.py 之外)。

如何将 ticket 命令加载到 Utilities Cog 中? (同时保持 ticket.pymain.py 分开)。

您可以将命令的实际代码存储在其他文件中,然后直接从 cog 内部调用它。

假设这叫做 command_ticket.py 并且你有一堆随机参数:

async def _ticket(ctx, number: int, whatever: str, consume_rest: str):
    # do things

然后,您只需在 cog 中调用它即可:

import command_ticket
class MyCog(commands.Cog):
    @commands.command(name='ticket')
    async def ticket(ctx, number: int, whatever: str, *, consume_rest: str = None):
        command_ticket._ticket(ctx, number, whatever, consume_rest)

请注意,在这种情况下,无需为内部工单功能添加单独的扩展 - 您只需向 cog 注册该扩展即可。