添加和注册新 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