node-karin 0.11.10 → 0.11.11
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/lib/adapter/input/index.js +1 -1
- package/lib/adapter/onebot/11/event.js +4 -4
- package/lib/adapter/onebot/11/index.js +3 -3
- package/lib/core/index.d.ts +1 -1
- package/lib/core/index.js +1 -1
- package/lib/core/karin/karin.d.ts +14 -3
- package/lib/core/karin/karin.js +29 -15
- package/lib/core/listener/listener.d.ts +61 -21
- package/lib/core/listener/listener.js +29 -28
- package/lib/core/plugin/loader.js +4 -4
- package/lib/core/process/process.js +4 -4
- package/lib/core/server/server.d.ts +1 -1
- package/lib/core/server/server.js +4 -4
- package/lib/event/handler/message.js +5 -5
- package/lib/event/handler/notice.js +3 -2
- package/lib/event/handler/request.js +2 -1
- package/lib/event/handler/review.d.ts +8 -8
- package/lib/utils/common/common.d.ts +9 -0
- package/lib/utils/common/common.js +18 -0
- package/lib/utils/config/config.d.ts +2 -2
- package/lib/utils/config/config.js +1 -1
- package/package.json +1 -1
|
@@ -98,7 +98,7 @@ export class AdapterInput {
|
|
|
98
98
|
this.SendMessage(e.contact, elements);
|
|
99
99
|
return { message_id: e.message_id, message_time: Date.now(), raw_data: elements };
|
|
100
100
|
};
|
|
101
|
-
listener.emit('message', e);
|
|
101
|
+
listener.emit('adapter.message', e);
|
|
102
102
|
}
|
|
103
103
|
async #MsgToFile(type, file) {
|
|
104
104
|
if (!msgToFile)
|
|
@@ -81,7 +81,7 @@ export class OB11Event {
|
|
|
81
81
|
* 快速回复 开发者不应该使用这个方法,应该使用由karin封装过后的reply方法
|
|
82
82
|
*/
|
|
83
83
|
e.replyCallback = async (elements) => await this.adapter.SendMessage(e.contact, elements);
|
|
84
|
-
listener.emit('message', e);
|
|
84
|
+
listener.emit('adapter.message', e);
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
87
|
* 通知事件
|
|
@@ -360,7 +360,7 @@ export class OB11Event {
|
|
|
360
360
|
* 快速回复 开发者不应该使用这个方法,应该使用由karin封装过后的reply方法
|
|
361
361
|
*/
|
|
362
362
|
notice.replyCallback = async (elements) => await this.adapter.SendMessage(notice.contact, elements);
|
|
363
|
-
listener.emit('notice', notice);
|
|
363
|
+
listener.emit('adapter.notice', notice);
|
|
364
364
|
}
|
|
365
365
|
/** 请求事件 */
|
|
366
366
|
requestEvent(data) {
|
|
@@ -395,7 +395,7 @@ export class OB11Event {
|
|
|
395
395
|
* 快速回复 开发者不应该使用这个方法,应该使用由karin封装过后的reply方法
|
|
396
396
|
*/
|
|
397
397
|
request.replyCallback = async (elements) => await this.adapter.SendMessage(request.contact, elements);
|
|
398
|
-
listener.emit('request', request);
|
|
398
|
+
listener.emit('adapter.request', request);
|
|
399
399
|
return;
|
|
400
400
|
}
|
|
401
401
|
case 'group': {
|
|
@@ -431,7 +431,7 @@ export class OB11Event {
|
|
|
431
431
|
* 快速回复 开发者不应该使用这个方法,应该使用由karin封装过后的reply方法
|
|
432
432
|
*/
|
|
433
433
|
request.replyCallback = async (elements) => await this.adapter.SendMessage(request.contact, elements);
|
|
434
|
-
listener.emit('request', request);
|
|
434
|
+
listener.emit('adapter.request', request);
|
|
435
435
|
return;
|
|
436
436
|
}
|
|
437
437
|
default: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import WebSocket from 'ws';
|
|
2
2
|
import { randomUUID } from 'crypto';
|
|
3
|
-
import {
|
|
3
|
+
import { karin } from '../../../core/karin/karin.js';
|
|
4
4
|
import { common, config, logger, segment } from '../../../utils/index.js';
|
|
5
5
|
import { OB11Event } from './event.js';
|
|
6
6
|
import { AdapterConvertKarin, KarinConvertAdapter } from './convert.js';
|
|
@@ -80,7 +80,7 @@ export class AdapterOneBot11 {
|
|
|
80
80
|
/** 停止全部监听 */
|
|
81
81
|
this.socket.removeAllListeners();
|
|
82
82
|
/** 注销bot */
|
|
83
|
-
this.adapter.index &&
|
|
83
|
+
this.adapter.index && karin.delBot(this.adapter.index);
|
|
84
84
|
/** 正向ws需要重连 */
|
|
85
85
|
if (this.adapter.sub_type === 'client') {
|
|
86
86
|
this.index++;
|
|
@@ -121,7 +121,7 @@ export class AdapterOneBot11 {
|
|
|
121
121
|
this.account.name = data.account_name;
|
|
122
122
|
this.logger('info', `[加载完成][app_name:${this.version.name}][version:${this.version.version}] ` + logger.green(this.adapter.connect));
|
|
123
123
|
/** 注册bot */
|
|
124
|
-
const index =
|
|
124
|
+
const index = karin.addBot({ type: this.adapter.type, bot: this });
|
|
125
125
|
if (index)
|
|
126
126
|
this.adapter.index = index;
|
|
127
127
|
}
|
package/lib/core/index.d.ts
CHANGED
package/lib/core/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Contact, KarinElement, KarinMessage, KarinRenderType, PermissionType, RenderResult, KarinNoticeType, KarinRequestType, KarinMessageType, AllMessageSubType, CommandInfo, TaskInfo, HandlerInfo, AcceptInfo, UseInfo, AllNoticeSubType, AllRequestSubType } from '../../types/index.js';
|
|
2
|
+
import { Listeners } from '../listener/listener.js';
|
|
2
3
|
type FncFunction = (e: KarinMessage) => Promise<boolean>;
|
|
3
4
|
type FncElement = string | KarinElement | Array<KarinElement>;
|
|
4
5
|
type UseReceive = (e: KarinMessageType, next: Function, exit: Function) => Promise<void>;
|
|
@@ -68,8 +69,8 @@ export interface OptionsElement extends OptionsCommand {
|
|
|
68
69
|
*/
|
|
69
70
|
stop?: boolean;
|
|
70
71
|
}
|
|
71
|
-
export declare class Karin {
|
|
72
|
-
|
|
72
|
+
export declare class Karin extends Listeners {
|
|
73
|
+
#private;
|
|
73
74
|
constructor();
|
|
74
75
|
/**
|
|
75
76
|
* @param reg - 正则表达式
|
|
@@ -165,7 +166,17 @@ export declare class Karin {
|
|
|
165
166
|
/**
|
|
166
167
|
* - 启动
|
|
167
168
|
*/
|
|
168
|
-
run(): void
|
|
169
|
+
run(): Promise<void>;
|
|
169
170
|
}
|
|
170
171
|
export declare const karin: Karin;
|
|
172
|
+
/**
|
|
173
|
+
* 即将废弃 请使用karin
|
|
174
|
+
* @deprecated
|
|
175
|
+
*/
|
|
176
|
+
export declare const listener: Karin;
|
|
177
|
+
/**
|
|
178
|
+
* 即将废弃 请使用karin
|
|
179
|
+
* @deprecated
|
|
180
|
+
*/
|
|
181
|
+
export declare const Bot: Karin;
|
|
171
182
|
export default karin;
|
package/lib/core/karin/karin.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import { server } from '../server/server.js';
|
|
2
1
|
import { stateArr } from '../plugin/base.js';
|
|
3
|
-
import { common } from '../../utils/index.js';
|
|
4
|
-
import { listener } from '../listener/listener.js';
|
|
5
2
|
import onebot11 from '../../adapter/onebot/11/index.js';
|
|
6
|
-
import { render
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
import { render } from '../../render/app.js';
|
|
4
|
+
import { RenderServer } from '../../render/server.js';
|
|
5
|
+
import { pluginLoader } from '../plugin/loader.js';
|
|
6
|
+
import { common } from '../../utils/common/common.js';
|
|
7
|
+
import { logger } from '../../utils/core/logger.js';
|
|
8
|
+
import { Listeners } from '../listener/listener.js';
|
|
9
|
+
export class Karin extends Listeners {
|
|
10
|
+
/** 是否启动 */
|
|
11
|
+
#start;
|
|
9
12
|
constructor() {
|
|
10
|
-
|
|
13
|
+
super();
|
|
14
|
+
this.#start = false;
|
|
11
15
|
this.run();
|
|
12
16
|
}
|
|
13
17
|
/**
|
|
@@ -138,7 +142,6 @@ export class Karin {
|
|
|
138
142
|
const userId = options?.userId || e.user_id;
|
|
139
143
|
const key = e.group_id ? `${e.group_id}.${userId}` : userId;
|
|
140
144
|
stateArr[key] = { type: 'ctx' };
|
|
141
|
-
// 返回promise 设置超时时间
|
|
142
145
|
return new Promise((resolve, reject) => {
|
|
143
146
|
setTimeout(() => {
|
|
144
147
|
if (stateArr[key]) {
|
|
@@ -149,7 +152,7 @@ export class Karin {
|
|
|
149
152
|
return true;
|
|
150
153
|
}
|
|
151
154
|
}, time * 1000);
|
|
152
|
-
|
|
155
|
+
this.once(`ctx:${key}`, (e) => resolve(e));
|
|
153
156
|
});
|
|
154
157
|
}
|
|
155
158
|
/**
|
|
@@ -187,15 +190,26 @@ export class Karin {
|
|
|
187
190
|
/**
|
|
188
191
|
* - 启动
|
|
189
192
|
*/
|
|
190
|
-
run() {
|
|
191
|
-
if (this
|
|
193
|
+
async run() {
|
|
194
|
+
if (this.#start)
|
|
192
195
|
return;
|
|
193
|
-
this
|
|
196
|
+
this.#start = true;
|
|
197
|
+
const { server } = await import('../server/server.js');
|
|
194
198
|
server.init();
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
199
|
+
pluginLoader.load();
|
|
200
|
+
this.emit('adapter', RenderServer);
|
|
201
|
+
this.emit('adapter', onebot11);
|
|
198
202
|
}
|
|
199
203
|
}
|
|
200
204
|
export const karin = new Karin();
|
|
205
|
+
/**
|
|
206
|
+
* 即将废弃 请使用karin
|
|
207
|
+
* @deprecated
|
|
208
|
+
*/
|
|
209
|
+
export const listener = karin;
|
|
210
|
+
/**
|
|
211
|
+
* 即将废弃 请使用karin
|
|
212
|
+
* @deprecated
|
|
213
|
+
*/
|
|
214
|
+
export const Bot = karin;
|
|
201
215
|
export default karin;
|
|
@@ -1,36 +1,81 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
|
-
import { KarinAdapter,
|
|
2
|
+
import { Contact, KarinElement, KarinAdapter, KarinMessage, KarinNoticeType, KarinRequestType, KarinMessageType } from '../../types/index.js';
|
|
3
|
+
type AdapterType = KarinAdapter['adapter']['type'];
|
|
4
|
+
type onAdapter = {
|
|
5
|
+
type: AdapterType;
|
|
6
|
+
adapter: new () => KarinAdapter;
|
|
7
|
+
path?: string;
|
|
8
|
+
};
|
|
3
9
|
/**
|
|
4
|
-
*
|
|
10
|
+
* 产生事件映射
|
|
11
|
+
*/
|
|
12
|
+
export interface EmittEventMap {
|
|
13
|
+
'karin:count:send': number;
|
|
14
|
+
'karin:count:fnc': string;
|
|
15
|
+
error: any;
|
|
16
|
+
adapter: onAdapter;
|
|
17
|
+
'adapter.message': KarinMessageType;
|
|
18
|
+
'adapter.notice': KarinNoticeType;
|
|
19
|
+
'adapter.request': KarinRequestType;
|
|
20
|
+
message: KarinMessageType;
|
|
21
|
+
notice: KarinNoticeType;
|
|
22
|
+
request: KarinRequestType;
|
|
23
|
+
'plugin.watch': undefined;
|
|
24
|
+
'restart.grpc': undefined;
|
|
25
|
+
'restart.http': undefined;
|
|
26
|
+
}
|
|
27
|
+
/** 上下文 */
|
|
28
|
+
type ContextEvents = {
|
|
29
|
+
[K in `ctx:${string}`]: (e: KarinMessage) => void;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* 监听事件映射
|
|
33
|
+
*/
|
|
34
|
+
export interface OnEventMap extends ContextEvents {
|
|
35
|
+
'karin:count:send': (count: number) => void;
|
|
36
|
+
'karin:count:fnc': (fnc: string) => void;
|
|
37
|
+
error: (error: any) => void;
|
|
38
|
+
adapter: (data: onAdapter) => void;
|
|
39
|
+
'adapter.message': (data: KarinMessageType) => void;
|
|
40
|
+
'adapter.notice': (data: KarinNoticeType) => void;
|
|
41
|
+
'adapter.request': (data: KarinRequestType) => void;
|
|
42
|
+
message: (data: KarinMessageType) => void;
|
|
43
|
+
notice: (data: KarinNoticeType) => void;
|
|
44
|
+
request: (data: KarinRequestType) => void;
|
|
45
|
+
'plugin.watch': undefined;
|
|
46
|
+
'restart.grpc': undefined;
|
|
47
|
+
'restart.http': undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 监听器实例
|
|
5
51
|
*/
|
|
6
52
|
export declare class Listeners extends EventEmitter {
|
|
7
53
|
#private;
|
|
8
|
-
/**
|
|
9
|
-
* Bot索引
|
|
10
|
-
* @type - Bot索引
|
|
11
|
-
*/
|
|
12
|
-
index: number;
|
|
13
|
-
/**
|
|
14
|
-
* 框架名称
|
|
15
|
-
*/
|
|
54
|
+
/** 框架名称 */
|
|
16
55
|
name: string;
|
|
56
|
+
/** Bot列表 */
|
|
17
57
|
list: Array<{
|
|
18
58
|
index: number;
|
|
19
|
-
type:
|
|
59
|
+
type: AdapterType;
|
|
20
60
|
bot: KarinAdapter;
|
|
21
61
|
}>;
|
|
62
|
+
/** 适配器列表 */
|
|
22
63
|
adapter: Array<{
|
|
23
|
-
type:
|
|
64
|
+
type: AdapterType;
|
|
24
65
|
adapter: new () => KarinAdapter;
|
|
25
66
|
path: string;
|
|
26
67
|
}>;
|
|
27
68
|
constructor();
|
|
69
|
+
on<K extends keyof OnEventMap>(event: K, listener: OnEventMap[K]): this;
|
|
70
|
+
on(event: string, listener: (...args: any[]) => void): this;
|
|
71
|
+
emit<K extends keyof EmittEventMap>(event: K, ...args: Parameters<EmittEventMap[K]>): boolean;
|
|
72
|
+
emit(event: string | symbol, ...args: any[]): boolean;
|
|
28
73
|
/**
|
|
29
74
|
* 注册Bot 返回索引id
|
|
30
75
|
*/
|
|
31
76
|
addBot(data: {
|
|
32
77
|
bot: KarinAdapter;
|
|
33
|
-
type:
|
|
78
|
+
type: AdapterType;
|
|
34
79
|
}): number | false;
|
|
35
80
|
/**
|
|
36
81
|
* 卸载Bot
|
|
@@ -66,11 +111,7 @@ export declare class Listeners extends EventEmitter {
|
|
|
66
111
|
* @param data.adapter - 适配器实例
|
|
67
112
|
* @param data.path - 适配器路径
|
|
68
113
|
*/
|
|
69
|
-
addAdapter(data:
|
|
70
|
-
type: KarinAdapter['adapter']['type'];
|
|
71
|
-
adapter: new () => KarinAdapter;
|
|
72
|
-
path?: string;
|
|
73
|
-
}): void;
|
|
114
|
+
addAdapter(data: onAdapter): void;
|
|
74
115
|
/**
|
|
75
116
|
* 通过path获取适配器 仅适用于反向WS适配器
|
|
76
117
|
* @param path - 适配器路径
|
|
@@ -81,7 +122,7 @@ export declare class Listeners extends EventEmitter {
|
|
|
81
122
|
* @param isType - 是否返回包含的类型列表 默认返回适配器实例列表
|
|
82
123
|
*/
|
|
83
124
|
getAdapterAll(isType?: boolean): {
|
|
84
|
-
type:
|
|
125
|
+
type: AdapterType;
|
|
85
126
|
adapter: new () => KarinAdapter;
|
|
86
127
|
path: string;
|
|
87
128
|
}[] | (new () => KarinAdapter)[];
|
|
@@ -101,5 +142,4 @@ export declare class Listeners extends EventEmitter {
|
|
|
101
142
|
message_id: string;
|
|
102
143
|
}>;
|
|
103
144
|
}
|
|
104
|
-
export
|
|
105
|
-
export declare const Bot: Listeners;
|
|
145
|
+
export {};
|
|
@@ -4,46 +4,44 @@ import { pluginLoader } from '../plugin/loader.js';
|
|
|
4
4
|
import { common, logger, config, segment } from '../../utils/index.js';
|
|
5
5
|
import { MessageHandler, NoticeHandler, RequestHandler } from '../../event/index.js';
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* 监听器实例
|
|
8
8
|
*/
|
|
9
9
|
export class Listeners extends EventEmitter {
|
|
10
|
-
/**
|
|
11
|
-
* Bot索引
|
|
12
|
-
* @type - Bot索引
|
|
13
|
-
*/
|
|
14
|
-
index;
|
|
15
|
-
/**
|
|
16
|
-
* 框架名称
|
|
17
|
-
*/
|
|
10
|
+
/** 框架名称 */
|
|
18
11
|
name;
|
|
12
|
+
/** Bot列表 */
|
|
19
13
|
list;
|
|
14
|
+
/** 适配器列表 */
|
|
20
15
|
adapter;
|
|
16
|
+
/** Bot自增索引 */
|
|
17
|
+
#index;
|
|
18
|
+
/** 是否启动 */
|
|
19
|
+
#start;
|
|
21
20
|
constructor() {
|
|
22
21
|
super();
|
|
23
|
-
this
|
|
22
|
+
this.#index = 0;
|
|
24
23
|
this.name = 'Karin';
|
|
25
24
|
this.list = [];
|
|
26
25
|
this.adapter = [];
|
|
27
26
|
this.on('error', data => logger.error(data));
|
|
28
|
-
this.on('
|
|
29
|
-
this.on('adapter', data =>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
this.on('request', data => new RequestHandler(data));
|
|
27
|
+
this.on('adapter', data => this.addAdapter(data));
|
|
28
|
+
this.on('adapter.message', data => new MessageHandler(data));
|
|
29
|
+
this.on('adapter.notice', data => new NoticeHandler(data));
|
|
30
|
+
this.on('adapter.request', data => new RequestHandler(data));
|
|
31
|
+
this.#start = false;
|
|
32
|
+
}
|
|
33
|
+
on(event, listener) {
|
|
34
|
+
return super.on(event, listener);
|
|
35
|
+
}
|
|
36
|
+
emit(event, ...args) {
|
|
37
|
+
return super.emit(event, ...args);
|
|
40
38
|
}
|
|
41
39
|
/**
|
|
42
40
|
* 注册Bot 返回索引id
|
|
43
41
|
*/
|
|
44
42
|
addBot(data) {
|
|
45
|
-
this
|
|
46
|
-
const index = this
|
|
43
|
+
this.#index++;
|
|
44
|
+
const index = this.#index;
|
|
47
45
|
if (!data.bot) {
|
|
48
46
|
logger.error('[Bot管理][注册] 注册失败: Bot实例不能为空', JSON.stringify(data));
|
|
49
47
|
return false;
|
|
@@ -55,8 +53,8 @@ export class Listeners extends EventEmitter {
|
|
|
55
53
|
return index;
|
|
56
54
|
}
|
|
57
55
|
/**
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
* 发送上线通知
|
|
57
|
+
*/
|
|
60
58
|
async #online(uid) {
|
|
61
59
|
/** 重启 */
|
|
62
60
|
const key = `karin:restart:${uid}`;
|
|
@@ -140,6 +138,11 @@ export class Listeners extends EventEmitter {
|
|
|
140
138
|
* @param data.path - 适配器路径
|
|
141
139
|
*/
|
|
142
140
|
addAdapter(data) {
|
|
141
|
+
let path = data.path || '无';
|
|
142
|
+
if (path && data.type !== 'grpc')
|
|
143
|
+
path = `ws://127.0.0.1:${config.Server.http.port}${data.path}`;
|
|
144
|
+
path = logger.green(path);
|
|
145
|
+
logger.info(`[适配器][注册][${data.type}]: ` + path);
|
|
143
146
|
const adapter = { type: data.type, adapter: data.adapter, path: '' };
|
|
144
147
|
if (data.path)
|
|
145
148
|
adapter.path = data.path;
|
|
@@ -230,5 +233,3 @@ export class Listeners extends EventEmitter {
|
|
|
230
233
|
return result;
|
|
231
234
|
}
|
|
232
235
|
}
|
|
233
|
-
export const listener = new Listeners();
|
|
234
|
-
export const Bot = listener;
|
|
@@ -3,8 +3,8 @@ import path from 'path';
|
|
|
3
3
|
import lodash from 'lodash';
|
|
4
4
|
import chokidar from 'chokidar';
|
|
5
5
|
import schedule from 'node-schedule';
|
|
6
|
-
import { listener } from '../listener/listener.js';
|
|
7
6
|
import { render } from '../../render/index.js';
|
|
7
|
+
import { karin } from '../karin/karin.js';
|
|
8
8
|
import { common, logger } from '../../utils/index.js';
|
|
9
9
|
class PluginLoader {
|
|
10
10
|
dir;
|
|
@@ -67,7 +67,7 @@ class PluginLoader {
|
|
|
67
67
|
* 插件初始化
|
|
68
68
|
*/
|
|
69
69
|
async load() {
|
|
70
|
-
|
|
70
|
+
karin.once('plugin.watch', () => {
|
|
71
71
|
this.watchList.forEach(async ({ plugin, path }) => {
|
|
72
72
|
await this.watchDir(plugin, path);
|
|
73
73
|
logger.debug(`[热更新][${plugin}][${path}] 监听中...`);
|
|
@@ -84,7 +84,7 @@ class PluginLoader {
|
|
|
84
84
|
this.printDependErr();
|
|
85
85
|
/** 优先级排序并打印插件信息 */
|
|
86
86
|
this.orderBy(true);
|
|
87
|
-
|
|
87
|
+
karin.emit('plugin.watch');
|
|
88
88
|
return this;
|
|
89
89
|
}
|
|
90
90
|
/**
|
|
@@ -290,7 +290,7 @@ class PluginLoader {
|
|
|
290
290
|
});
|
|
291
291
|
if (!isPrint)
|
|
292
292
|
return;
|
|
293
|
-
logger.info(`[插件][${
|
|
293
|
+
logger.info(`[插件][${this.plugin.size}个] 加载完成`);
|
|
294
294
|
logger.info(`[渲染器][${render.Apps.length}个] 加载完成`);
|
|
295
295
|
logger.info(`[command][${this.command.length}个] 加载完成`);
|
|
296
296
|
logger.info(`[button][${this.button.length}个] 加载完成`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { karin } from '../karin/karin.js';
|
|
2
2
|
import { logger, common, config } from '../../utils/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* 处理基本事件
|
|
@@ -35,15 +35,15 @@ export default class Process {
|
|
|
35
35
|
/**
|
|
36
36
|
* 捕获警告
|
|
37
37
|
*/
|
|
38
|
-
process.on('warning', warning =>
|
|
38
|
+
process.on('warning', warning => karin.emit('warn', warning));
|
|
39
39
|
/**
|
|
40
40
|
* 捕获错误
|
|
41
41
|
*/
|
|
42
|
-
process.on('uncaughtException', error =>
|
|
42
|
+
process.on('uncaughtException', error => karin.emit('error', error));
|
|
43
43
|
/**
|
|
44
44
|
* 捕获未处理的Promise错误
|
|
45
45
|
*/
|
|
46
|
-
process.on('unhandledRejection', error =>
|
|
46
|
+
process.on('unhandledRejection', error => karin.emit('error', error));
|
|
47
47
|
return this;
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
@@ -2,7 +2,7 @@ import fs from 'fs';
|
|
|
2
2
|
import Process from '../process/process.js';
|
|
3
3
|
import { WebSocketServer } from 'ws';
|
|
4
4
|
import { createServer } from 'http';
|
|
5
|
-
import {
|
|
5
|
+
import { karin } from '../karin/karin.js';
|
|
6
6
|
import express from 'express';
|
|
7
7
|
import { exec, config, logger, common } from '../../utils/index.js';
|
|
8
8
|
import { AdapterOneBot11 } from '../../adapter/onebot/11/index.js';
|
|
@@ -34,7 +34,7 @@ export const server = new (class Server {
|
|
|
34
34
|
const headers = request.headers;
|
|
35
35
|
logger.debug('[反向WS]', path, JSON.stringify(headers, null, 2));
|
|
36
36
|
try {
|
|
37
|
-
const Adapter =
|
|
37
|
+
const Adapter = karin.getAdapter(path);
|
|
38
38
|
if (!Adapter) {
|
|
39
39
|
logger.error(`[反向WS] 适配器不存在:${path}`);
|
|
40
40
|
return socket.close();
|
|
@@ -73,7 +73,7 @@ export const server = new (class Server {
|
|
|
73
73
|
if (req.hostname === 'localhost' || req.hostname === '127.0.0.1') {
|
|
74
74
|
logger.mark('[服务器][HTTP] 收到退出请求,即将退出');
|
|
75
75
|
/** 关闭服务器 */
|
|
76
|
-
|
|
76
|
+
karin.emit('exit.grpc');
|
|
77
77
|
this.server.close();
|
|
78
78
|
/** 如果是pm2 获取当前pm2ID 使用 */
|
|
79
79
|
if (process.env.pm_id)
|
|
@@ -113,7 +113,7 @@ export const server = new (class Server {
|
|
|
113
113
|
this.server.listen(port, host, () => {
|
|
114
114
|
logger.mark('[服务器][启动成功][HTTP]: ' + logger.green(`http://${host}:${port}`));
|
|
115
115
|
});
|
|
116
|
-
|
|
116
|
+
karin.once('restart.http', () => {
|
|
117
117
|
logger.mark('[服务器][重启][HTTP] 正在重启HTTP服务器...');
|
|
118
118
|
this.#restartServer();
|
|
119
119
|
});
|
|
@@ -2,7 +2,7 @@ import lodash from 'lodash';
|
|
|
2
2
|
import { review } from './review.js';
|
|
3
3
|
import { EventBaseHandler } from './base.js';
|
|
4
4
|
import { logger, config } from '../../utils/index.js';
|
|
5
|
-
import {
|
|
5
|
+
import { karin, stateArr, pluginLoader } from '../../core/index.js';
|
|
6
6
|
/**
|
|
7
7
|
* 消息事件
|
|
8
8
|
*/
|
|
@@ -12,7 +12,6 @@ export class MessageHandler extends EventBaseHandler {
|
|
|
12
12
|
super(e);
|
|
13
13
|
this.e = e;
|
|
14
14
|
this.init();
|
|
15
|
-
// todo: emit event
|
|
16
15
|
if (this.e.group_id) {
|
|
17
16
|
if (!this.getCd())
|
|
18
17
|
return;
|
|
@@ -34,7 +33,7 @@ export class MessageHandler extends EventBaseHandler {
|
|
|
34
33
|
* 先对消息事件进行初始化
|
|
35
34
|
*/
|
|
36
35
|
init() {
|
|
37
|
-
|
|
36
|
+
karin.emit('karin:count:recv', 1);
|
|
38
37
|
const logs = [];
|
|
39
38
|
for (const val of this.e.elements) {
|
|
40
39
|
switch (val.type) {
|
|
@@ -176,6 +175,7 @@ export class MessageHandler extends EventBaseHandler {
|
|
|
176
175
|
}
|
|
177
176
|
logs.length = 0;
|
|
178
177
|
this.reply();
|
|
178
|
+
karin.emit('message', this.e);
|
|
179
179
|
}
|
|
180
180
|
/**
|
|
181
181
|
* 响应模式检查 返回false表示未通过
|
|
@@ -242,7 +242,7 @@ export class MessageHandler extends EventBaseHandler {
|
|
|
242
242
|
continue;
|
|
243
243
|
/** 计算插件处理时间 */
|
|
244
244
|
const start = Date.now();
|
|
245
|
-
|
|
245
|
+
karin.emit('karin:count:fnc', this.e.logFnc);
|
|
246
246
|
try {
|
|
247
247
|
let res;
|
|
248
248
|
if (info.type === 'function') {
|
|
@@ -276,7 +276,7 @@ export class MessageHandler extends EventBaseHandler {
|
|
|
276
276
|
if (App) {
|
|
277
277
|
switch (App.type) {
|
|
278
278
|
case 'ctx': {
|
|
279
|
-
|
|
279
|
+
karin.emit(`ctx:${key}`, this.e);
|
|
280
280
|
delete stateArr[key];
|
|
281
281
|
return true;
|
|
282
282
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { review } from './review.js';
|
|
2
2
|
import { EventBaseHandler } from './base.js';
|
|
3
|
-
import { pluginLoader } from '../../core/index.js';
|
|
4
3
|
import { logger, config } from '../../utils/index.js';
|
|
4
|
+
import { karin, pluginLoader } from '../../core/index.js';
|
|
5
5
|
/**
|
|
6
6
|
* 通知事件
|
|
7
7
|
*/
|
|
@@ -57,6 +57,7 @@ export class NoticeHandler extends EventBaseHandler {
|
|
|
57
57
|
logger.bot('info', this.e.self_id, `未知来源通知事件:${JSON.stringify(this.e)}`);
|
|
58
58
|
}
|
|
59
59
|
this.reply();
|
|
60
|
+
karin.emit('notice', this.e);
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
62
63
|
* 处理事件
|
|
@@ -131,7 +132,7 @@ export class NoticeHandler extends EventBaseHandler {
|
|
|
131
132
|
/** 群成员增加 */
|
|
132
133
|
case "group_member_increase" /* NoticeSubType.GroupMemberIncrease */: {
|
|
133
134
|
const { operator_uid, operator_uin, target_uid, target_uin, type } = this.e.content;
|
|
134
|
-
this.e.raw_message = `[群成员新增]: ${operator_uid || operator_uin} ${type === 'invite' ? '邀请' : '同意'}
|
|
135
|
+
this.e.raw_message = `[群成员新增]: ${operator_uid || operator_uin} ${type === 'invite' ? '邀请' : '同意'} ${target_uid || target_uin} 加入群聊`;
|
|
135
136
|
break;
|
|
136
137
|
}
|
|
137
138
|
/** 群成员减少 */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { review } from './review.js';
|
|
2
2
|
import { EventBaseHandler } from './base.js';
|
|
3
|
-
import { pluginLoader } from '../../core/index.js';
|
|
3
|
+
import { karin, pluginLoader } from '../../core/index.js';
|
|
4
4
|
import { logger, config } from '../../utils/index.js';
|
|
5
5
|
/**
|
|
6
6
|
* 请求事件
|
|
@@ -52,6 +52,7 @@ export class RequestHandler extends EventBaseHandler {
|
|
|
52
52
|
logger.bot('info', this.e.self_id, `未知来源请求事件:${JSON.stringify(this.e)}`);
|
|
53
53
|
}
|
|
54
54
|
this.reply();
|
|
55
|
+
karin.emit('request', this.e);
|
|
55
56
|
}
|
|
56
57
|
/**
|
|
57
58
|
* 处理事件
|
|
@@ -25,31 +25,31 @@ export declare const review: {
|
|
|
25
25
|
/**
|
|
26
26
|
* 群聊黑白名单 允许哪个群触发事件
|
|
27
27
|
*/
|
|
28
|
-
"__#
|
|
28
|
+
"__#1@#GroupEnable"(): true | undefined;
|
|
29
29
|
/**
|
|
30
30
|
* 用户黑白名单 允许那个用户触发事件
|
|
31
31
|
*/
|
|
32
|
-
"__#
|
|
32
|
+
"__#1@#UserEnable"(): true | undefined;
|
|
33
33
|
/**
|
|
34
34
|
* 群聊事件日志 是否打印
|
|
35
35
|
*/
|
|
36
|
-
"__#
|
|
36
|
+
"__#1@#GroupMsgPrint"(): true | undefined;
|
|
37
37
|
/**
|
|
38
38
|
* 黑白名单插件 哪个插件可以被触发
|
|
39
39
|
*/
|
|
40
|
-
"__#
|
|
40
|
+
"__#1@#PluginEnable"(): boolean;
|
|
41
41
|
/** 群聊cd */
|
|
42
|
-
"__#
|
|
42
|
+
"__#1@#CD"(): true | undefined;
|
|
43
43
|
/**
|
|
44
44
|
* 响应模式
|
|
45
45
|
*/
|
|
46
|
-
"__#
|
|
46
|
+
"__#1@#mode"(): true | undefined;
|
|
47
47
|
/**
|
|
48
48
|
* 前缀、别名
|
|
49
49
|
*/
|
|
50
|
-
"__#
|
|
50
|
+
"__#1@#alias"(): true | undefined;
|
|
51
51
|
/**
|
|
52
52
|
* 私聊功能
|
|
53
53
|
*/
|
|
54
|
-
"__#
|
|
54
|
+
"__#1@#Private"(): true | undefined;
|
|
55
55
|
};
|
|
@@ -85,6 +85,15 @@ declare class Common {
|
|
|
85
85
|
* - 写入yaml文件
|
|
86
86
|
*/
|
|
87
87
|
writeYaml(file: string, data: any): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* 传入插件名称 返回解析后的package.json的内容
|
|
90
|
+
* @param name - 插件名称
|
|
91
|
+
*/
|
|
92
|
+
pkgJson(name: string): {
|
|
93
|
+
name: string;
|
|
94
|
+
version: string;
|
|
95
|
+
[key: string]: any;
|
|
96
|
+
} | null;
|
|
88
97
|
/**
|
|
89
98
|
* 输入包名 返回包根目录的绝对路径 仅简单查找
|
|
90
99
|
* @param name - 包名
|
|
@@ -191,6 +191,24 @@ class Common {
|
|
|
191
191
|
return false;
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* 传入插件名称 返回解析后的package.json的内容
|
|
196
|
+
* @param name - 插件名称
|
|
197
|
+
*/
|
|
198
|
+
pkgJson(name) {
|
|
199
|
+
try {
|
|
200
|
+
/** 先查git插件 */
|
|
201
|
+
const gitPath = `./plugins/${name}`;
|
|
202
|
+
if (fs.existsSync(gitPath))
|
|
203
|
+
return this.readJson(`${gitPath}/package.json`);
|
|
204
|
+
/** 查npm插件 */
|
|
205
|
+
const require = createRequire(import.meta.url);
|
|
206
|
+
return require(`${name}/package.json`);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
194
212
|
/**
|
|
195
213
|
* 输入包名 返回包根目录的绝对路径 仅简单查找
|
|
196
214
|
* @param name - 包名
|
|
@@ -95,7 +95,7 @@ export declare const config: {
|
|
|
95
95
|
changeApp(): Promise<void>;
|
|
96
96
|
changeCfg(): Promise<void>;
|
|
97
97
|
changeGroup(): Promise<void>;
|
|
98
|
-
"__#
|
|
98
|
+
"__#2@#review"(): Promise<void>;
|
|
99
99
|
};
|
|
100
100
|
export declare const Cfg: {
|
|
101
101
|
/**
|
|
@@ -189,5 +189,5 @@ export declare const Cfg: {
|
|
|
189
189
|
changeApp(): Promise<void>;
|
|
190
190
|
changeCfg(): Promise<void>;
|
|
191
191
|
changeGroup(): Promise<void>;
|
|
192
|
-
"__#
|
|
192
|
+
"__#2@#review"(): Promise<void>;
|
|
193
193
|
};
|
|
@@ -2,7 +2,7 @@ import fs from 'fs';
|
|
|
2
2
|
import Yaml from 'yaml';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import chokidar from 'chokidar';
|
|
5
|
-
import { karinDir } from '../../core/
|
|
5
|
+
import { karinDir } from '../../core/init/dir.js';
|
|
6
6
|
import { common } from '../../utils/common/common.js';
|
|
7
7
|
/**
|
|
8
8
|
* 配置文件
|