如何在Python中为Discord机器人创建一个重新加载命令?

3
我正在尝试找出如何创建一个命令来“重新加载”Discord机器人的命令,并允许我在添加新命令时保持机器人运行状态。这可以让我的生活更轻松,因为我不必重新启动机器人。我正在使用discord.py库与discord API进行交互。如何实现这一点?
2个回答

7

也许这个问题已经晚了,但我还是会回答它。

你应该查看Discord.py中所谓的“Cogs”是如何工作的。Rapptz的机器人(主要维护Discord.py的家伙)有一些很好的例子展示如何将你的机器人组织成Cogs,以及如何加载/卸载/重新加载它们(请参见cogs/admin.py)。

@commands.command(hidden=True)
@checks.is_owner()
async def load(self, *, module : str):
    """Loads a module."""
    try:
        self.bot.load_extension(module)
    except Exception as e:
        await self.bot.say('\N{PISTOL}')
        await self.bot.say('{}: {}'.format(type(e).__name__, e))
    else:
        await self.bot.say('\N{OK HAND SIGN}')

@commands.command(hidden=True)
@checks.is_owner()
async def unload(self, *, module : str):
    """Unloads a module."""
    try:
        self.bot.unload_extension(module)
    except Exception as e:
        await self.bot.say('\N{PISTOL}')
        await self.bot.say('{}: {}'.format(type(e).__name__, e))
    else:
        await self.bot.say('\N{OK HAND SIGN}')

@commands.command(name='reload', hidden=True)
@checks.is_owner()
async def _reload(self, *, module : str):
    """Reloads a module."""
    try:
        self.bot.unload_extension(module)
        self.bot.load_extension(module)
    except Exception as e:
        await self.bot.say('\N{PISTOL}')
        await self.bot.say('{}: {}'.format(type(e).__name__, e))
    else:
        await self.bot.say('\N{OK HAND SIGN}')

来自cogs/admin.py的代码片段


自从什么时候异常处理是在命令本身而不是其错误处理程序中处理的? - Platon Makovsky

1
你可以直接使用discord.py中的基本重新加载功能。
下面是一个示例,展示了我的“reload”命令是如何完成的。
@bot.command()
@commands.is_owner()
async def reload(ctx, extension):
    bot.reload_extension(f"cogs.{extension}")
    embed = discord.Embed(title='Reload', description=f'{extension} successfully reloaded', color=0xff00c8)
    await ctx.send(embed=embed)

当cog重新加载时发送一个嵌入式消息,但您始终可以执行ctx.send(f'{extension} reloaded)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接