-
Notifications
You must be signed in to change notification settings - Fork 166
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WIP: OneBot v12 #108
WIP: OneBot v12 #108
Conversation
贴一下和 @crazywhalecc 讨论得到的 v12 大致思路。 OneBot v12 大致思路总体背景、动机移到 README,specs 里面只保留真正的规范说明。 使用 mkdocs 制作新版文档。 规范仍然包括四个部分:
通信仍然保留目前的四种通信方式:
考虑新增一个 HTTP Polling 方式获取事件,也就相当于在第一种通信方式中 考虑在 HTTP 通信方式中支持单个 endpoint 的动作请求,也就是所有动作请求都发到 可以进一步统一通信方式,把上述通信方式统一称作 OneBot RPC,首先定义 RPC 传输的数据格式(也就是 JSON 结构),然后允许多种连接方式。 HTTP Webhook 的响应快速操作感觉可以丢弃,如果需要对事件进行处理,应该手动或由 SDK 请求对应动作。 HTTP 通信方式中,下面两种同时支持(第一种主要是为了支持 GET 直接传入 query 参数,方便在浏览器调试): POST /send_msg
{
"user_id": "123"
} POST /
{
"action": "send_msg",
"params": {
"user_id": "123"
},
"echo": {}
} 前端测试网页 nonebot/plugin-test、koishi webui,如果前端测试网页能做的不错的话,HTTP 通信的第一种似乎可以丢弃,使每种通信方式传输数据格式相同。 消息消息格式只保留数组格式: [
{"type": "text", "data": {"text": "blah"}},
{"type": "image", "data": {"media_id": "blahblah"}}
] 在 LibOneBot 中,实现者要构造 MessageSegment::image()
MessageSegment::extended("qq", "redbag", data) // 扩展消息段,实际构成 type 为 qq_redbad 事件 LibOneBot v11 兼容层可以对 v11 的 string 消息格式做支持。 动作核心动作集(Core Action Set)
LibOneBot 中实现方式: register_action(CoreActions::SendMessage, my_send_message); 扩展动作(Extended Actions)例如 register_extented_action("qq", "get_group_system_msg", my_get_group_system_msg); 生成的动作实际名字为 理想情况下,OneBot 实现自己的文档中只需要给出扩展动作的文档。 动作结果(Action Result)格式仍然和之前一致: {
"status": "ok",
"retcode": 0,
"data": {
"id": 123456,
"nickname": "滑稽"
}
} 发生错误时,可选地添加 {
"status": "failed",
"retcode": 11002,
"message": "动作 `blahblah` 不存在"
} 对于 HTTP 方式的动作请求,只要收到请求,HTTP 状态码都返回 200,通过 规范
事件核心事件集(Core Event Set)HTTP header 里面加上聊天平台名称。 {
"user_id": "12234",
"self_id": "123234",
"messsage": "sajghds",
"type": "message", // message | notice | request | meta_event
"detail_type": "", // group | private | other impl specific
"sub_type": "",
"extended": { // 扩展字段
...
},
} 核心事件集中的事件,如果 OneBot 实现有自己的扩展字段,放在 扩展事件(Extended Events)和扩展动作和扩展消息段类似,扩展事件中的 历史包袱
|
好! |
补充一个文件传输相关的。 文件发送图片、文件等时:
接收消息中的图片:
这里的主要原因在于下面两点:
|
这种方式似乎不太好应对多后端的情景。 |
Telegram 的类似接口,是谁先请求到就是谁的,我觉得问题不大,多后端不用这个接口就好,webhook 更合适 |
# Conflicts: # README.md
强烈建议给临时消息(群私聊消息)的 |
有关 |
个人观点 不太建议 引入了
|
兼容性确实如此,这是一个不可避免的 Breaking Change。但库与机器人同时升级 v12 协议后,个人认为对于这样的改动是可容忍的。 正反序列化对于 JSON 库来说, 序列化/反序列化的 Polymorphism 支持属于基础功能之一。除非是现有的 OneBot 库本身重复造了 JSON 的轮子,否则很难想象会在此遇到困难。 |
虽然还是不太建议,但对于这两点确实同意。这样的改动多数情况下应该不会有影响,并且现在的 JSON 库应该都有对应功能(虽然可能依旧会增加消息处理时的逻辑代码成本,不过考虑到 v12 协议下相关内容会由 LibOneBot 实现那问题也就不大) 可以等等看看其他人的看法。 |
其实 CQHTTP 在刚引入数组格式的时候就考虑过平级的表示法,后来考虑的问题基本上跟 @Afanyiyu 提出的差不多,然后决定了用 我个人觉得两个都可以,实际上平级和专门一个字段表示法在目前的标准里都存在——事件是平级表示的,动作请求和响应是专门 但我目前看不到为了把 |
我没看到拉平有什么明显的优势,但是既然有人提出来,说明可能的确在某些特殊场合有这个需要。 |
关于
因此,有些实现可能会将下载的文件放到
看了之前的讨论,这里看来会在 v12 的时候改为 这样逻辑代码就可以安全地使用 libonebot 返回的资源路径(不用担心被诸如 |
提议动作请求 的 |
目前 OneBot 12 标准里删去了 |
现在 OneBot 12 标准草案已经合并到了 master 分支,部署在 https://12.1bot.dev,OneBot 官网(包括之前的生态列表)部署在 https://1bot.dev。 目前草案仍然接受小型改进建议,预计会在若干个真实平台的 OneBot 实现出现后发布正式标准版本。 |
No description provided.