@zhin.js/adapter-onebot11 1.0.14 → 1.0.15

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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @zhin.js/adapter-onebot11
2
2
 
3
+ ## 1.0.15
4
+
5
+ ### Patch Changes
6
+
7
+ - 547028f: fix: 优化包结构,优化客户端支持
8
+ - Updated dependencies [547028f]
9
+ - @zhin.js/types@1.0.5
10
+ - @zhin.js/http@1.0.7
11
+ - zhin.js@1.0.14
12
+
3
13
  ## 1.0.14
4
14
 
5
15
  ### Patch Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-onebot11",
3
- "version": "1.0.14",
3
+ "version": "1.0.15",
4
4
  "description": "zhin adapter for onebot11",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -11,6 +11,18 @@
11
11
  "import": "./lib/index.js"
12
12
  }
13
13
  },
14
+ "keywords": [
15
+ "zhin",
16
+ "adapter",
17
+ "onebot11"
18
+ ],
19
+ "author": "lc-cn",
20
+ "license": "MIT",
21
+ "repository": {
22
+ "url": "git+https://github.com/zhinjs/zhin.git",
23
+ "type": "git",
24
+ "directory": "plugins/adapters/onebot11"
25
+ },
14
26
  "dependencies": {
15
27
  "ws": "^8.18.3"
16
28
  },
@@ -20,9 +32,9 @@
20
32
  "typescript": "^5.3.0"
21
33
  },
22
34
  "peerDependencies": {
23
- "zhin.js": "1.0.13",
24
- "@zhin.js/http": "1.0.6",
25
- "@zhin.js/types": "1.0.4"
35
+ "zhin.js": "1.0.14",
36
+ "@zhin.js/http": "1.0.7",
37
+ "@zhin.js/types": "1.0.5"
26
38
  },
27
39
  "peerDependenciesMeta": {
28
40
  "@zhin.js/types": {
@@ -32,8 +44,10 @@
32
44
  "optional": true
33
45
  }
34
46
  },
35
- "scripts": {
36
- "build": "tsc",
37
- "clean": "rm -rf lib"
38
- }
47
+ "files": [
48
+ "lib",
49
+ "node",
50
+ "README.md",
51
+ "CHANGELOG.md"
52
+ ]
39
53
  }
