gpt4 book ai didi

python - 如何在 discord.py 中使用 cogs?

转载 作者:行者123 更新时间:2023-12-03 22:46:06 24 4
gpt4 key购买 nike

我有一个相当大的 Discord 机器人。它有超过 1000 行代码。当我在 Youtube 和这里​​研究如何做到这一点时,似乎没有任何效果。我想知道是否有人可以解释如何正确使用齿轮,可能是照片示例。我可以展示我有什么代码来帮助你理解我想要什么。
一个例子是,我想把我所有的 mod 命令放在一个单独的文件中,这样它就更干净、更有条理了。那么,我该怎么做呢?这是我的代码示例:
我想使用 cog 移动到单独的文件的 Mod 命令

我目前拥有的进口

前缀和目录

调用 token ID - token ID 在上面,未显示在照片中:

我不确定如何完全启动一个 cog,还有什么要导入,如何调用文件。我非常了解 Java,但我正在尝试使用 Discord 来提高我的 Python 技能。

最佳答案

笔记:

下面是为较旧的 0.16 版本编写的,该版本没有良好的齿轮文档。新的 1.0 版本有很好的文档,并且彻底改变了 cogs 的结构。如果您使用的是 的现代版本,则应查阅 official documentation

介绍

每个 cog 都有两部分:一个类和一个 setup 函数。几乎所有 setup 函数看起来都一样:

def setup(bot):
bot.add_cog(Cog(bot))

其中 Cog 是 cog 类。

cog 类包含我们所有的命令和事件作为方法。

主要变化

要将机器人更改为齿轮,您需要执行四个主要转换:
  • bot.command 替换为 commands.command ( commandsfrom discord.ext import commands )
  • 更改函数的签名以在开头包含 self,因为您的所有命令和事件现在都是 cog 类
  • 的方法
  • 将所有对 bot 的引用更改为引用 self.bot 而不是
  • 删除所有 bot.event 装饰器。来自您的 cog 的事件监听器仅在名称上注册

  • 还有一些问题:
  • 从您的 cog 中的任何 await bot.process_commands(message) 事件中删除 on_message。对于任何消息,这应该只等待一次。默认的 on_message 已经为你做了这件事。
  • 通过 cog 注册事件不会从主文件或其他 cog 中删除与该事件相关的其他回调。这意味着您的机器人可以多次响应 on_member_join 事件,例如,如果您在多个位置定义了该事件的行为。

  • 例子

    假设您在 bot.py 目录中有以下 discord.py bot, src :
    from discord.ext import commands

    bot = commands.Bot(command_prefix='!')

    @bot.command(pass_context=True)
    @commands.has_role("Mod")
    async def acommand(ctx, argument):
    await bot.say("Stuff")

    @bot.event
    async def on_message(message):
    print(message.content)
    await bot.process_commands(message)

    bot.run("token")

    然后将该功能分解为 cog src/cogs/maincog.py
    from discord.ext import commands

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

    @commands.command(pass_context=True)
    @commands.has_role("Mod")
    async def acommand(self, ctx, argument):
    await self.bot.say("Stuff")

    async def on_message(self, message):
    print(message.content)

    def setup(bot):
    bot.add_cog(MainCog(bot))

    你的 bot.py 文件看起来像
    from discord.ext import commands

    bot = commands.Bot(command_prefix='!')

    bot.load_extension("cogs.maincog")

    bot.run("token")

    请注意,要在 cogs/maincog.py 加载扩展,我们使用 load_extension("cogs.maincog")

    其他特性

    Cogs 还允许您定义一些特殊的方法。其中大部分仅在 中可用,并记录在 here 中。
  • __global_check ,以前的 __check ,在每个命令之前运行,并且必须返回 True 才能继续执行该命令。
  • __local_check 仅在来自该 cog 的命令之前运行。
  • __global_check_once 我相信这与 __global_check 类似,只是它在子命令的情况下只检查一次。我没用过这么多。
  • __unload 您可以通过卸载扩展然后重新加载来实时刷新您的机器人,从而使您无需让机器人离线即可更新您的齿轮。当您卸载扩展或当您的机器人停止运行时调用此方法,以防您需要进行清理。
  • __before_invoke__after_invoke 分别在来自该 cog 的每个命令之前和之后运行。
  • __error 是来自这个 cog 的命令的错误处理程序。
  • 关于python - 如何在 discord.py 中使用 cogs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53528168/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com