如何在discord.py中使用齿轮?

Ana*_*ius 0 python bots discord discord.py

我写了一个相当大的不和谐机器人。它具有超过1000行代码。当我研究如何在youtube和此处进行操作时,似乎没有任何效果。我想知道是否有人可以通过照片示例解释如何正确使用玉米棒。我可以显示我需要哪些代码来帮助您了解我想要什么。

一个例子是我想将所有的mod命令放在一个单独的文件中,以使其更加整洁有序。那么,我该怎么做呢?这是我的代码示例:

我想使用齿轮将Mod命令移至单独的文件

我目前有进口

前缀和目录

呼叫令牌ID-令牌ID在上方,未在照片中显示

我不确定如何完全启动齿轮,还有什么要导入的,如何调用文件。我非常了解Java,但是我正在尝试与Discord一起从事Python技能的研究。先感谢您!

Pat*_*ugh 6

注意:

下面是针对较旧的0.16版本编写的,该版本没有很好的齿轮文档。新的1.0版本有很好的文档,并且完全改变了齿轮的结构。如果您使用的是最新版本的,则应查阅官方文档

介绍

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

def setup(bot):
    bot.add_cog(Cog(bot))
Run Code Online (Sandbox Code Playgroud)

Cog齿轮类在哪里。

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

主要变化

您需要执行以下四个主要转换,才能将机器人更改为齿轮:

  1. 替换bot.commandcommands.commandcommandsfrom discord.ext import commands

  2. 更改函数的签名以使其包含self在开头,因为所有命令和事件现在都是cog类的方法

  3. 更改所有引用bot来引用self.bot,而不是

  4. 卸下所有bot.event装饰器。来自您齿轮的事件侦听器仅以名称注册

还有一些陷阱:

  1. await bot.process_commands(message)on_message您的齿轮中的任何事件中删除。对于任何消息,只应等待一次。默认值on_message已为您完成此操作。

  2. 通过齿轮注册事件不会从您的主文件或其他齿轮中删除与该事件相关的其他回调。这意味着,on_member_join例如,如果您在多个地方定义了该事件的行为,则您的机器人可以多次响应该事件。

假设您bot.py在目录中具有以下discord.py机器人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")
Run Code Online (Sandbox Code Playgroud)

然后,您将该功能分解为齿轮 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))
Run Code Online (Sandbox Code Playgroud)

您的bot.py文件看起来像

from discord.ext import commands

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

bot.load_extension("cogs.maincog")

bot.run("token")
Run Code Online (Sandbox Code Playgroud)

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

其它功能

嵌齿轮还允许您定义一些特殊方法。其中大多数仅在中可用,并在此处记录

  1. __global_check,以前__check是在每个命令之前运行的,必须返回True才能继续执行该命令。

  2. __local_check 仅在此齿轮发出的命令之前运行。

  3. __global_check_once我相信,这与__global_check子命令类似,只是它在子命令的情况下仅检查一次。我没有用太多。

  4. __unload您可以通过卸载扩展程序,然后重新加载它来实时刷新您的机器人,使您无需离开机器人就可以更新齿轮。当您卸载扩展程序时,或者在您的机器人停止运行时(如果需要进行清理),将调用此方法。

  5. __before_invoke__after_invoke分别在此齿轮的每个命令之前和之后运行。

  6. __error 是来自此齿轮的命令的错误处理程序。