Skip to content

添加和注册新 Module

Module 指 HypeR Bot 中的消息处理模块

在阅读本章前,建议先阅读 HypeR Bot 的内置类、方法和属性

快速开始

python
from hyperot import common, segments
import ModuleClass
from hyperot.events import *


@ModuleClass.ModuleRegister.register(GroupMessageEvent, PrivateMessageEvent)
class MyPing(ModuleClass.Module):
    async def handle(self):
        if str(self.event.message) == "ping":
            msg = common.Message(
                segments.Reply(self.event.message_id),
                segments.Text("Pong!")
            )
            await self.actions.send(
                group_id=self.event.group_id,
                user_id=self.event.user_id,
                message=msg
            )

把以上代码储存在一个.py文件中,扔进module文件夹,启动 HypeR Bot,并在QQ中对 HypeR Bot 发送 ping,HypeR Bot 将回复 Pong!

让我们来看看以上代码到底做了什么。

  • 头两行,导入需要的模块;
  • @ModuleClass.ModuleRegister.register(GroupMessageEvent, PrivateMessageEvent):这一行将其下装饰的MyPing 类注册为消息处理模块,接受 GroupMessageEvent 事件和 PrivateMessageEvent 事件,即群聊消息和私聊消息;
  • class MyPing(ModuleClass.Module):继承Module,创建MyPing类,作为消息处理模块;
  • async def handle(self):重写父类方法handle这是任何消息处理模块的入口函数
  • 下方为业务代码:
    • 判断消息的内容是否为文字 ping
    • 如果是,创建msg对象,其类型为common.Message,在消息中添加Reply 段用于添加对原消息的引用,而Text段为文本内容;
    • 下一步,调用 API,发送消息。

是不是非常简单?

但是这个消息处理模块在.help命令的回复中没有出现,这是为什么?

定义模块信息

这个消息处理模块没有任何的信息,为什么要显示在.help命令的回复中呢?

现在,我们来为他添加信息。

python
from hyperot import common, segments
import ModuleClass
from hyperot.events import *


@ModuleClass.ModuleRegister.register(GroupMessageEvent, PrivateMessageEvent)
class MyPing(ModuleClass.Module):
    @staticmethod
    def info() -> ModuleClass.ModuleInfo:
        return ModuleClass.ModuleInfo(
            is_hidden=False,
            module_name="MyFirstModule",
            author="Xiao_su_su_is_really_good",
            version="0.114514",
            desc="ping, Pong!",
            helps="你说ping,我说Pong!"
        )

    async def handle(self): ...

现在重启 HypeR Bot,看看效果吧~

现在 MyFirstModule 已经出现在了帮助列表中。同样,让我们来看看各个值代表什么:

  • is_hidden:标记该消息处理模块是否是一个隐藏模块,如果是,则该模块会被帮助列表忽略,默认为True
  • module_name:模块名;
  • author:该模块的编写者;
  • version:版本;
  • desc:对该模块的简单描述;
  • helps:相对详细的帮助信息。

好了,基本的操作你已经掌握了,阅读OneBot v11 文档进行进一步的开发吧~

进阶用法

自定义API

当您想要调用的API没有被 HypeR Bot 内置,您可以使用如下操作以调用一个自定义的API:

python
echo = self.actions.custom.your_custom_api(arg1=value1, args=value2)
result = common.Ret.fetch(echo)

result与调用其他api的返回值相同。若不需要返回值,则 result = common.Ret.fetch(echo)可以省略。

自定义事件过滤器

事件过滤器用于判断一个事件是否应当传入一个模块, HypeR Bot 的每个消息处理模块都拥有filter()方法,在必要时,该方法允许被重写。

python
@@ModuleRegister.register(...)
class MyMoudle(Module):
    @staticmethod
    def filter(event, allowed) -> bool:
        if ... :
            return True
        elif ... :
            return True
        else:
            return False