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

时间:2018-11-28 21:12:56

标签: python bots discord discord.py

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

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

Mod Commands I want to move to a separate file using a cog

Imports currently that I have

Prefix and directory

Calling token ID - token id is above, not shown in photo

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

2 个答案:

答案 0 :(得分:2)

注意:

以下内容是针对较旧的0.16版本编写的,该版本没有很好的齿轮文档。新的1.0版本有很好的文档,并且完全改变了齿轮的结构。如果您使用的是的现代版本,则应查阅official documentation

简介

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

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

其中Cog是齿轮类。

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

主要变化

要将机器人更改为齿轮需要进行四个主要转换:

  1. bot.command替换为commands.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")

然后,您将该功能分解为齿轮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中。

  1. __global_check(原为__check)在每个命令之前运行,并且必须返回True才能继续执行该命令。

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

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

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

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

  6. __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'))
      }
    })
  }