package/lib/index.d.ts DELETED
@@ -1,87 +0,0 @@
1
- import { EventEmitter } from "events";
2
- import { Bot, Adapter, Message, SendOptions } from 'zhin.js';
3
- import type { Router } from '@zhin.js/http';
4
- declare module '@zhin.js/types' {
5
- interface RegisteredAdapters {
6
- 'onebot11': Adapter<OneBot11WsClient>;
7
- 'onebot11.wss': Adapter<OneBot11WsServer>;
8
- }
9
- }
10
- export interface OneBot11Config extends Bot.Config {
11
- context: 'onebot11';
12
- type: string;
13
- access_token?: string;
14
- }
15
- export interface OneBot11WsClientConfig extends OneBot11Config {
16
- type: 'ws';
17
- url: string;
18
- reconnect_interval?: number;
19
- heartbeat_interval?: number;
20
- }
21
- export interface OneBot11WsServerConfig extends OneBot11Config {
22
- type: 'ws_reverse';
23
- path: string;
24
- heartbeat_interval?: number;
25
- }
26
- export interface OneBot11HTTPConfig extends OneBot11Config {
27
- type: 'http_sse';
28
- port: number;
29
- path: string;
30
- }
31
- interface OneBot11Message {
32
- post_type: string;
33
- self_id: string;
34
- message_type?: string;
35
- sub_type?: string;
36
- message_id: number;
37
- user_id: number;
38
- group_id?: number;
39
- message: Array<{
40
- type: string;
41
- data: Record<string, any>;
42
- }>;
43
- raw_message: string;
44
- time: number;
45
- }
46
- export declare class OneBot11WsClient extends EventEmitter implements Bot<OneBot11Message, OneBot11WsClientConfig> {
47
- $config: OneBot11WsClientConfig;
48
- $connected?: boolean;
49
- private ws?;
50
- private reconnectTimer?;
51
- private heartbeatTimer?;
52
- private requestId;
53
- private pendingRequests;
54
- constructor($config: OneBot11WsClientConfig);
55
- $connect(): Promise<void>;
56
- $disconnect(): Promise<void>;
57
- $formatMessage(onebotMsg: OneBot11Message): Message<OneBot11Message>;
58
- $sendMessage(options: SendOptions): Promise<string>;
59
- $recallMessage(id: string): Promise<void>;
60
- private callApi;
61
- private handleWebSocketMessage;
62
- private handleOneBot11Message;
63
- private startHeartbeat;
64
- private scheduleReconnect;
65
- }
66
- export declare class OneBot11WsServer extends EventEmitter implements Bot<OneBot11Message, OneBot11WsServerConfig> {
67
- #private;
68
- router: Router;
69
- $config: OneBot11WsServerConfig;
70
- $connected?: boolean;
71
- private heartbeatTimer?;
72
- private requestId;
73
- private pendingRequests;
74
- constructor(router: Router, $config: OneBot11WsServerConfig);
75
- $connect(): Promise<void>;
76
- $disconnect(): Promise<void>;
77
- $formatMessage(onebotMsg: OneBot11Message): Message<OneBot11Message>;
78
- $sendMessage(options: SendOptions): Promise<string>;
79
- $recallMessage(id: string): Promise<void>;
80
- private callApi;
81
- private handleWebSocketMessage;
82
- private handleMetaEvent;
83
- private handleMessage;
84
- private startHeartbeat;
85
- }
86
- export {};
87
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/lib/index.js DELETED
@@ -1,409 +0,0 @@
1
- import WebSocket from 'ws';
2
- import { EventEmitter } from "events";
3
- import { Adapter, usePlugin, Message, registerAdapter, segment, useContext } from 'zhin.js';
4
- import { clearInterval } from "node:timers";
5
- const plugin = usePlugin();
6
- // ============================================================================
7
- // OneBot11 适配器实现
8
- // ============================================================================
9
- export class OneBot11WsClient extends EventEmitter {
10
- $config;
11
- $connected;
12
- ws;
13
- reconnectTimer;
14
- heartbeatTimer;
15
- requestId = 0;
16
- pendingRequests = new Map();
17
- constructor($config) {
18
- super();
19
- this.$config = $config;
20
- this.$connected = false;
21
- }
22
- async $connect() {
23
- return new Promise((resolve, reject) => {
24
- let wsUrl = this.$config.url;
25
- const headers = {};
26
- if (this.$config.access_token) {
27
- headers['Authorization'] = `Bearer ${this.$config.access_token}`;
28
- }
29
- this.ws = new WebSocket(wsUrl, { headers });
30
- this.ws.on('open', () => {
31
- this.$connected = true;
32
- if (!this.$config.access_token)
33
- plugin.logger.warn(`missing 'access_token', your OneBot protocol is not safely`);
34
- this.startHeartbeat();
35
- resolve();
36
- });
37
- this.ws.on('message', (data) => {
38
- try {
39
- const message = JSON.parse(data.toString());
40
- this.handleWebSocketMessage(message);
41
- }
42
- catch (error) {
43
- this.emit('error', error);
44
- }
45
- });
46
- this.ws.on('close', (code, reason) => {
47
- this.$connected = false;
48
- reject({ code, reason });
49
- this.scheduleReconnect();
50
- });
51
- this.ws.on('error', (error) => {
52
- reject(error);
53
- });
54
- });
55
- }
56
- async $disconnect() {
57
- if (this.reconnectTimer) {
58
- clearTimeout(this.reconnectTimer);
59
- this.reconnectTimer = undefined;
60
- }
61
- if (this.heartbeatTimer) {
62
- clearInterval(this.heartbeatTimer);
63
- this.heartbeatTimer = undefined;
64
- }
65
- // 清理所有待处理的请求
66
- for (const [id, request] of this.pendingRequests) {
67
- clearTimeout(request.timeout);
68
- request.reject(new Error('Connection closed'));
69
- }
70
- this.pendingRequests.clear();
71
- if (this.ws) {
72
- this.ws.close();
73
- this.ws = undefined;
74
- }
75
- }
76
- $formatMessage(onebotMsg) {
77
- const message = Message.from(onebotMsg, {
78
- $id: onebotMsg.message_id.toString(),
79
- $adapter: 'onebot11',
80
- $bot: `${this.$config.name}`,
81
- $sender: {
82
- id: onebotMsg.user_id.toString(),
83
- name: onebotMsg.user_id.toString()
84
- },
85
- $channel: {
86
- id: (onebotMsg.group_id || onebotMsg.user_id).toString(),
87
- type: onebotMsg.group_id ? 'group' : 'private'
88
- },
89
- $content: onebotMsg.message,
90
- $raw: onebotMsg.raw_message,
91
- $timestamp: onebotMsg.time,
92
- $reply: async (content, quote) => {
93
- if (quote)
94
- content.unshift({ type: 'reply', data: { message_id: message.$id } });
95
- return await this.$sendMessage({
96
- ...message.$channel,
97
- context: 'onebot11',
98
- bot: `${this.$config.name}`,
99
- content
100
- });
101
- }
102
- });
103
- return message;
104
- }
105
- async $sendMessage(options) {
106
- options = await plugin.app.handleBeforeSend(options);
107
- const messageData = {
108
- message: options.content
109
- };
110
- if (options.type === 'group') {
111
- const result = await this.callApi('send_group_msg', {
112
- group_id: parseInt(options.id),
113
- ...messageData
114
- });
115
- plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
116
- return result.message_id.toString();
117
- }
118
- else if (options.type === 'private') {
119
- const result = await this.callApi('send_private_msg', {
120
- user_id: parseInt(options.id),
121
- ...messageData
122
- });
123
- plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`);
124
- return result.message_id.toString();
125
- }
126
- else {
127
- throw new Error('Either group_id or user_id must be provided');
128
- }
129
- return '';
130
- }
131
- async $recallMessage(id) {
132
- await this.callApi('delete_msg', {
133
- message_id: parseInt(id)
134
- });
135
- }
136
- async callApi(action, params = {}) {
137
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
138
- throw new Error('WebSocket is not connected');
139
- }
140
- const echo = `req_${++this.requestId}`;
141
- const message = {
142
- action,
143
- params,
144
- echo
145
- };
146
- return new Promise((resolve, reject) => {
147
- const timeout = setTimeout(() => {
148
- this.pendingRequests.delete(echo);
149
- reject(new Error(`API call timeout: ${action}`));
150
- }, 30000); // 30秒超时
151
- this.pendingRequests.set(echo, { resolve, reject, timeout });
152
- this.ws.send(JSON.stringify(message));
153
- });
154
- }
155
- handleWebSocketMessage(message) {
156
- // 处理API响应
157
- if (message.echo && this.pendingRequests.has(message.echo)) {
158
- const request = this.pendingRequests.get(message.echo);
159
- this.pendingRequests.delete(message.echo);
160
- clearTimeout(request.timeout);
161
- const response = message;
162
- if (response.status === 'ok') {
163
- return request.resolve(response.data);
164
- }
165
- return request.reject(new Error(`API error: ${response.retcode}`));
166
- }
167
- // 处理事件消息
168
- if (message.post_type === 'message') {
169
- this.handleOneBot11Message(message);
170
- }
171
- else if (message.post_type === 'meta_event' && message.meta_event_type === 'heartbeat') {
172
- // 心跳消息,暂时忽略
173
- }
174
- }
175
- handleOneBot11Message(onebotMsg) {
176
- const message = this.$formatMessage(onebotMsg);
177
- plugin.dispatch('message.receive', message);
178
- plugin.logger.info(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`);
179
- plugin.dispatch(`message.${message.$channel.type}.receive`, message);
180
- }
181
- startHeartbeat() {
182
- const interval = this.$config.heartbeat_interval || 30000;
183
- this.heartbeatTimer = setInterval(() => {
184
- if (this.ws && this.ws.readyState === WebSocket.OPEN) {
185
- this.ws.ping();
186
- }
187
- }, interval);
188
- }
189
- scheduleReconnect() {
190
- if (this.reconnectTimer) {
191
- return;
192
- }
193
- const interval = this.$config.reconnect_interval || 5000;
194
- this.reconnectTimer = setTimeout(async () => {
195
- this.reconnectTimer = undefined;
196
- try {
197
- await this.$connect();
198
- }
199
- catch (error) {
200
- this.emit('error', new Error(`Reconnection failed: ${error}`));
201
- this.scheduleReconnect();
202
- }
203
- }, interval);
204
- }
205
- }
206
- export class OneBot11WsServer extends EventEmitter {
207
- router;
208
- $config;
209
- $connected;
210
- #wss;
211
- #clientMap = new Map();
212
- heartbeatTimer;
213
- requestId = 0;
214
- pendingRequests = new Map();
215
- constructor(router, $config) {
216
- super();
217
- this.router = router;
218
- this.$config = $config;
219
- this.$connected = false;
220
- }
221
- async $connect() {
222
- if (!this.$config.access_token)
223
- plugin.logger.warn(`missing 'access_token', your OneBot protocol is not safely`);
224
- this.#wss = this.router.ws(this.$config.path, {
225
- verifyClient: (info) => {
226
- const { req: { headers }, } = info;
227
- const authorization = headers['authorization'] || '';
228
- if (this.$config.access_token && authorization !== `Bearer ${this.$config.access_token}`) {
229
- plugin.logger.error('鉴权失败');
230
- return false;
231
- }
232
- return true;
233
- }
234
- });
235
- this.$connected = true;
236
- plugin.logger.info(`ws server start at path:${this.$config.path}`);
237
- this.#wss.on('connection', (client, req) => {
238
- this.startHeartbeat();
239
- plugin.logger.info(`已连接到协议端:${req.socket.remoteAddress}`);
240
- client.on('error', err => {
241
- plugin.logger.error('连接出错:', err);
242
- });
243
- client.on('close', code => {
244
- plugin.logger.error(`与连接端(${req.socket.remoteAddress})断开,错误码:${code}`);
245
- for (const [key, value] of this.#clientMap) {
246
- if (client === value)
247
- this.#clientMap.delete(key);
248
- }
249
- });
250
- client.on('message', (data) => {
251
- try {
252
- const message = JSON.parse(data.toString());
253
- this.handleWebSocketMessage(client, message);
254
- }
255
- catch (error) {
256
- this.emit('error', error);
257
- }
258
- });
259
- });
260
- }
261
- async $disconnect() {
262
- this.#wss?.close();
263
- if (this.heartbeatTimer) {
264
- clearInterval(this.heartbeatTimer);
265
- delete this.heartbeatTimer;
266
- }
267
- }
268
- $formatMessage(onebotMsg) {
269
- const message = Message.from(onebotMsg, {
270
- $id: onebotMsg.message_id.toString(),
271
- $adapter: 'onebot11',
272
- $bot: `${this.$config.name}`,
273
- $sender: {
274
- id: onebotMsg.user_id.toString(),
275
- name: onebotMsg.user_id.toString()
276
- },
277
- $channel: {
278
- id: [onebotMsg.self_id, (onebotMsg.group_id || onebotMsg.user_id)].join(':'),
279
- type: onebotMsg.group_id ? 'group' : 'private'
280
- },
281
- $content: onebotMsg.message,
282
- $raw: onebotMsg.raw_message,
283
- $timestamp: onebotMsg.time,
284
- $reply: async (content, quote) => {
285
- if (!Array.isArray(content))
286
- content = [content];
287
- if (quote)
288
- content.unshift({ type: 'reply', data: { message_id: message.$id } });
289
- return await this.$sendMessage({
290
- ...message.$channel,
291
- context: 'onebot11',
292
- bot: `${this.$config.name}`,
293
- content
294
- });
295
- }
296
- });
297
- return message;
298
- }
299
- async $sendMessage(options) {
300
- options = await plugin.app.handleBeforeSend(options);
301
- const messageData = {
302
- message: options.content
303
- };
304
- if (options.type === 'group') {
305
- const [self_id, id] = options.id.split(':');
306
- const result = await this.callApi(self_id, 'send_group_msg', {
307
- group_id: parseInt(id),
308
- ...messageData
309
- });
310
- plugin.logger.info(`${this.$config.name} send ${options.type}(${id}):${segment.raw(options.content)}`);
311
- return result.message_id.toString();
312
- }
313
- else if (options.type === 'private') {
314
- const [self_id, id] = options.id.split(':');
315
- const result = await this.callApi(self_id, 'send_private_msg', {
316
- user_id: parseInt(id),
317
- ...messageData
318
- });
319
- plugin.logger.info(`${this.$config.name} send ${options.type}(${id}):${segment.raw(options.content)}`);
320
- return result.message_id.toString();
321
- }
322
- else {
323
- throw new Error('Either group_id or user_id must be provided');
324
- }
325
- return '';
326
- }
327
- async $recallMessage(id) {
328
- const [self_id, message_id] = id.split(':');
329
- await this.callApi(self_id, 'delete_msg', {
330
- message_id: parseInt(message_id)
331
- });
332
- }
333
- async callApi(self_id, action, params = {}) {
334
- const client = this.#clientMap.get(self_id);
335
- if (!client || client.readyState !== WebSocket.OPEN) {
336
- throw new Error('WebSocket is not connected');
337
- }
338
- const echo = `req_${++this.requestId}`;
339
- const message = {
340
- action,
341
- params,
342
- echo
343
- };
344
- return new Promise((resolve, reject) => {
345
- const timeout = setTimeout(() => {
346
- this.pendingRequests.delete(echo);
347
- reject(new Error(`API call timeout: ${action}`));
348
- }, 30000); // 30秒超时
349
- this.pendingRequests.set(echo, { resolve, reject, timeout });
350
- client.send(JSON.stringify(message));
351
- });
352
- }
353
- handleWebSocketMessage(client, message) {
354
- // 处理API响应
355
- if (message.echo && this.pendingRequests.has(message.echo)) {
356
- const request = this.pendingRequests.get(message.echo);
357
- this.pendingRequests.delete(message.echo);
358
- clearTimeout(request.timeout);
359
- const response = message;
360
- if (response.status === 'ok') {
361
- return request.resolve(response.data);
362
- }
363
- return request.reject(new Error(`API error: ${response.retcode}`));
364
- }
365
- switch (message.post_type) {
366
- case 'message':
367
- return this.handleMessage(message);
368
- case 'meta_event':
369
- return this.handleMetaEvent(client, message);
370
- }
371
- // 处理事件消息
372
- if (message.post_type === 'message') {
373
- }
374
- else if (message.post_type === 'meta_event' && message.meta_event_type === 'heartbeat') {
375
- // 心跳消息,暂时忽略
376
- }
377
- }
378
- handleMetaEvent(client, message) {
379
- switch (message.sub_type) {
380
- case 'heartbeat':
381
- break;
382
- case 'connect':
383
- this.#clientMap.set(message.self_id, client);
384
- plugin.logger.info(`client ${message.self_id} of ${this.$config.name} by ${this.$config.context} connected`);
385
- break;
386
- }
387
- }
388
- handleMessage(onebotMsg) {
389
- const message = this.$formatMessage(onebotMsg);
390
- plugin.dispatch('message.receive', message);
391
- plugin.logger.info(`${this.$config.name} recv ${message.$channel.type}(${onebotMsg.group_id || onebotMsg.user_id}):${segment.raw(message.$content)}`);
392
- plugin.dispatch(`message.${message.$channel.type}.receive`, message);
393
- }
394
- startHeartbeat() {
395
- const interval = this.$config.heartbeat_interval || 30000;
396
- this.heartbeatTimer = setInterval(() => {
397
- for (const client of this.#wss?.clients || []) {
398
- if (client && client.readyState === WebSocket.OPEN) {
399
- client.ping();
400
- }
401
- }
402
- }, interval);
403
- }
404
- }
405
- registerAdapter(new Adapter('onebot11', OneBot11WsClient));
406
- useContext('router', (router) => {
407
- registerAdapter(new Adapter('onebot11.wss', (c) => new OneBot11WsServer(router, c)));
408
- });
409
- //# sourceMappingURL=index.js.map
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAA8B,MAAM,IAAI,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAGL,OAAO,EACP,SAAS,EACT,OAAO,EACP,eAAe,EAGf,OAAO,EAAE,UAAU,EACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAyD5C,MAAM,MAAM,GAAE,SAAS,EAAE,CAAA;AACzB,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAY7B;IAXnB,UAAU,CAAU;IACZ,EAAE,CAAa;IACf,cAAc,CAAkB;IAChC,cAAc,CAAkB;IAChC,SAAS,GAAG,CAAC,CAAC;IACd,eAAe,GAAG,IAAI,GAAG,EAI7B,CAAC;IAEL,YAAmB,OAA+B;QAChD,KAAK,EAAE,CAAC;QADS,YAAO,GAAP,OAAO,CAAwB;QAEhD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;IACzB,CAAC;IAGD,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAC7B,MAAM,OAAO,GAA2B,EAAE,CAAC;YAE3C,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC9B,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YACnE,CAAC;YACD,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAE5C,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY;oBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;gBAChH,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC7B,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC5C,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBAC3B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBACnC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;gBACvB,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;gBACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5B,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;QAED,aAAa;QACb,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACjD,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAE7B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC;IACD,cAAc,CAAC,SAA0B;QACvC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;YACtC,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE;YACpC,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAC5B,OAAO,EAAE;gBACP,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE;gBAChC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE;aACnC;YACD,QAAQ,EAAE;gBACR,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;gBACxD,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aAC/C;YACD,QAAQ,EAAE,SAAS,CAAC,OAAO;YAC3B,IAAI,EAAE,SAAS,CAAC,WAAW;YAC3B,UAAU,EAAE,SAAS,CAAC,IAAI;YAC1B,MAAM,EAAE,KAAK,EAAE,OAAyB,EAAE,KAAwB,EAAmB,EAAE;gBACrF,IAAI,KAAK;oBAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;gBAChF,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC;oBAC7B,GAAG,OAAO,CAAC,QAAQ;oBACnB,OAAO,EAAE,UAAU;oBACnB,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;oBAC3B,OAAO;iBACR,CAAC,CAAA;YACJ,CAAC;SACF,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAoB;QACrC,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACpD,MAAM,WAAW,GAAQ;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAClD,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,GAAG,WAAW;aACf,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAC9G,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACtC,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;gBACpD,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,GAAG,WAAW;aACf,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAC9G,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YAC/B,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;IACO,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,SAAc,EAAE;QACpD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG;YACd,MAAM;YACN,MAAM;YACN,IAAI;SACL,CAAC;QAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC;YACnD,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ;YAEnB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,sBAAsB,CAAC,OAAY;QACzC,UAAU;QACV,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;YACxD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE9B,MAAM,QAAQ,GAAG,OAAsB,CAAC;YACxC,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,SAAS;QACT,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,OAAO,CAAC,SAAS,KAAK,YAAY,IAAI,OAAO,CAAC,eAAe,KAAK,WAAW,EAAE,CAAC;YACzF,YAAY;QACd,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,SAA0B;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAClI,MAAM,CAAC,QAAQ,CAAC,WAAW,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAEO,cAAc;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC1D,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACjB,CAAC;QACH,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAC;QACzD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC1C,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,wBAAwB,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC/D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC;CACF;AACD,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAY7B;IAAuB;IAX1C,UAAU,CAAU;IACpB,IAAI,CAAkB;IACtB,UAAU,GAA2B,IAAI,GAAG,EAAqB,CAAA;IACzD,cAAc,CAAkB;IAChC,SAAS,GAAG,CAAC,CAAC;IACd,eAAe,GAAG,IAAI,GAAG,EAI7B,CAAC;IAEL,YAAmB,MAAc,EAAS,OAA+B;QACvE,KAAK,EAAE,CAAC;QADS,WAAM,GAAN,MAAM,CAAQ;QAAS,YAAO,GAAP,OAAO,CAAwB;QAEvE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;IACzB,CAAC;IACD,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;QAChH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAC5C,YAAY,EAAE,CAAC,IAA+D,EAAE,EAAE;gBAChF,MAAM,EACJ,GAAG,EAAE,EAAE,OAAO,EAAE,GACjB,GAAG,IAAI,CAAC;gBACT,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,aAAa,KAAK,UAAU,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;oBACzF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC5B,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAA;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QAClE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YACzC,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;gBACvB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;gBACxB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,aAAa,WAAW,IAAI,EAAE,CAAC,CAAC;gBACvE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC3C,IAAI,MAAM,KAAK,KAAK;wBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC5B,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC5C,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC/C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBAC3B,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YAClC,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,cAAc,CAAC,SAA0B;QACvC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;YACtC,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE;YACpC,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAC5B,OAAO,EAAE;gBACP,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE;gBAChC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE;aACnC;YACD,QAAQ,EAAE;gBACR,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC5E,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aAC/C;YACD,QAAQ,EAAE,SAAS,CAAC,OAAO;YAC3B,IAAI,EAAE,SAAS,CAAC,WAAW;YAC3B,UAAU,EAAE,SAAS,CAAC,IAAI;YAC1B,MAAM,EAAE,KAAK,EAAE,OAAoB,EAAE,KAAwB,EAAmB,EAAE;gBAChF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oBAAE,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;gBACjD,IAAI,KAAK;oBAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;gBAChF,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC;oBAC7B,GAAG,OAAO,CAAC,QAAQ;oBACnB,OAAO,EAAE,UAAU;oBACnB,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;oBAC3B,OAAO;iBACR,CAAC,CAAA;YACJ,CAAC;SACF,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAoB;QACrC,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACpD,MAAM,WAAW,GAAQ;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;QACF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE;gBAC3D,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACtB,GAAG,WAAW;aACf,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACtG,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACtC,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,EAAE;gBAC7D,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACrB,GAAG,WAAW;aACf,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,OAAO,CAAC,IAAI,IAAI,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACtG,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE;YACxC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IACO,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,MAAc,EAAE,SAAc,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG;YACd,MAAM;YACN,MAAM;YACN,IAAI;SACL,CAAC;QAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC;YACnD,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ;YAEnB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,sBAAsB,CAAC,MAAiB,EAAE,OAAY;QAC5D,UAAU;QACV,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;YACxD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE9B,MAAM,QAAQ,GAAG,OAAsB,CAAC;YACxC,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC;YAC1B,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YACrC,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAChD,CAAC;QACD,SAAS;QACT,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACtC,CAAC;aAAM,IAAI,OAAO,CAAC,SAAS,KAAK,YAAY,IAAI,OAAO,CAAC,eAAe,KAAK,WAAW,EAAE,CAAC;YACzF,YAAY;QACd,CAAC;IACH,CAAC;IACO,eAAe,CAAC,MAAiB,EAAE,OAAY;QACrD,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,WAAW;gBACd,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,OAAO,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,YAAY,CAAC,CAAA;gBAC5G,MAAM;QACV,CAAC;IACH,CAAC;IACO,aAAa,CAAC,SAA0B;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACtJ,MAAM,CAAC,QAAQ,CAAC,WAAW,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAEO,cAAc;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC1D,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;gBAC9C,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;oBACnD,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC;CACF;AACD,eAAe,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAA;AAC1D,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;IAC9B,eAAe,CAAC,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAyB,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/G,CAAC,CAAC,CAAA"}
package/src/index.ts DELETED
@@ -1,498 +0,0 @@
1
- import WebSocket, { WebSocketServer } from 'ws';
2
- import { EventEmitter } from "events";
3
- import {
4
- Bot,
5
- Plugin,
6
- Adapter,
7
- usePlugin,
8
- Message,
9
- registerAdapter,
10
- MessageSegment,
11
- SendOptions,
12
- segment, useContext, SendContent
13
- } from 'zhin.js';
14
- import type { Router } from '@zhin.js/http'
15
- import { IncomingMessage } from "http";
16
- import { clearInterval } from "node:timers";
17
-
18
- // 声明模块,注册 onebot11 适配器类型
19
- declare module '@zhin.js/types' {
20
- interface RegisteredAdapters {
21
- 'onebot11': Adapter<OneBot11WsClient>
22
- 'onebot11.wss': Adapter<OneBot11WsServer>
23
- }
24
- }
25
- // ============================================================================
26
- // OneBot11 配置和类型
27
- // ============================================================================
28
-
29
- export interface OneBot11Config extends Bot.Config {
30
- context: 'onebot11';
31
- type: string
32
- access_token?: string;
33
- }
34
- export interface OneBot11WsClientConfig extends OneBot11Config {
35
- type: 'ws'
36
- url: string;
37
- reconnect_interval?: number;
38
- heartbeat_interval?: number;
39
- }
40
- export interface OneBot11WsServerConfig extends OneBot11Config {
41
- type: 'ws_reverse'
42
- path: string
43
- heartbeat_interval?: number;
44
- }
45
- export interface OneBot11HTTPConfig extends OneBot11Config {
46
- type: 'http_sse'
47
- port: number
48
- path: string
49
- }
50
-
51
- interface OneBot11Message {
52
- post_type: string;
53
- self_id: string
54
- message_type?: string;
55
- sub_type?: string;
56
- message_id: number;
57
- user_id: number;
58
- group_id?: number;
59
- message: Array<{
60
- type: string;
61
- data: Record<string, any>;
62
- }>;
63
- raw_message: string;
64
- time: number;
65
- }
66
-
67
- interface ApiResponse<T = any> {
68
- status: string;
69
- retcode: number;
70
- data: T;
71
- echo?: string;
72
- }
73
- const plugin =usePlugin()
74
- // ============================================================================
75
- // OneBot11 适配器实现
76
- // ============================================================================
77
-
78
- export class OneBot11WsClient extends EventEmitter implements Bot<OneBot11Message, OneBot11WsClientConfig> {
79
- $connected?: boolean
80
- private ws?: WebSocket;
81
- private reconnectTimer?: NodeJS.Timeout;
82
- private heartbeatTimer?: NodeJS.Timeout;
83
- private requestId = 0;
84
- private pendingRequests = new Map<string, {
85
- resolve: (value: any) => void;
86
- reject: (error: Error) => void;
87
- timeout: NodeJS.Timeout;
88
- }>();
89
-
90
- constructor(public $config: OneBot11WsClientConfig) {
91
- super();
92
- this.$connected = false
93
- }
94
-
95
-
96
- async $connect(): Promise<void> {
97
- return new Promise((resolve, reject) => {
98
- let wsUrl = this.$config.url;
99
- const headers: Record<string, string> = {};
100
-
101
- if (this.$config.access_token) {
102
- headers['Authorization'] = `Bearer ${this.$config.access_token}`;
103
- }
104
- this.ws = new WebSocket(wsUrl, { headers });
105
-
106
- this.ws.on('open', () => {
107
- this.$connected = true;
108
- if (!this.$config.access_token) plugin.logger.warn(`missing 'access_token', your OneBot protocol is not safely`)
109
- this.startHeartbeat();
110
- resolve();
111
- });
112
-
113
- this.ws.on('message', (data) => {
114
- try {
115
- const message = JSON.parse(data.toString());
116
- this.handleWebSocketMessage(message);
117
- } catch (error) {
118
- this.emit('error', error)
119
- }
120
- });
121
-
122
- this.ws.on('close', (code, reason) => {
123
- this.$connected = false
124
- reject({ code, reason })
125
- this.scheduleReconnect();
126
- });
127
-
128
- this.ws.on('error', (error) => {
129
- reject(error);
130
- });
131
- });
132
- }
133
-
134
- async $disconnect(): Promise<void> {
135
- if (this.reconnectTimer) {
136
- clearTimeout(this.reconnectTimer);
137
- this.reconnectTimer = undefined;
138
- }
139
-
140
- if (this.heartbeatTimer) {
141
- clearInterval(this.heartbeatTimer);
142
- this.heartbeatTimer = undefined;
143
- }
144
-
145
- // 清理所有待处理的请求
146
- for (const [id, request] of this.pendingRequests) {
147
- clearTimeout(request.timeout);
148
- request.reject(new Error('Connection closed'));
149
- }
150
- this.pendingRequests.clear();
151
-
152
- if (this.ws) {
153
- this.ws.close();
154
- this.ws = undefined;
155
- }
156
- }
157
- $formatMessage(onebotMsg: OneBot11Message) {
158
- const message = Message.from(onebotMsg, {
159
- $id: onebotMsg.message_id.toString(),
160
- $adapter: 'onebot11',
161
- $bot: `${this.$config.name}`,
162
- $sender: {
163
- id: onebotMsg.user_id.toString(),
164
- name: onebotMsg.user_id.toString()
165
- },
166
- $channel: {
167
- id: (onebotMsg.group_id || onebotMsg.user_id).toString(),
168
- type: onebotMsg.group_id ? 'group' : 'private'
169
- },
170
- $content: onebotMsg.message,
171
- $raw: onebotMsg.raw_message,
172
- $timestamp: onebotMsg.time,
173
- $reply: async (content: MessageSegment[], quote?: boolean | string): Promise<string> => {
174
- if (quote) content.unshift({ type: 'reply', data: { message_id: message.$id } })
175
- return await this.$sendMessage({
176
- ...message.$channel,
177
- context: 'onebot11',
178
- bot: `${this.$config.name}`,
179
- content
180
- })
181
- }
182
- })
183
- return message
184
- }
185
-
186
- async $sendMessage(options: SendOptions): Promise<string> {
187
- options = await plugin.app.handleBeforeSend(options)
188
- const messageData: any = {
189
- message: options.content
190
- };
191
- if (options.type === 'group') {
192
- const result = await this.callApi('send_group_msg', {
193
- group_id: parseInt(options.id),
194
- ...messageData
195
- });
196
- plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`)
197
- return result.message_id.toString();
198
- } else if (options.type === 'private') {
199
- const result = await this.callApi('send_private_msg', {
200
- user_id: parseInt(options.id),
201
- ...messageData
202
- });
203
- plugin.logger.info(`${this.$config.name} send ${options.type}(${options.id}):${segment.raw(options.content)}`)
204
- return result.message_id.toString();
205
- } else {
206
- throw new Error('Either group_id or user_id must be provided');
207
- }
208
- return '';
209
- }
210
- async $recallMessage(id: string): Promise<void> {
211
- await this.callApi('delete_msg', {
212
- message_id: parseInt(id)
213
- });
214
- }
215
- private async callApi(action: string, params: any = {}): Promise<any> {
216
- if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
217
- throw new Error('WebSocket is not connected');
218
- }
219
-
220
- const echo = `req_${++this.requestId}`;
221
- const message = {
222
- action,
223
- params,
224
- echo
225
- };
226
-
227
- return new Promise((resolve, reject) => {
228
- const timeout = setTimeout(() => {
229
- this.pendingRequests.delete(echo);
230
- reject(new Error(`API call timeout: ${action}`));
231
- }, 30000); // 30秒超时
232
-
233
- this.pendingRequests.set(echo, { resolve, reject, timeout });
234
- this.ws!.send(JSON.stringify(message));
235
- });
236
- }
237
-
238
- private handleWebSocketMessage(message: any): void {
239
- // 处理API响应
240
- if (message.echo && this.pendingRequests.has(message.echo)) {
241
- const request = this.pendingRequests.get(message.echo)!;
242
- this.pendingRequests.delete(message.echo);
243
- clearTimeout(request.timeout);
244
-
245
- const response = message as ApiResponse;
246
- if (response.status === 'ok') {
247
- return request.resolve(response.data);
248
- }
249
- return request.reject(new Error(`API error: ${response.retcode}`));
250
- }
251
-
252
- // 处理事件消息
253
- if (message.post_type === 'message') {
254
- this.handleOneBot11Message(message);
255
- } else if (message.post_type === 'meta_event' && message.meta_event_type === 'heartbeat') {
256
- // 心跳消息,暂时忽略
257
- }
258
- }
259
-
260
- private handleOneBot11Message(onebotMsg: OneBot11Message): void {
261
- const message = this.$formatMessage(onebotMsg);
262
- plugin.dispatch('message.receive', message)
263
- plugin.logger.info(`${this.$config.name} recv ${message.$channel.type}(${message.$channel.id}):${segment.raw(message.$content)}`)
264
- plugin.dispatch(`message.${message.$channel.type}.receive`, message)
265
- }
266
-
267
- private startHeartbeat(): void {
268
- const interval = this.$config.heartbeat_interval || 30000;
269
- this.heartbeatTimer = setInterval(() => {
270
- if (this.ws && this.ws.readyState === WebSocket.OPEN) {
271
- this.ws.ping();
272
- }
273
- }, interval);
274
- }
275
-
276
- private scheduleReconnect(): void {
277
- if (this.reconnectTimer) {
278
- return;
279
- }
280
-
281
- const interval = this.$config.reconnect_interval || 5000;
282
- this.reconnectTimer = setTimeout(async () => {
283
- this.reconnectTimer = undefined;
284
- try {
285
- await this.$connect();
286
- } catch (error) {
287
- this.emit('error', new Error(`Reconnection failed: ${error}`));
288
- this.scheduleReconnect();
289
- }
290
- }, interval);
291
- }
292
- }
293
- export class OneBot11WsServer extends EventEmitter implements Bot<OneBot11Message, OneBot11WsServerConfig> {
294
- $connected?: boolean
295
- #wss?: WebSocketServer
296
- #clientMap: Map<string, WebSocket> = new Map<string, WebSocket>()
297
- private heartbeatTimer?: NodeJS.Timeout;
298
- private requestId = 0;
299
- private pendingRequests = new Map<string, {
300
- resolve: (value: any) => void;
301
- reject: (error: Error) => void;
302
- timeout: NodeJS.Timeout;
303
- }>();
304
-
305
- constructor(public router: Router, public $config: OneBot11WsServerConfig) {
306
- super();
307
- this.$connected = false
308
- }
309
- async $connect(): Promise<void> {
310
- if (!this.$config.access_token) plugin.logger.warn(`missing 'access_token', your OneBot protocol is not safely`)
311
- this.#wss = this.router.ws(this.$config.path, {
312
- verifyClient: (info: { origin: string; secure: boolean; req: IncomingMessage }) => {
313
- const {
314
- req: { headers },
315
- } = info;
316
- const authorization = headers['authorization'] || '';
317
- if (this.$config.access_token && authorization !== `Bearer ${this.$config.access_token}`) {
318
- plugin.logger.error('鉴权失败');
319
- return false;
320
- }
321
- return true;
322
- }
323
- })
324
- this.$connected = true;
325
- plugin.logger.info(`ws server start at path:${this.$config.path}`)
326
- this.#wss.on('connection', (client, req) => {
327
- this.startHeartbeat();
328
- plugin.logger.info(`已连接到协议端:${req.socket.remoteAddress}`);
329
- client.on('error', err => {
330
- plugin.logger.error('连接出错:', err);
331
- });
332
- client.on('close', code => {
333
- plugin.logger.error(`与连接端(${req.socket.remoteAddress})断开,错误码:${code}`);
334
- for (const [key, value] of this.#clientMap) {
335
- if (client === value) this.#clientMap.delete(key)
336
- }
337
- });
338
- client.on('message', (data) => {
339
- try {
340
- const message = JSON.parse(data.toString());
341
- this.handleWebSocketMessage(client, message);
342
- } catch (error) {
343
- this.emit('error', error)
344
- }
345
- })
346
- });
347
- }
348
-
349
- async $disconnect(): Promise<void> {
350
- this.#wss?.close();
351
- if (this.heartbeatTimer) {
352
- clearInterval(this.heartbeatTimer)
353
- delete this.heartbeatTimer;
354
- }
355
- }
356
- $formatMessage(onebotMsg: OneBot11Message) {
357
- const message = Message.from(onebotMsg, {
358
- $id: onebotMsg.message_id.toString(),
359
- $adapter: 'onebot11',
360
- $bot: `${this.$config.name}`,
361
- $sender: {
362
- id: onebotMsg.user_id.toString(),
363
- name: onebotMsg.user_id.toString()
364
- },
365
- $channel: {
366
- id: [onebotMsg.self_id, (onebotMsg.group_id || onebotMsg.user_id)].join(':'),
367
- type: onebotMsg.group_id ? 'group' : 'private'
368
- },
369
- $content: onebotMsg.message,
370
- $raw: onebotMsg.raw_message,
371
- $timestamp: onebotMsg.time,
372
- $reply: async (content: SendContent, quote?: boolean | string): Promise<string> => {
373
- if (!Array.isArray(content)) content = [content];
374
- if (quote) content.unshift({ type: 'reply', data: { message_id: message.$id } })
375
- return await this.$sendMessage({
376
- ...message.$channel,
377
- context: 'onebot11',
378
- bot: `${this.$config.name}`,
379
- content
380
- })
381
- }
382
- })
383
- return message
384
- }
385
-
386
- async $sendMessage(options: SendOptions): Promise<string> {
387
- options = await plugin.app.handleBeforeSend(options)
388
- const messageData: any = {
389
- message: options.content
390
- };
391
- if (options.type === 'group') {
392
- const [self_id, id] = options.id.split(':')
393
- const result = await this.callApi(self_id, 'send_group_msg', {
394
- group_id: parseInt(id),
395
- ...messageData
396
- });
397
- plugin.logger.info(`${this.$config.name} send ${options.type}(${id}):${segment.raw(options.content)}`)
398
- return result.message_id.toString();
399
- } else if (options.type === 'private') {
400
- const [self_id, id] = options.id.split(':')
401
- const result = await this.callApi(self_id, 'send_private_msg', {
402
- user_id: parseInt(id),
403
- ...messageData
404
- });
405
- plugin.logger.info(`${this.$config.name} send ${options.type}(${id}):${segment.raw(options.content)}`)
406
- return result.message_id.toString();
407
- } else {
408
- throw new Error('Either group_id or user_id must be provided');
409
- }
410
- return '';
411
- }
412
- async $recallMessage(id: string): Promise<void> {
413
- const [self_id, message_id] = id.split(':')
414
- await this.callApi(self_id, 'delete_msg', {
415
- message_id: parseInt(message_id)
416
- });
417
- }
418
- private async callApi(self_id: string, action: string, params: any = {}): Promise<any> {
419
- const client = this.#clientMap.get(self_id)
420
- if (!client || client.readyState !== WebSocket.OPEN) {
421
- throw new Error('WebSocket is not connected');
422
- }
423
-
424
- const echo = `req_${++this.requestId}`;
425
- const message = {
426
- action,
427
- params,
428
- echo
429
- };
430
-
431
- return new Promise((resolve, reject) => {
432
- const timeout = setTimeout(() => {
433
- this.pendingRequests.delete(echo);
434
- reject(new Error(`API call timeout: ${action}`));
435
- }, 30000); // 30秒超时
436
-
437
- this.pendingRequests.set(echo, { resolve, reject, timeout });
438
- client.send(JSON.stringify(message));
439
- });
440
- }
441
-
442
- private handleWebSocketMessage(client: WebSocket, message: any): void {
443
- // 处理API响应
444
- if (message.echo && this.pendingRequests.has(message.echo)) {
445
- const request = this.pendingRequests.get(message.echo)!;
446
- this.pendingRequests.delete(message.echo);
447
- clearTimeout(request.timeout);
448
-
449
- const response = message as ApiResponse;
450
- if (response.status === 'ok') {
451
- return request.resolve(response.data);
452
- }
453
- return request.reject(new Error(`API error: ${response.retcode}`));
454
- }
455
- switch (message.post_type) {
456
- case 'message':
457
- return this.handleMessage(message);
458
- case 'meta_event':
459
- return this.handleMetaEvent(client, message)
460
- }
461
- // 处理事件消息
462
- if (message.post_type === 'message') {
463
- } else if (message.post_type === 'meta_event' && message.meta_event_type === 'heartbeat') {
464
- // 心跳消息,暂时忽略
465
- }
466
- }
467
- private handleMetaEvent(client: WebSocket, message: any) {
468
- switch (message.sub_type) {
469
- case 'heartbeat':
470
- break;
471
- case 'connect':
472
- this.#clientMap.set(message.self_id, client);
473
- plugin.logger.info(`client ${message.self_id} of ${this.$config.name} by ${this.$config.context} connected`)
474
- break;
475
- }
476
- }
477
- private handleMessage(onebotMsg: OneBot11Message): void {
478
- const message = this.$formatMessage(onebotMsg);
479
- plugin.dispatch('message.receive', message)
480
- plugin.logger.info(`${this.$config.name} recv ${message.$channel.type}(${onebotMsg.group_id || onebotMsg.user_id}):${segment.raw(message.$content)}`)
481
- plugin.dispatch(`message.${message.$channel.type}.receive`, message)
482
- }
483
-
484
- private startHeartbeat(): void {
485
- const interval = this.$config.heartbeat_interval || 30000;
486
- this.heartbeatTimer = setInterval(() => {
487
- for (const client of this.#wss?.clients || []) {
488
- if (client && client.readyState === WebSocket.OPEN) {
489
- client.ping();
490
- }
491
- }
492
- }, interval);
493
- }
494
- }
495
- registerAdapter(new Adapter('onebot11', OneBot11WsClient))
496
- useContext('router', (router) => {
497
- registerAdapter(new Adapter('onebot11.wss', (c: OneBot11WsServerConfig) => new OneBot11WsServer(router, c)));
498
- })
package/tsconfig.json DELETED
@@ -1,24 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "ESNext",
5
- "moduleResolution": "bundler",
6
- "outDir": "./lib",
7
- "rootDir": "./src",
8
- "strict": true,
9
- "esModuleInterop": true,
10
- "skipLibCheck": true,
11
- "forceConsistentCasingInFileNames": true,
12
- "resolveJsonModule": true,
13
- "isolatedModules": true,
14
- "allowSyntheticDefaultImports": true,
15
- "experimentalDecorators": true,
16
- "emitDecoratorMetadata": true,
17
- "declaration": true,
18
- "declarationMap": true,
19
- "sourceMap": true,
20
- "verbatimModuleSyntax": false
21
- },
22
- "include": ["src/**/*"],
23
- "exclude": ["lib", "node_modules"]
24
- }