我写了一个相当大的不和谐机器人。它具有超过1000行代码。当我研究如何在youtube和此处进行操作时,似乎没有任何效果。我想知道是否有人可以通过照片示例解释如何正确使用玉米棒。我可以显示我需要哪些代码来帮助您了解我想要的东西。
一个例子是,我希望将所有mod命令放在一个单独的文件中,以使其更加整洁有序。那么,我该怎么做呢?这是我的代码示例:
Mod Commands I want to move to a separate file using a cog
Calling token ID - token id is above, not shown in photo
我不确定如何完全启动齿轮,还需要导入什么,如何调用文件。我非常了解Java,但是我正在尝试与Discord一起从事Python技能的研究。先感谢您!
答案 0 :(得分:2)
以下内容是针对较旧的0.16版本编写的,该版本没有很好的齿轮文档。新的1.0版本有很好的文档,并且完全改变了齿轮的结构。如果您使用的是discord.py的现代版本,则应查阅official documentation。
每个齿轮都有两个部分:类和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 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")
然后,您将该功能分解为齿轮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还允许您定义一些特殊方法。其中大多数仅在discord.py-rewrite中可用,并已记录在here中。
__global_check
(原为__check
)在每个命令之前运行,并且必须返回True
才能继续执行该命令。
__local_check
仅在此齿轮发出的命令之前运行。
__global_check_once
我相信这与__global_check
相似,只是在子命令的情况下它仅检查一次。我没用太多。
__unload
,您可以通过卸载扩展程序,然后重新加载它来实时刷新您的机器人,使您无需离开机器人就可以更新齿轮。当您卸载扩展程序时,或者在您的机器人停止运行以防万一需要清理时,将调用此方法。
__before_invoke
和__after_invoke
分别在此齿轮的每个命令之前和之后运行。
__error
是此齿轮命令的错误处理程序。
答案 1 :(得分:1)
基本的齿轮模板如下:
client.load_extension('script_name')
并将此齿轮添加到您的机器人中,请在您的主文件中添加:
client.load_extension('folder_name.script_name')
并且如果cog脚本位于文件夹中,
const formChooser = document.forms['form-chooser']
, divsUpLd = document.querySelectorAll('div.selectt')
;
formChooser.onchange = () =>
{
divsUpLd.forEach( divN =>
{
if (divN.classList.contains( formChooser.inputRadio.value ))
{
divN.classList.remove('noDisplay')
divN.querySelectorAll('input.required')
.forEach(inR => inR.setAttribute('required','required'))
}
else
{
divN.classList.add('noDisplay')
divN.querySelectorAll('input.required')
.forEach(inR => inR.removeAttribute('required'))
}
})
}