@zhin.js/adapter-onebot12 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +105 -0
- package/lib/adapter.d.ts +13 -0
- package/lib/adapter.d.ts.map +1 -0
- package/lib/adapter.js +36 -0
- package/lib/adapter.js.map +1 -0
- package/lib/api.d.ts +14 -0
- package/lib/api.d.ts.map +1 -0
- package/lib/api.js +34 -0
- package/lib/api.js.map +1 -0
- package/lib/bot-webhook.d.ts +25 -0
- package/lib/bot-webhook.d.ts.map +1 -0
- package/lib/bot-webhook.js +117 -0
- package/lib/bot-webhook.js.map +1 -0
- package/lib/bot-ws.d.ts +26 -0
- package/lib/bot-ws.d.ts.map +1 -0
- package/lib/bot-ws.js +180 -0
- package/lib/bot-ws.js.map +1 -0
- package/lib/bot-wss.d.ts +26 -0
- package/lib/bot-wss.d.ts.map +1 -0
- package/lib/bot-wss.js +173 -0
- package/lib/bot-wss.js.map +1 -0
- package/lib/index.d.ts +19 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +27 -0
- package/lib/index.js.map +1 -0
- package/lib/types.d.ts +77 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +5 -0
- package/lib/types.js.map +1 -0
- package/lib/utils.d.ts +45 -0
- package/lib/utils.d.ts.map +1 -0
- package/lib/utils.js +60 -0
- package/lib/utils.js.map +1 -0
- package/package.json +50 -0
- package/src/adapter.ts +52 -0
- package/src/api.ts +48 -0
- package/src/bot-webhook.ts +130 -0
- package/src/bot-ws.ts +191 -0
- package/src/bot-wss.ts +188 -0
- package/src/index.ts +40 -0
- package/src/types.ts +86 -0
- package/src/utils.ts +87 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 凉菜
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# @zhin.js/adapter-onebot12
|
|
2
|
+
|
|
3
|
+
Zhin.js [OneBot 12](https://12.onebot.dev/) 协议适配器,**一个适配器**支持正向 WebSocket、HTTP Webhook、反向 WebSocket 三种连接方式,由配置项 `connection` 区分。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- 🔌 [OneBot 12 标准](https://12.onebot.dev/) 兼容(OneBot Connect + 接口定义)
|
|
8
|
+
- 📦 **单一适配器**:`context: onebot12`,通过 `connection` 选择连接方式
|
|
9
|
+
- 🌐 **正向 WebSocket**(`connection: ws`):应用连 OneBot 实现的 WS 服务器
|
|
10
|
+
- 📮 **HTTP Webhook**(`connection: webhook`):OneBot 实现 POST 事件到应用提供的 path,可选 `api_url` 用于发消息/撤回
|
|
11
|
+
- 🔄 **反向 WebSocket**(`connection: wss`):应用开 WS 服务端,OneBot 实现连上来
|
|
12
|
+
- 🔐 `access_token` 鉴权(Bearer)
|
|
13
|
+
- 📨 私聊 / 群聊 / 频道消息收发,消息段与 OneBot 12 标准一致
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pnpm add @zhin.js/adapter-onebot12 ws
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Webhook / 反向 WS 需启用 `@zhin.js/http`:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pnpm add @zhin.js/http
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 配置
|
|
28
|
+
|
|
29
|
+
所有 Bot 使用 **同一 context:`onebot12`**,通过 **`connection`** 区分连接方式。
|
|
30
|
+
|
|
31
|
+
### 正向 WebSocket
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
plugins:
|
|
35
|
+
- "@zhin.js/adapter-onebot12"
|
|
36
|
+
|
|
37
|
+
bots:
|
|
38
|
+
- context: onebot12
|
|
39
|
+
connection: ws
|
|
40
|
+
name: ob12-bot
|
|
41
|
+
url: "ws://127.0.0.1:6700"
|
|
42
|
+
access_token: "${ONEBOT12_ACCESS_TOKEN}"
|
|
43
|
+
reconnect_interval: 5000
|
|
44
|
+
heartbeat_interval: 30000
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### HTTP Webhook
|
|
48
|
+
|
|
49
|
+
OneBot 实现会向你的 `path` 发送 POST 事件;若需发消息/撤回,请配置实现提供的 HTTP 端点 `api_url`。
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
plugins:
|
|
53
|
+
- "@zhin.js/http"
|
|
54
|
+
- "@zhin.js/adapter-onebot12"
|
|
55
|
+
|
|
56
|
+
bots:
|
|
57
|
+
- context: onebot12
|
|
58
|
+
connection: webhook
|
|
59
|
+
name: ob12-webhook-bot
|
|
60
|
+
path: "/onebot12/webhook"
|
|
61
|
+
api_url: "http://127.0.0.1:6700" # 可选,用于 send_message / delete_message
|
|
62
|
+
access_token: "${ONEBOT12_ACCESS_TOKEN}"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 反向 WebSocket
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
plugins:
|
|
69
|
+
- "@zhin.js/http"
|
|
70
|
+
- "@zhin.js/adapter-onebot12"
|
|
71
|
+
|
|
72
|
+
bots:
|
|
73
|
+
- context: onebot12
|
|
74
|
+
connection: wss
|
|
75
|
+
name: ob12-wss-bot
|
|
76
|
+
path: "/onebot12/event"
|
|
77
|
+
access_token: "${ONEBOT12_ACCESS_TOKEN}"
|
|
78
|
+
heartbeat_interval: 30000
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 鉴权
|
|
82
|
+
|
|
83
|
+
- **Bearer**:请求头 `Authorization: Bearer <access_token>`
|
|
84
|
+
- 正向 WS 在建立连接时通过 HTTP Upgrade 头鉴权;Webhook / 反向 WS 同上
|
|
85
|
+
|
|
86
|
+
配置 `access_token` 并与 OneBot 实现端一致即可。
|
|
87
|
+
|
|
88
|
+
## 连接方式对比
|
|
89
|
+
|
|
90
|
+
| connection | 说明 |
|
|
91
|
+
|------------|------|
|
|
92
|
+
| `ws` | 应用连实现的 WebSocket 服务器 |
|
|
93
|
+
| `webhook` | 实现 POST 事件到应用 path;发消息需配置 `api_url` |
|
|
94
|
+
| `wss` | 应用开 WS 服务端,实现连上来 |
|
|
95
|
+
|
|
96
|
+
## 动作与事件
|
|
97
|
+
|
|
98
|
+
- 事件:`type`(meta/message/notice/request)、`detail_type`、`message`(消息段数组)等,见 [事件](https://12.onebot.dev/connect/data-protocol/event/)。
|
|
99
|
+
- 动作:`send_message`(params: detail_type, user_id/group_id/channel_id, message)、`delete_message` 等,见 [动作请求](https://12.onebot.dev/connect/data-protocol/action-request/)。
|
|
100
|
+
|
|
101
|
+
## 协议文档
|
|
102
|
+
|
|
103
|
+
- [OneBot 12 标准](https://12.onebot.dev/)
|
|
104
|
+
- [OneBot Connect 通信方式](https://12.onebot.dev/connect/communication/websocket/)
|
|
105
|
+
- [数据协议(事件 / 动作)](https://12.onebot.dev/connect/data-protocol/event/)
|
package/lib/adapter.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Adapter, Plugin } from 'zhin.js';
|
|
2
|
+
import { OneBot12WsClient } from './bot-ws.js';
|
|
3
|
+
import { OneBot12WebhookBot } from './bot-webhook.js';
|
|
4
|
+
import { OneBot12WssServer } from './bot-wss.js';
|
|
5
|
+
import type { OneBot12BotConfig } from './types.js';
|
|
6
|
+
export type OneBot12Bot = OneBot12WsClient | OneBot12WebhookBot | OneBot12WssServer;
|
|
7
|
+
export declare class OneBot12Adapter extends Adapter<OneBot12Bot> {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(plugin: Plugin);
|
|
10
|
+
createBot(config: OneBot12BotConfig): OneBot12Bot;
|
|
11
|
+
start(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAEpF,qBAAa,eAAgB,SAAQ,OAAO,CAAC,WAAW,CAAC;;gBAG3C,MAAM,EAAE,MAAM;IAI1B,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW;IAmB3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
|
package/lib/adapter.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Adapter } from 'zhin.js';
|
|
2
|
+
import { OneBot12WsClient } from './bot-ws.js';
|
|
3
|
+
import { OneBot12WebhookBot } from './bot-webhook.js';
|
|
4
|
+
import { OneBot12WssServer } from './bot-wss.js';
|
|
5
|
+
export class OneBot12Adapter extends Adapter {
|
|
6
|
+
#router;
|
|
7
|
+
constructor(plugin) {
|
|
8
|
+
super(plugin, 'onebot12', []);
|
|
9
|
+
}
|
|
10
|
+
createBot(config) {
|
|
11
|
+
switch (config.connection) {
|
|
12
|
+
case 'ws':
|
|
13
|
+
return new OneBot12WsClient(this, config);
|
|
14
|
+
case 'webhook':
|
|
15
|
+
if (!this.#router) {
|
|
16
|
+
throw new Error('OneBot12 connection: webhook 需要 router,请安装并在配置中启用 @zhin.js/http');
|
|
17
|
+
}
|
|
18
|
+
return new OneBot12WebhookBot(this, this.#router, config);
|
|
19
|
+
case 'wss':
|
|
20
|
+
if (!this.#router) {
|
|
21
|
+
throw new Error('OneBot12 connection: wss 需要 router,请安装并在配置中启用 @zhin.js/http');
|
|
22
|
+
}
|
|
23
|
+
return new OneBot12WssServer(this, this.#router, config);
|
|
24
|
+
default:
|
|
25
|
+
throw new Error(`Unknown OneBot12 connection: ${config.connection}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async start() {
|
|
29
|
+
this.#router = this.plugin.inject('router');
|
|
30
|
+
this.plugin.useContext('router', (router) => {
|
|
31
|
+
this.#router = router;
|
|
32
|
+
});
|
|
33
|
+
await super.start();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAU,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAUjD,MAAM,OAAO,eAAgB,SAAQ,OAAoB;IACvD,OAAO,CAAU;IAEjB,YAAY,MAAc;QACxB,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,SAAS,CAAC,MAAyB;QACjC,QAAQ,MAAM,CAAC,UAAU,EAAE,CAAC;YAC1B,KAAK,IAAI;gBACP,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,MAA0B,CAAC,CAAC;YAChE,KAAK,SAAS;gBACZ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;gBACrF,CAAC;gBACD,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAA+B,CAAC,CAAC;YACrF,KAAK,KAAK;gBACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;gBACjF,CAAC;gBACD,OAAO,IAAI,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAA2B,CAAC,CAAC;YAChF;gBACE,MAAM,IAAI,KAAK,CAAC,gCAAiC,MAA4B,CAAC,UAAU,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,GAAI,IAAI,CAAC,MAAM,CAAC,MAA8C,CAAC,QAAQ,CAAC,CAAC;QACpF,IAAI,CAAC,MAAM,CAAC,UAAkE,CAAC,QAAQ,EAAE,CAAC,MAAc,EAAE,EAAE;YAC3G,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
|
package/lib/api.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OneBot 12 HTTP 动作调用:POST 动作请求到实现的 HTTP 端点,返回动作响应
|
|
3
|
+
* 参考 https://12.onebot.dev/connect/communication/http/
|
|
4
|
+
*/
|
|
5
|
+
import type { OneBot12ActionResponse } from './types.js';
|
|
6
|
+
export interface OneBot12HttpOptions {
|
|
7
|
+
url: string;
|
|
8
|
+
access_token?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 向 OneBot 实现发送动作请求(HTTP POST),返回动作响应
|
|
12
|
+
*/
|
|
13
|
+
export declare function callOneBot12Action(options: OneBot12HttpOptions, action: string, params?: Record<string, unknown>, echo?: string): Promise<OneBot12ActionResponse>;
|
|
14
|
+
//# sourceMappingURL=api.d.ts.map
|
package/lib/api.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAyB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhF,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,sBAAsB,CAAC,CA4BjC"}
|
package/lib/api.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 向 OneBot 实现发送动作请求(HTTP POST),返回动作响应
|
|
3
|
+
*/
|
|
4
|
+
export async function callOneBot12Action(options, action, params = {}, echo) {
|
|
5
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
6
|
+
if (options.access_token) {
|
|
7
|
+
headers['Authorization'] = `Bearer ${options.access_token}`;
|
|
8
|
+
}
|
|
9
|
+
const body = { action, params };
|
|
10
|
+
if (echo)
|
|
11
|
+
body.echo = echo;
|
|
12
|
+
const res = await fetch(options.url, {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
headers,
|
|
15
|
+
body: JSON.stringify(body),
|
|
16
|
+
});
|
|
17
|
+
const text = await res.text();
|
|
18
|
+
if (res.status === 401)
|
|
19
|
+
throw new Error(`OneBot12 鉴权失败: ${text}`);
|
|
20
|
+
if (res.status !== 200)
|
|
21
|
+
throw new Error(`OneBot12 HTTP ${res.status}: ${text}`);
|
|
22
|
+
let data;
|
|
23
|
+
try {
|
|
24
|
+
data = JSON.parse(text);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new Error(`OneBot12 无效响应: ${text.slice(0, 200)}`);
|
|
28
|
+
}
|
|
29
|
+
if (data.status === 'failed' && data.retcode !== 0) {
|
|
30
|
+
throw new Error(`OneBot12 动作失败 retcode=${data.retcode}: ${data.message}`);
|
|
31
|
+
}
|
|
32
|
+
return data;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=api.js.map
|
package/lib/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA4B,EAC5B,MAAc,EACd,SAAkC,EAAE,EACpC,IAAa;IAEb,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,OAAO,CAAC,YAAY,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,GAA0B,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACvD,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAE3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACnC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IAEhF,IAAI,IAA4B,CAAC;IACjC,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2B,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OneBot 12 HTTP Webhook Bot:OneBot 实现 POST 事件到应用 path,可选 api_url 用于发消息
|
|
3
|
+
*/
|
|
4
|
+
import { EventEmitter } from 'events';
|
|
5
|
+
import { Bot, Message, SendOptions } from 'zhin.js';
|
|
6
|
+
import type { Router } from '@zhin.js/http';
|
|
7
|
+
import type { OneBot12WebhookConfig, OneBot12Event } from './types.js';
|
|
8
|
+
import type { OneBot12Adapter } from './adapter.js';
|
|
9
|
+
export declare class OneBot12WebhookBot extends EventEmitter implements Bot<OneBot12WebhookConfig, OneBot12Event> {
|
|
10
|
+
adapter: OneBot12Adapter;
|
|
11
|
+
router: Router;
|
|
12
|
+
$config: OneBot12WebhookConfig;
|
|
13
|
+
$connected: boolean;
|
|
14
|
+
get logger(): import("zhin.js").Logger;
|
|
15
|
+
constructor(adapter: OneBot12Adapter, router: Router, $config: OneBot12WebhookConfig);
|
|
16
|
+
get $id(): string;
|
|
17
|
+
private httpOptions;
|
|
18
|
+
$connect(): Promise<void>;
|
|
19
|
+
$disconnect(): Promise<void>;
|
|
20
|
+
private handleEvent;
|
|
21
|
+
$formatMessage(ev: OneBot12Event): Message<OneBot12Event>;
|
|
22
|
+
$sendMessage(options: SendOptions): Promise<string>;
|
|
23
|
+
$recallMessage(id: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=bot-webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-webhook.d.ts","sourceRoot":"","sources":["../src/bot-webhook.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAW,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,eAAe,CAAC;AAE3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,qBAAa,kBAAmB,SAAQ,YAAa,YAAW,GAAG,CAAC,qBAAqB,EAAE,aAAa,CAAC;IAQ9F,OAAO,EAAE,eAAe;IACxB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,qBAAqB;IATvC,UAAU,EAAE,OAAO,CAAQ;IAE3B,IAAI,MAAM,6BAET;gBAGQ,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB;IAKvC,IAAI,GAAG,WAEN;IAED,OAAO,CAAC,WAAW;IAKb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC,OAAO,CAAC,WAAW;IAQnB,cAAc,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA8BnD,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKhD"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OneBot 12 HTTP Webhook Bot:OneBot 实现 POST 事件到应用 path,可选 api_url 用于发消息
|
|
3
|
+
*/
|
|
4
|
+
import { EventEmitter } from 'events';
|
|
5
|
+
import { Message, segment } from 'zhin.js';
|
|
6
|
+
import { callOneBot12Action } from './api.js';
|
|
7
|
+
import { formatOneBot12MessagePayload, isMessageEvent, contentToOb12Segments } from './utils.js';
|
|
8
|
+
export class OneBot12WebhookBot extends EventEmitter {
|
|
9
|
+
adapter;
|
|
10
|
+
router;
|
|
11
|
+
$config;
|
|
12
|
+
$connected = true;
|
|
13
|
+
get logger() {
|
|
14
|
+
return this.adapter.plugin.logger;
|
|
15
|
+
}
|
|
16
|
+
constructor(adapter, router, $config) {
|
|
17
|
+
super();
|
|
18
|
+
this.adapter = adapter;
|
|
19
|
+
this.router = router;
|
|
20
|
+
this.$config = $config;
|
|
21
|
+
}
|
|
22
|
+
get $id() {
|
|
23
|
+
return this.$config.name;
|
|
24
|
+
}
|
|
25
|
+
httpOptions() {
|
|
26
|
+
const url = this.$config.api_url?.replace(/\/$/, '') ?? '';
|
|
27
|
+
return { url: url || '', access_token: this.$config.access_token };
|
|
28
|
+
}
|
|
29
|
+
async $connect() {
|
|
30
|
+
const path = this.$config.path.startsWith('/') ? this.$config.path : `/${this.$config.path}`;
|
|
31
|
+
this.router.post(path, async (ctx) => {
|
|
32
|
+
const body = ctx.request.body;
|
|
33
|
+
if (!body || typeof body !== 'object' || !body.id || body.time == null || !body.type) {
|
|
34
|
+
ctx.status = 400;
|
|
35
|
+
ctx.body = { message: 'Invalid OneBot12 event' };
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const token = this.$config.access_token;
|
|
39
|
+
const auth = ctx.headers['authorization'];
|
|
40
|
+
if (token && auth !== `Bearer ${token}`) {
|
|
41
|
+
ctx.status = 401;
|
|
42
|
+
ctx.body = { message: 'Unauthorized' };
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.handleEvent(body);
|
|
46
|
+
ctx.status = 204;
|
|
47
|
+
ctx.body = undefined;
|
|
48
|
+
});
|
|
49
|
+
this.logger.info(`OneBot12 Webhook 注册路径: ${path}`);
|
|
50
|
+
}
|
|
51
|
+
async $disconnect() {
|
|
52
|
+
this.$connected = false;
|
|
53
|
+
}
|
|
54
|
+
handleEvent(ev) {
|
|
55
|
+
if (ev.type === 'message' && isMessageEvent(ev)) {
|
|
56
|
+
const message = this.$formatMessage(ev);
|
|
57
|
+
this.adapter.emit('message.receive', message);
|
|
58
|
+
this.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
$formatMessage(ev) {
|
|
62
|
+
if (!isMessageEvent(ev)) {
|
|
63
|
+
return Message.from(ev, {
|
|
64
|
+
$id: '',
|
|
65
|
+
$adapter: 'onebot12',
|
|
66
|
+
$bot: this.$config.name,
|
|
67
|
+
$channel: { id: '', type: 'private' },
|
|
68
|
+
$sender: { id: '', name: '' },
|
|
69
|
+
$content: [],
|
|
70
|
+
$raw: '',
|
|
71
|
+
$timestamp: ev.time ?? 0,
|
|
72
|
+
$recall: async () => { },
|
|
73
|
+
$reply: async () => '',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const payload = formatOneBot12MessagePayload(ev, this.$config.name, (id) => this.$recallMessage(id), (channel, content, _quote) => this.adapter.sendMessage({
|
|
77
|
+
...channel,
|
|
78
|
+
context: 'onebot12',
|
|
79
|
+
bot: this.$config.name,
|
|
80
|
+
content: content,
|
|
81
|
+
}));
|
|
82
|
+
return Message.from(ev, payload);
|
|
83
|
+
}
|
|
84
|
+
async $sendMessage(options) {
|
|
85
|
+
const apiUrl = this.$config.api_url;
|
|
86
|
+
if (!apiUrl) {
|
|
87
|
+
throw new Error('OneBot12 Webhook 发消息需要配置 api_url(OneBot 实现的 HTTP 端点)');
|
|
88
|
+
}
|
|
89
|
+
const message = contentToOb12Segments(options.content);
|
|
90
|
+
const params = { message };
|
|
91
|
+
if (options.type === 'private') {
|
|
92
|
+
params.detail_type = 'private';
|
|
93
|
+
params.user_id = options.id;
|
|
94
|
+
}
|
|
95
|
+
else if (options.type === 'group') {
|
|
96
|
+
params.detail_type = 'group';
|
|
97
|
+
params.group_id = options.id;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const [guildId, channelId] = options.id.includes(':') ? options.id.split(':') : [undefined, options.id];
|
|
101
|
+
params.detail_type = 'channel';
|
|
102
|
+
params.channel_id = channelId ?? options.id;
|
|
103
|
+
if (guildId)
|
|
104
|
+
params.guild_id = guildId;
|
|
105
|
+
}
|
|
106
|
+
const data = await callOneBot12Action(this.httpOptions(), 'send_message', params);
|
|
107
|
+
const out = data?.message_id ?? '';
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
async $recallMessage(id) {
|
|
111
|
+
const apiUrl = this.$config.api_url;
|
|
112
|
+
if (!apiUrl)
|
|
113
|
+
throw new Error('OneBot12 Webhook 撤回需要配置 api_url');
|
|
114
|
+
await callOneBot12Action(this.httpOptions(), 'delete_message', { message_id: id });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=bot-webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-webhook.js","sourceRoot":"","sources":["../src/bot-webhook.ts"],"names":[],"mappings":"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"}
|
package/lib/bot-ws.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { Bot, Message, SendOptions } from 'zhin.js';
|
|
3
|
+
import type { OneBot12WsConfig, OneBot12Event } from './types.js';
|
|
4
|
+
import type { OneBot12Adapter } from './adapter.js';
|
|
5
|
+
export declare class OneBot12WsClient extends EventEmitter implements Bot<OneBot12WsConfig, OneBot12Event> {
|
|
6
|
+
adapter: OneBot12Adapter;
|
|
7
|
+
$config: OneBot12WsConfig;
|
|
8
|
+
$connected: boolean;
|
|
9
|
+
private ws?;
|
|
10
|
+
private reconnectTimer?;
|
|
11
|
+
private heartbeatTimer?;
|
|
12
|
+
private requestId;
|
|
13
|
+
private pendingRequests;
|
|
14
|
+
get logger(): import("zhin.js").Logger;
|
|
15
|
+
constructor(adapter: OneBot12Adapter, $config: OneBot12WsConfig);
|
|
16
|
+
get $id(): string;
|
|
17
|
+
private startHeartbeat;
|
|
18
|
+
private scheduleReconnect;
|
|
19
|
+
private callAction;
|
|
20
|
+
$connect(): Promise<void>;
|
|
21
|
+
$disconnect(): Promise<void>;
|
|
22
|
+
$formatMessage(ev: OneBot12Event): Message<OneBot12Event>;
|
|
23
|
+
$sendMessage(options: SendOptions): Promise<string>;
|
|
24
|
+
$recallMessage(id: string): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=bot-ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-ws.d.ts","sourceRoot":"","sources":["../src/bot-ws.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAW,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAiD,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,qBAAa,gBAAiB,SAAQ,YAAa,YAAW,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC;IAY7E,OAAO,EAAE,eAAe;IAAS,OAAO,EAAE,gBAAgB;IAX7E,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAmH;IAE1I,IAAI,MAAM,6BAET;gBAEkB,OAAO,EAAE,eAAe,EAAS,OAAO,EAAE,gBAAgB;IAK7E,IAAI,GAAG,WAEN;IAED,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,UAAU;IAoBZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA+CzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBlC,cAAc,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IA8BnD,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhD"}
|
package/lib/bot-ws.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OneBot 12 正向 WebSocket Bot:应用连 OneBot 实现的 WS,收事件、发动作
|
|
3
|
+
*/
|
|
4
|
+
import WebSocket from 'ws';
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import { clearInterval, clearTimeout } from 'node:timers';
|
|
7
|
+
import { Message, segment } from 'zhin.js';
|
|
8
|
+
import { formatOneBot12MessagePayload, isMessageEvent, contentToOb12Segments } from './utils.js';
|
|
9
|
+
export class OneBot12WsClient extends EventEmitter {
|
|
10
|
+
adapter;
|
|
11
|
+
$config;
|
|
12
|
+
$connected;
|
|
13
|
+
ws;
|
|
14
|
+
reconnectTimer;
|
|
15
|
+
heartbeatTimer;
|
|
16
|
+
requestId = 0;
|
|
17
|
+
pendingRequests = new Map();
|
|
18
|
+
get logger() {
|
|
19
|
+
return this.adapter.plugin.logger;
|
|
20
|
+
}
|
|
21
|
+
constructor(adapter, $config) {
|
|
22
|
+
super();
|
|
23
|
+
this.adapter = adapter;
|
|
24
|
+
this.$config = $config;
|
|
25
|
+
this.$connected = false;
|
|
26
|
+
}
|
|
27
|
+
get $id() {
|
|
28
|
+
return this.$config.name;
|
|
29
|
+
}
|
|
30
|
+
startHeartbeat() {
|
|
31
|
+
const interval = this.$config.heartbeat_interval ?? 30000;
|
|
32
|
+
this.heartbeatTimer = setInterval(() => {
|
|
33
|
+
this.callAction('get_status', {}).catch(() => { });
|
|
34
|
+
}, interval);
|
|
35
|
+
}
|
|
36
|
+
scheduleReconnect() {
|
|
37
|
+
if (this.reconnectTimer)
|
|
38
|
+
return;
|
|
39
|
+
const delay = this.$config.reconnect_interval ?? 5000;
|
|
40
|
+
this.reconnectTimer = setTimeout(() => {
|
|
41
|
+
this.reconnectTimer = undefined;
|
|
42
|
+
this.$connect().catch((err) => this.logger.warn('OneBot12 重连失败', err));
|
|
43
|
+
}, delay);
|
|
44
|
+
}
|
|
45
|
+
callAction(action, params) {
|
|
46
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
|
|
47
|
+
return Promise.reject(new Error('WebSocket 未连接'));
|
|
48
|
+
}
|
|
49
|
+
const echo = `ob12_${++this.requestId}`;
|
|
50
|
+
const req = { action, params, echo };
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const timeout = setTimeout(() => {
|
|
53
|
+
this.pendingRequests.delete(echo);
|
|
54
|
+
reject(new Error(`OneBot12 动作超时: ${action}`));
|
|
55
|
+
}, 30000);
|
|
56
|
+
this.pendingRequests.set(echo, {
|
|
57
|
+
resolve: (data) => resolve(data),
|
|
58
|
+
reject,
|
|
59
|
+
timeout,
|
|
60
|
+
});
|
|
61
|
+
this.ws.send(JSON.stringify(req));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async $connect() {
|
|
65
|
+
return new Promise((resolve, reject) => {
|
|
66
|
+
const headers = {};
|
|
67
|
+
if (this.$config.access_token)
|
|
68
|
+
headers['Authorization'] = `Bearer ${this.$config.access_token}`;
|
|
69
|
+
this.ws = new WebSocket(this.$config.url, { headers });
|
|
70
|
+
this.ws.on('open', () => {
|
|
71
|
+
this.$connected = true;
|
|
72
|
+
this.startHeartbeat();
|
|
73
|
+
resolve();
|
|
74
|
+
});
|
|
75
|
+
this.ws.on('message', (data) => {
|
|
76
|
+
try {
|
|
77
|
+
const msg = JSON.parse(data.toString());
|
|
78
|
+
if ('echo' in msg && typeof msg.echo === 'string') {
|
|
79
|
+
const resp = msg;
|
|
80
|
+
const pending = this.pendingRequests.get(resp.echo);
|
|
81
|
+
if (pending) {
|
|
82
|
+
this.pendingRequests.delete(resp.echo);
|
|
83
|
+
clearTimeout(pending.timeout);
|
|
84
|
+
if (resp.status === 'ok')
|
|
85
|
+
pending.resolve(resp.data);
|
|
86
|
+
else
|
|
87
|
+
pending.reject(new Error(`OneBot12 retcode=${resp.retcode}: ${resp.message}`));
|
|
88
|
+
}
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const ev = msg;
|
|
92
|
+
if (ev.type === 'message' && isMessageEvent(ev)) {
|
|
93
|
+
const message = this.$formatMessage(ev);
|
|
94
|
+
this.adapter.emit('message.receive', message);
|
|
95
|
+
this.logger.debug(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
this.emit('error', error);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
this.ws.on('close', (code, reason) => {
|
|
103
|
+
this.$connected = false;
|
|
104
|
+
reject(new Error(`OneBot12 WS 关闭: ${code} ${reason.toString()}`));
|
|
105
|
+
this.scheduleReconnect();
|
|
106
|
+
});
|
|
107
|
+
this.ws.on('error', (err) => reject(err));
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async $disconnect() {
|
|
111
|
+
if (this.reconnectTimer) {
|
|
112
|
+
clearTimeout(this.reconnectTimer);
|
|
113
|
+
this.reconnectTimer = undefined;
|
|
114
|
+
}
|
|
115
|
+
if (this.heartbeatTimer) {
|
|
116
|
+
clearInterval(this.heartbeatTimer);
|
|
117
|
+
this.heartbeatTimer = undefined;
|
|
118
|
+
}
|
|
119
|
+
for (const [, p] of this.pendingRequests) {
|
|
120
|
+
clearTimeout(p.timeout);
|
|
121
|
+
p.reject(new Error('连接已关闭'));
|
|
122
|
+
}
|
|
123
|
+
this.pendingRequests.clear();
|
|
124
|
+
if (this.ws) {
|
|
125
|
+
this.ws.close();
|
|
126
|
+
this.ws = undefined;
|
|
127
|
+
}
|
|
128
|
+
this.$connected = false;
|
|
129
|
+
}
|
|
130
|
+
$formatMessage(ev) {
|
|
131
|
+
if (!isMessageEvent(ev)) {
|
|
132
|
+
return Message.from(ev, {
|
|
133
|
+
$id: '',
|
|
134
|
+
$adapter: 'onebot12',
|
|
135
|
+
$bot: this.$config.name,
|
|
136
|
+
$channel: { id: '', type: 'private' },
|
|
137
|
+
$sender: { id: '', name: '' },
|
|
138
|
+
$content: [],
|
|
139
|
+
$raw: '',
|
|
140
|
+
$timestamp: ev.time ?? 0,
|
|
141
|
+
$recall: async () => { },
|
|
142
|
+
$reply: async () => '',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
const payload = formatOneBot12MessagePayload(ev, this.$config.name, (id) => this.$recallMessage(id), (channel, content, _quote) => this.adapter.sendMessage({
|
|
146
|
+
...channel,
|
|
147
|
+
context: 'onebot12',
|
|
148
|
+
bot: this.$config.name,
|
|
149
|
+
content: content,
|
|
150
|
+
}));
|
|
151
|
+
return Message.from(ev, payload);
|
|
152
|
+
}
|
|
153
|
+
async $sendMessage(options) {
|
|
154
|
+
const message = contentToOb12Segments(options.content);
|
|
155
|
+
const params = { message };
|
|
156
|
+
if (options.type === 'private') {
|
|
157
|
+
params.detail_type = 'private';
|
|
158
|
+
params.user_id = options.id;
|
|
159
|
+
}
|
|
160
|
+
else if (options.type === 'group') {
|
|
161
|
+
params.detail_type = 'group';
|
|
162
|
+
params.group_id = options.id;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const [guildId, channelId] = options.id.includes(':') ? options.id.split(':') : [undefined, options.id];
|
|
166
|
+
params.detail_type = 'channel';
|
|
167
|
+
params.channel_id = channelId ?? options.id;
|
|
168
|
+
if (guildId)
|
|
169
|
+
params.guild_id = guildId;
|
|
170
|
+
}
|
|
171
|
+
const data = await this.callAction('send_message', params);
|
|
172
|
+
const msgId = data?.message_id ?? '';
|
|
173
|
+
this.logger.debug(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
|
|
174
|
+
return msgId;
|
|
175
|
+
}
|
|
176
|
+
async $recallMessage(id) {
|
|
177
|
+
await this.callAction('delete_message', { message_id: id });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=bot-ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-ws.js","sourceRoot":"","sources":["../src/bot-ws.ts"],"names":[],"mappings":"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"}
|
package/lib/bot-wss.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import { Bot, Message, SendOptions } from 'zhin.js';
|
|
3
|
+
import type { Router } from '@zhin.js/http';
|
|
4
|
+
import type { OneBot12WssConfig, OneBot12Event } from './types.js';
|
|
5
|
+
import type { OneBot12Adapter } from './adapter.js';
|
|
6
|
+
export declare class OneBot12WssServer extends EventEmitter implements Bot<OneBot12WssConfig, OneBot12Event> {
|
|
7
|
+
#private;
|
|
8
|
+
adapter: OneBot12Adapter;
|
|
9
|
+
router: Router;
|
|
10
|
+
$config: OneBot12WssConfig;
|
|
11
|
+
$connected: boolean;
|
|
12
|
+
private heartbeatTimer?;
|
|
13
|
+
private requestId;
|
|
14
|
+
private pendingRequests;
|
|
15
|
+
get logger(): import("zhin.js").Logger;
|
|
16
|
+
constructor(adapter: OneBot12Adapter, router: Router, $config: OneBot12WssConfig);
|
|
17
|
+
get $id(): string;
|
|
18
|
+
private getClient;
|
|
19
|
+
private callAction;
|
|
20
|
+
$connect(): Promise<void>;
|
|
21
|
+
$disconnect(): Promise<void>;
|
|
22
|
+
$formatMessage(ev: OneBot12Event): Message<OneBot12Event>;
|
|
23
|
+
$sendMessage(options: SendOptions): Promise<string>;
|
|
24
|
+
$recallMessage(id: string): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=bot-wss.d.ts.map
|