插件模板
综述
OlivOS 中插件运作的模式为,OlivOS 在收到消息时生成事件,事件会按照已加载的插件的优先级以此让事件依次通过事件入口函数进入各个插件的处理流程,插件在处理过程中可以按照自己的业务逻辑进行判断,并在合适的时机主动调用插件事件附带的方法,或是插件加载器进程附带的方法,以实现诸如回复消息一类的业务逻辑,完成后返回
插件模板
请配合插件模板进行阅读
OlivOS插件通过importlib进行动态加载,加载后将具有与OlivOS同级的命名空间,命名空间之间符合Python的覆盖机制,这意味着你可以对其他插件甚至OlivOS自身进行注入式开发。
在源码开发模式下,插件是一个被放置于plugin/app目录下的文件夹(Python模块)
一个通过OlivOS的插件托盘的检查并被正常加载的插件应当具有以下文件
| 文件名称 | 功能 |
|---|---|
app.json |
自述文件,编码应当为 UTF-8 无 BOM |
__init__.py |
加载入口 |
main.py |
事件回调入口 |
data |
资源文件目录 |
webui |
可选的 WebUI 页面目录,入口通过 webui_config 注册 |
自述文件
本文件的内容用于向OlivOS插件托盘表明插件自身相关的信息,其内容应当参考app.json
具体通常如下
{
"name" : "OlivOS插件默认模板",
"author" : "OlivOS-Team",
"namespace" : "OlivOSPluginTemplate",
"info" : "这是OlivOS官方插件模板,而这是一条有关插件的简介。",
"priority" : 30000,
"svn" : 1,
"compatible_svn" : 100,
"message_mode" : "olivos_string",
"support" : [
{
"sdk" : "onebot",
"platform" : "qq",
"model" : "all"
},
{
"sdk" : "all",
"platform" : "all",
"model" : "all"
}
],
"webui_config": [
{
"title": "插件模板",
"type": "iframe",
"path": "webui/index.html"
}
],
"menu_config": [
{
"title": "插件菜单1",
"event": "OlivOSPluginTemplate_Menu_001"
},
{
"title": "插件菜单2",
"event": "OlivOSPluginTemplate_Menu_002"
}
]
}
其中包含的条目有如下作用
| 文件名称 | 类型 | 描述 |
|---|---|---|
| name | string | 插件名称 |
| author | string | 插件作者 |
| info | string | 插件的简要说明 |
| namespace | string | 命名空间 |
| priority | number(int) | 优先级,值越小等级越高 |
| svn | number(int) | 版本号 由插件自行递增 |
| compatible_svn | number(int) | 插件接口版本号 表明了当前插件基于哪个版本的OlivOS设计 |
| message_mode | string | 插件消息模式 |
| support | list | 插件支持平台开关 |
| menu_config | list | 插件菜单注册表 |
| webui_config | list | 可选的 WebUI 页面注册表,可声明内嵌页面或外部链接 |
平台开关
support字段中包含的结构体应当包含如下
| 文件名称 | 类型 | 描述 |
|---|---|---|
| sdk | string | 插件平台SDK |
| platform | string | 插件平台 |
| model | string | 插件平台模式 |
其中,all字段表示该字段可以被忽略。
菜单注册表
menu_config字段中包含的结构体应当包含如下
| 文件名称 | 类型 | 描述 |
|---|---|---|
| title | string | 菜单条目标题 |
| event | string | 菜单插件事件字段 |
WebUI 页面注册表
webui_config 是可选字段,省略时插件仍可正常加载,但不会在 WebUI 的“插件页面”导航中添加入口。
需要多个内嵌页面时,在 webui_config 列表中添加多个条目,每个条目分别填写 title、type 和 path。单个 path 只接受一个路径字符串,不支持数组或逗号分隔;各入口的资源范围取并集。配置示例见 WebUI 页面开发。
| 字段 | 类型 | 描述 |
|---|---|---|
| title | string | 页面导航标题 |
| type | string | iframe 为插件内置页面,link 为在新标签页打开的外部链接 |
| path | string | iframe 必填,相对插件根目录,使用 / 分隔,不允许绝对路径或 ..;例如 webui/index.html |
| url | string | link 必填,只接受 http:// 或 https:// URL |
宿主会自动补全所属插件的 namespace。修改注册表后需重载插件。页面并不会由核心自动生成,插件应自行提供 HTML、样式与交互逻辑。
完整的页面示例、Event.menu 请求处理、回包方法和沙箱限制见 WebUI 页面开发。
加载入口
该文件是Python模块加载时的标准文件,你应当在本文件中编写相关代码以确定加载步骤中的命名空间关系,以及其他操作
事件回调入口
该文件提供了插件命名空间下的main空间,这是插件后续业务加载所需的主要空间,详情请参考框架事件综述
资源文件目录
该目录是一个允许你在打包时包含资源文件的设计,在插件内部的目录下的data目录中的内容将会在init与init_after事件之间被整体复制到plugin/data/命名空间/data目录下,而不需要开发者额外的编写释放资源文件的代码。
插件打包发布格式 | OPK(OlivOS Plugin Package)
OPK(OlivOS Plugin Package)是一种由仑质提出的,适用于OlivOS的单文件插件格式,其本质是源码状态的OlivOS插件目录的zip格式压缩包,并在完成压缩后修改后缀名.zip为.opk,这是一种通用的打包形式,参考了Office与Java等项目的设计。
其详细打包过程请参考OlivOS插件模板的CI过程。