注意:
下面是针对较旧的0.16版本编写的,该版本没有很好的齿轮文档。新的1.0版本有很好的文档,并且完全改变了齿轮的结构。如果您使用的是最新版本的discord.py,则应查阅官方文档。
介绍
每个齿轮都有两个部分:一个类和一个
setup函数。几乎所有
setup功能看起来都一样:
def setup(bot): bot.add_cog(Cog(bot))
Cog齿轮类在哪里。
cog类包含我们所有的命令和事件作为方法。
主要变化
将机器人更改为齿轮需要完成四个主要的转换:
替换
bot.command
为commands.command
(commands
被from discord.ext import commands
)更改函数的签名以使其包含
self
在开头,因为所有命令和事件现在都是cog类的方法更改所有引用
bot
来引用self.bot
,而不是卸下所有
bot.event
装饰器。来自您齿轮的事件侦听器仅以名称注册
还有一些陷阱:
await bot.process_commands(message)
从on_message
您的齿轮中的任何事件中删除。对于任何消息,只应等待一次。默认值on_message
已为您完成此操作。通过齿轮注册事件不会从您的主文件或其他齿轮中删除与该事件相关的其他回调。这意味着,
on_member_join
例如,如果您在多个地方定义了该事件的行为,则您的机器人可以多次响应该事件。
例
假设您
bot.py在目录中具有以下discord.py机器人
src:
from discord.ext import commandsbot = commands.Bot(command_prefix='!')@bot.command(pass_context=True)@commands.has_role("Mod")async def acommand(ctx, argument): await bot.say("Stuff")@bot.eventasync def on_message(message): print(message.content) await bot.process_commands(message)bot.run("token")然后,您将该功能分解为齿轮
src/cogs/maincog.py
from discord.ext import commandsclass 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 commandsbot = commands.Bot(command_prefix='!')bot.load_extension("cogs.maincog")bot.run("token")请注意,要使用加载扩展
cogs/maincog.py,请使用
load_extension("cogs.maincog")。其它功能
嵌齿轮还允许您定义一些特殊方法。其中大多数仅在discord.py-
rewrite中可用,并在此处记录。
__global_check
,以前__check
是在每个命令之前运行的,必须返回True
才能继续执行该命令。__local_check
仅在此齿轮发出的命令之前运行。__global_check_once
我相信这类似于,__global_check
除了在子命令的情况下仅检查一次。我没有用太多。__unload
您可以通过卸载扩展程序,然后重新加载它来实时刷新您的机器人,使您无需离开机器人就可以更新齿轮。当您卸载扩展程序时,或者当您的机器人停止运行时(如果需要进行清理),将调用此方法。__before_invoke
和__after_invoke
分别在此齿轮的每个命令之前和之后运行。__error
是此齿轮的命令的错误处理程序。



