node-karin 0.3.8 → 0.4.1
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/onebot/onebot11.d.ts +3 -5
- package/lib/adapter/onebot/onebot11.js +4 -1
- package/lib/core/karin.d.ts +45 -4
- package/lib/core/karin.js +52 -1
- package/lib/core/listener.d.ts +2 -2
- package/lib/core/listener.js +1 -0
- package/lib/core/plugin.app.d.ts +4 -1
- package/lib/core/plugin.app.js +3 -3
- package/lib/core/plugin.d.ts +8 -2
- package/lib/core/plugin.loader.d.ts +11 -4
- package/lib/core/plugin.loader.js +49 -12
- package/lib/db/index.d.ts +2 -4
- package/lib/db/index.js +2 -4
- package/lib/db/level.d.ts +1 -0
- package/lib/db/level.js +1 -0
- package/lib/db/redis.d.ts +2 -41
- package/lib/db/redis.js +2 -3
- package/lib/event/event.d.ts +7 -3
- package/lib/event/event.handler.d.ts +7 -6
- package/lib/event/event.handler.js +5 -0
- package/lib/event/event.js +5 -0
- package/lib/event/index.js +2 -2
- package/lib/event/message.handler.d.ts +3 -3
- package/lib/event/message.handler.js +8 -11
- package/lib/event/notice.d.ts +4 -4
- package/lib/event/notice.handler.d.ts +17 -0
- package/lib/event/notice.handler.js +203 -0
- package/lib/event/request.d.ts +4 -4
- package/lib/event/request.handler.d.ts +17 -0
- package/lib/event/request.handler.js +109 -0
- package/lib/event/request.js +1 -0
- package/lib/event/review.handler.js +12 -24
- package/lib/index.d.ts +5 -66
- package/lib/index.js +0 -1
- package/lib/render/client.d.ts +0 -1
- package/lib/render/server.d.ts +0 -2
- package/lib/types/adapter.d.ts +2 -3
- package/lib/types/api.d.ts +295 -0
- package/lib/types/api.js +1 -0
- package/lib/types/event.d.ts +127 -241
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.js +1 -0
- package/lib/types/plugin.d.ts +4 -5
- package/lib/utils/button.d.ts +2 -2
- package/lib/utils/common.d.ts +1 -2
- package/lib/utils/config.d.ts +3 -4
- package/lib/utils/config.js +17 -3
- package/lib/utils/exec.d.ts +3 -3
- package/lib/utils/ffmpeg.d.ts +3 -3
- package/lib/utils/handler.d.ts +6 -13
- package/lib/utils/handler.js +3 -1
- package/lib/utils/segment.d.ts +6 -6
- package/package.json +16 -17
- package/lib/utils/kritor-proto.d.ts +0 -1
|
@@ -56,19 +56,18 @@ export class MessageHandler extends EventHandler {
|
|
|
56
56
|
this.GroupMsgPrint && typeof v.log === 'function' && v.log(this.e.self_id, `${logFnc}${this.e.logText} ${lodash.truncate(this.e.msg, { length: 80 })}`)
|
|
57
57
|
/** 判断权限 */
|
|
58
58
|
if (!this.filterPermission(v.permission)) { break a }
|
|
59
|
+
/** 计算插件处理时间 */
|
|
60
|
+
const start = Date.now()
|
|
61
|
+
listener.emit('karin:count:fnc', this.e.logFnc)
|
|
59
62
|
try {
|
|
60
63
|
let res
|
|
61
64
|
if (app.file.type === 'function' && typeof v.fnc === 'function') {
|
|
62
|
-
res = v.fnc(this.e)
|
|
65
|
+
res = await v.fnc(this.e)
|
|
63
66
|
} else {
|
|
64
67
|
const cla = new app.file.Fnc()
|
|
65
68
|
cla.e = this.e
|
|
66
|
-
res = cla[v.fnc](this.e)
|
|
69
|
+
res = await cla[v.fnc](this.e)
|
|
67
70
|
}
|
|
68
|
-
/** 计算插件处理时间 */
|
|
69
|
-
const start = Date.now()
|
|
70
|
-
listener.emit('karin:count:fnc', this.e.logFnc)
|
|
71
|
-
res = await res
|
|
72
71
|
this.GroupMsgPrint && typeof v.log === 'function' && v.log(this.e.self_id, `${logFnc} ${lodash.truncate(this.e.msg, { length: 80 })} 处理完成 ${logger.green(Date.now() - start + 'ms')}`)
|
|
73
72
|
if (res !== false) { break a }
|
|
74
73
|
} catch (error) {
|
|
@@ -191,16 +190,14 @@ export class MessageHandler extends EventHandler {
|
|
|
191
190
|
this.e.raw_message = logs.join('')
|
|
192
191
|
/** 前缀处理 */
|
|
193
192
|
this.e.group_id && 'GroupCD' in this.config && review.alias(this.e, this.config)
|
|
194
|
-
/** 主人
|
|
195
|
-
|
|
196
|
-
if (config.master.includes(masterId)) {
|
|
193
|
+
/** 主人 */
|
|
194
|
+
if (config.master.includes(String(this.e.user_id))) {
|
|
197
195
|
this.e.isMaster = true
|
|
198
196
|
this.e.isAdmin = true
|
|
199
|
-
} else if (config.admin.includes(
|
|
197
|
+
} else if (config.admin.includes(String(this.e.user_id))) {
|
|
200
198
|
/** 管理员 */
|
|
201
199
|
this.e.isAdmin = true
|
|
202
200
|
}
|
|
203
|
-
this.GroupMsgPrint = false
|
|
204
201
|
if (this.e.contact.scene === 'private') {
|
|
205
202
|
this.e.isPrivate = true
|
|
206
203
|
this.e.logText = `[Private:${this.e.sender.nick || ''}(${this.e.user_id})]`
|
package/lib/event/notice.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { KarinEvent } from './event.js';
|
|
2
|
-
import { contact, Sender,
|
|
2
|
+
import { contact, Sender, NoticeType, EventToSubEvent } from '../types/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* - 通知事件基类
|
|
5
5
|
*/
|
|
@@ -32,11 +32,11 @@ export declare class KarinNotice extends KarinEvent {
|
|
|
32
32
|
/**
|
|
33
33
|
* 事件子类型
|
|
34
34
|
*/
|
|
35
|
-
sub_event:
|
|
35
|
+
sub_event: EventToSubEvent['notice'];
|
|
36
36
|
/**
|
|
37
37
|
* 事件对应的内容参数
|
|
38
38
|
*/
|
|
39
|
-
content:
|
|
39
|
+
content: NoticeType[EventToSubEvent['notice']];
|
|
40
40
|
/**
|
|
41
41
|
* 群ID
|
|
42
42
|
*/
|
|
@@ -45,5 +45,5 @@ export declare class KarinNotice extends KarinEvent {
|
|
|
45
45
|
/**
|
|
46
46
|
* - 事件对应的内容参数
|
|
47
47
|
*/
|
|
48
|
-
content:
|
|
48
|
+
content: NoticeType[EventToSubEvent['notice']];
|
|
49
49
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import EventHandler from './event.handler.js';
|
|
2
|
+
import { KarinNoticeEvent } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* 通知事件
|
|
5
|
+
*/
|
|
6
|
+
export default class NoticeHandler extends EventHandler {
|
|
7
|
+
e: KarinNoticeEvent;
|
|
8
|
+
constructor(e: KarinNoticeEvent);
|
|
9
|
+
/**
|
|
10
|
+
* 处理事件
|
|
11
|
+
*/
|
|
12
|
+
deal(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* 构建原始消息
|
|
15
|
+
*/
|
|
16
|
+
raw_message(): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { review } from './review.handler.js'
|
|
2
|
+
import EventHandler from './event.handler.js'
|
|
3
|
+
import { logger, config } from '../utils/index.js'
|
|
4
|
+
import { pluginLoader } from '../core/index.js'
|
|
5
|
+
/**
|
|
6
|
+
* 通知事件
|
|
7
|
+
*/
|
|
8
|
+
export default class NoticeHandler extends EventHandler {
|
|
9
|
+
e
|
|
10
|
+
constructor (e) {
|
|
11
|
+
super(e)
|
|
12
|
+
this.e = e
|
|
13
|
+
/** 事件处理 */
|
|
14
|
+
if (this.review()) { return }
|
|
15
|
+
/** 处理回复 */
|
|
16
|
+
this.reply()
|
|
17
|
+
/** raw */
|
|
18
|
+
this.raw_message()
|
|
19
|
+
/** 处理消息 */
|
|
20
|
+
this.deal()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 处理事件
|
|
25
|
+
*/
|
|
26
|
+
async deal () {
|
|
27
|
+
/** 主人 */
|
|
28
|
+
if (config.master.includes(String(this.e.user_id))) {
|
|
29
|
+
this.e.isMaster = true
|
|
30
|
+
this.e.isAdmin = true
|
|
31
|
+
} else if (config.admin.includes(String(this.e.user_id))) {
|
|
32
|
+
/** 管理员 */
|
|
33
|
+
this.e.isAdmin = true
|
|
34
|
+
}
|
|
35
|
+
if (this.e.contact.scene === 'private') {
|
|
36
|
+
this.e.isPrivate = true
|
|
37
|
+
this.e.logText = `[Private:${this.e.sender.nick || ''}(${this.e.user_id})]`
|
|
38
|
+
logger.bot('info', this.e.self_id, `${logger.green('私聊通知: ')}[${this.e.user_id}(${this.e.sender.nick || ''})] ${this.e.raw_message}`)
|
|
39
|
+
} else if (this.e.contact.scene === 'group') {
|
|
40
|
+
this.e.isGroup = true
|
|
41
|
+
this.e.logText = `[Group:${this.e.group_id}-${this.e.user_id}(${this.e.sender.nick || ''})]`
|
|
42
|
+
this.GroupMsgPrint = review.GroupMsgPrint(this.e)
|
|
43
|
+
this.GroupMsgPrint && logger.bot('info', this.e.self_id, `${logger.green('群通知: ')}[${this.e.group_id}-${this.e.user_id}(${this.e.sender.nick || ''})] ${this.e.raw_message}`)
|
|
44
|
+
} else {
|
|
45
|
+
logger.bot('info', this.e.self_id, `未知来源通知事件:${JSON.stringify(this.e)}`)
|
|
46
|
+
}
|
|
47
|
+
/* eslint-disable no-labels */
|
|
48
|
+
a: for (const index of pluginLoader.acceptIds) {
|
|
49
|
+
const app = pluginLoader.PluginList[index]
|
|
50
|
+
/** 判断事件 */
|
|
51
|
+
if (!this.filtEvent(app.event)) { continue }
|
|
52
|
+
/** 检查黑白名单插件 */
|
|
53
|
+
if ('GroupCD' in this.config && !review.PluginEnable(app, this.config)) { continue }
|
|
54
|
+
/** 日志方法字符串 */
|
|
55
|
+
this.e.logFnc = `[${app.file.dir}][${app.name}][accept]`
|
|
56
|
+
const logFnc = logger.fnc(`[${app.name}][accept]`)
|
|
57
|
+
/** 计算插件处理时间 */
|
|
58
|
+
const start = Date.now()
|
|
59
|
+
let res
|
|
60
|
+
try {
|
|
61
|
+
if (typeof app.accept === 'function') {
|
|
62
|
+
res = await app.accept(this.e)
|
|
63
|
+
} else {
|
|
64
|
+
const cla = new app.file.Fnc()
|
|
65
|
+
if (!cla.accept || typeof cla.accept !== 'function') { continue }
|
|
66
|
+
(cla.e) = this.e
|
|
67
|
+
res = await cla.accept(this.e)
|
|
68
|
+
}
|
|
69
|
+
if (res !== false) {
|
|
70
|
+
this.GroupMsgPrint && logger.bot('info', this.e.self_id, `${logFnc} 处理完成 ${logger.green(Date.now() - start + 'ms')}`)
|
|
71
|
+
break a
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
logger.error(`${logFnc}`)
|
|
75
|
+
logger.error(error.stack || error.message || JSON.stringify(error))
|
|
76
|
+
break a
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 构建原始消息
|
|
83
|
+
*/
|
|
84
|
+
raw_message () {
|
|
85
|
+
switch (this.e.sub_event) {
|
|
86
|
+
/** 好友头像戳一戳 */
|
|
87
|
+
case 'friend_poke': {
|
|
88
|
+
this.e.raw_message = '[好友戳一戳]: 戳了你一下'
|
|
89
|
+
break
|
|
90
|
+
}
|
|
91
|
+
/** 好友消息撤回 */
|
|
92
|
+
case 'friend_recall': {
|
|
93
|
+
this.e.raw_message = `[好友消息撤回]: ${this.e.content.message_id}`
|
|
94
|
+
break
|
|
95
|
+
}
|
|
96
|
+
/** 私聊文件上传 */
|
|
97
|
+
case 'friend_file_uploaded': {
|
|
98
|
+
const content = this.e.content
|
|
99
|
+
const { url } = content
|
|
100
|
+
this.e.raw_message = `[私聊文件上传]: ${url}`
|
|
101
|
+
break
|
|
102
|
+
}
|
|
103
|
+
/** 群头像戳一戳 */
|
|
104
|
+
case 'group_poke': {
|
|
105
|
+
const { operator_uid, operator_uin, target_uid, target_uin } = this.e.content
|
|
106
|
+
this.e.raw_message = `[群戳一戳]: ${operator_uid || operator_uin} 戳了戳 ${target_uid || target_uin}`
|
|
107
|
+
break
|
|
108
|
+
}
|
|
109
|
+
/** 群消息撤回 */
|
|
110
|
+
case 'group_recall': {
|
|
111
|
+
const { operator_uid, operator_uin, message_id } = this.e.content
|
|
112
|
+
this.e.raw_message = `[群消息撤回]: ${operator_uid || operator_uin} 撤回了一条消息 ${message_id}`
|
|
113
|
+
break
|
|
114
|
+
}
|
|
115
|
+
/** 群文件上传 */
|
|
116
|
+
case 'group_file_uploaded': {
|
|
117
|
+
const { url, operator_uid, operator_uin } = this.e.content
|
|
118
|
+
this.e.raw_message = `[群文件上传]: ${operator_uid || operator_uin} 上传了 ${url}`
|
|
119
|
+
break
|
|
120
|
+
}
|
|
121
|
+
/** 群成员增加 */
|
|
122
|
+
case 'group_member_increase': {
|
|
123
|
+
const { operator_uid, operator_uin, target_uid, target_uin, type } = this.e.content
|
|
124
|
+
this.e.raw_message = `[群成员新增]: ${operator_uid || operator_uin} ${type === 'invite' ? '邀请' : '同意'} ${target_uid || target_uin} 加入群聊`
|
|
125
|
+
break
|
|
126
|
+
}
|
|
127
|
+
/** 群成员减少 */
|
|
128
|
+
case 'group_member_decrease': {
|
|
129
|
+
switch (this.e.content.type) {
|
|
130
|
+
case 'leave': {
|
|
131
|
+
const { target_uid, target_uin } = this.e.content
|
|
132
|
+
this.e.raw_message = `[群成员减少]: ${target_uid || target_uin} 主动退出群聊`
|
|
133
|
+
break
|
|
134
|
+
}
|
|
135
|
+
// 群成员被踢
|
|
136
|
+
case 'kick': {
|
|
137
|
+
const { operator_uid, operator_uin, target_uid, target_uin } = this.e.content
|
|
138
|
+
this.e.raw_message = `[群成员减少]: ${operator_uid || operator_uin} 将 ${target_uid || target_uin} 踢出群聊`
|
|
139
|
+
break
|
|
140
|
+
}
|
|
141
|
+
// bot被踢
|
|
142
|
+
case 'kick_me': {
|
|
143
|
+
const { operator_uid, operator_uin } = this.e.content
|
|
144
|
+
this.e.raw_message = `[群成员减少]: 机器人被移除群聊,操作人:${operator_uid || operator_uin}`
|
|
145
|
+
break
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
break
|
|
149
|
+
}
|
|
150
|
+
/** 群管理员变动 */
|
|
151
|
+
case 'group_admin_changed': {
|
|
152
|
+
const { target_uid, target_uin, is_admin } = this.e.content
|
|
153
|
+
this.e.raw_message = `[群管理员变动]: ${target_uid || target_uin} 被${is_admin ? '设置' : '取消'}群管理员`
|
|
154
|
+
break
|
|
155
|
+
}
|
|
156
|
+
/** 群成员被禁言 */
|
|
157
|
+
case 'group_member_ban': {
|
|
158
|
+
const { operator_uid, operator_uin, target_uid, target_uin, type } = this.e.content
|
|
159
|
+
this.e.raw_message = `[群成员禁言]: ${operator_uid || operator_uin} ${type === 'ban' ? '禁言' : '解禁'}了 ${target_uid || target_uin}`
|
|
160
|
+
break
|
|
161
|
+
}
|
|
162
|
+
/** 群签到 */
|
|
163
|
+
case 'group_sign': {
|
|
164
|
+
const { target_uid, target_uin } = this.e.content
|
|
165
|
+
this.e.raw_message = `[群签到]: ${target_uid || target_uin}`
|
|
166
|
+
break
|
|
167
|
+
}
|
|
168
|
+
/** 群全员禁言 */
|
|
169
|
+
case 'group_whole_ban': {
|
|
170
|
+
const { operator_uid, operator_uin, is_ban } = this.e.content
|
|
171
|
+
this.e.raw_message = `[群全员禁言]: ${operator_uid || operator_uin} ${is_ban ? '开启全员禁言' : '解除全员禁言'}`
|
|
172
|
+
break
|
|
173
|
+
}
|
|
174
|
+
/** 群名片改变 */
|
|
175
|
+
case 'group_card_changed': {
|
|
176
|
+
const { operator_uid, operator_uin, target_uid, target_uin, new_card } = this.e.content
|
|
177
|
+
this.e.raw_message = `[群名片改变]: ${operator_uid || operator_uin} 修改了 ${target_uid || target_uin} 的名片为 ${new_card}`
|
|
178
|
+
break
|
|
179
|
+
}
|
|
180
|
+
/** 群成员专属头衔改变 */
|
|
181
|
+
case 'group_member_unique_title_changed': {
|
|
182
|
+
const { target_uid, target_uin, title } = this.e.content
|
|
183
|
+
this.e.raw_message = `[群头衔更改]: ${target_uid || target_uin} 的专属头衔改变为 ${title}`
|
|
184
|
+
break
|
|
185
|
+
}
|
|
186
|
+
/** 群精华消息改变 */
|
|
187
|
+
case 'group_essence_changed': {
|
|
188
|
+
const { operator_uid, operator_uin, target_uid, target_uin, message_id, is_set } = this.e.content
|
|
189
|
+
this.e.raw_message = `[群精华消息]: ${operator_uid || operator_uin} ${is_set ? `将${target_uid || target_uin}的消息${message_id}设置为精华消息` : `取消了${target_uid || target_uin}精华消息 ${message_id}`}`
|
|
190
|
+
break
|
|
191
|
+
}
|
|
192
|
+
/** 群表情回应 */
|
|
193
|
+
case 'group_message_reaction': {
|
|
194
|
+
const { message_id, face_id } = this.e.content
|
|
195
|
+
this.e.raw_message = `[群表情回应]: ${this.e.user_id} 给消息 ${message_id} 回应了一个${face_id}的表情`
|
|
196
|
+
break
|
|
197
|
+
}
|
|
198
|
+
default: {
|
|
199
|
+
this.e.raw_message = `[未知事件]: ${JSON.stringify(this.e)}`
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
package/lib/event/request.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { KarinEvent } from './event.js';
|
|
2
|
-
import { contact, Sender,
|
|
2
|
+
import { contact, Sender, EventToSubEvent, RequestType, KarinRequestEvent } from '../types/index.js';
|
|
3
3
|
/**
|
|
4
4
|
* - 请求事件基类
|
|
5
5
|
*/
|
|
@@ -32,11 +32,11 @@ export declare class KarinRequest extends KarinEvent {
|
|
|
32
32
|
/**
|
|
33
33
|
* 事件子类型
|
|
34
34
|
*/
|
|
35
|
-
sub_event:
|
|
35
|
+
sub_event: EventToSubEvent['request'];
|
|
36
36
|
/**
|
|
37
37
|
* 事件对应的内容参数
|
|
38
38
|
*/
|
|
39
|
-
content:
|
|
39
|
+
content: RequestType[EventToSubEvent['request']];
|
|
40
40
|
/**
|
|
41
41
|
* 群ID
|
|
42
42
|
*/
|
|
@@ -45,5 +45,5 @@ export declare class KarinRequest extends KarinEvent {
|
|
|
45
45
|
/**
|
|
46
46
|
* - 事件对应的内容参数
|
|
47
47
|
*/
|
|
48
|
-
content:
|
|
48
|
+
content: KarinRequestEvent;
|
|
49
49
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import EventHandler from './event.handler.js';
|
|
2
|
+
import { KarinRequestEvent } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* 请求事件
|
|
5
|
+
*/
|
|
6
|
+
export default class RequestHandler extends EventHandler {
|
|
7
|
+
e: KarinRequestEvent;
|
|
8
|
+
constructor(e: KarinRequestEvent);
|
|
9
|
+
/**
|
|
10
|
+
* 处理事件
|
|
11
|
+
*/
|
|
12
|
+
deal(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* 构建原始消息
|
|
15
|
+
*/
|
|
16
|
+
raw_message(): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { review } from './review.handler.js'
|
|
2
|
+
import EventHandler from './event.handler.js'
|
|
3
|
+
import { logger, config } from '../utils/index.js'
|
|
4
|
+
import { pluginLoader } from '../core/index.js'
|
|
5
|
+
/**
|
|
6
|
+
* 请求事件
|
|
7
|
+
*/
|
|
8
|
+
export default class RequestHandler extends EventHandler {
|
|
9
|
+
e
|
|
10
|
+
constructor (e) {
|
|
11
|
+
super(e)
|
|
12
|
+
this.e = e
|
|
13
|
+
/** 事件处理 */
|
|
14
|
+
if (this.review()) { return }
|
|
15
|
+
/** 处理回复 */
|
|
16
|
+
this.reply()
|
|
17
|
+
/** raw */
|
|
18
|
+
this.raw_message()
|
|
19
|
+
/** 处理消息 */
|
|
20
|
+
this.deal()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 处理事件
|
|
25
|
+
*/
|
|
26
|
+
async deal () {
|
|
27
|
+
/** 主人 */
|
|
28
|
+
if (config.master.includes(String(this.e.user_id))) {
|
|
29
|
+
this.e.isMaster = true
|
|
30
|
+
this.e.isAdmin = true
|
|
31
|
+
} else if (config.admin.includes(String(this.e.user_id))) {
|
|
32
|
+
/** 管理员 */
|
|
33
|
+
this.e.isAdmin = true
|
|
34
|
+
}
|
|
35
|
+
if (this.e.contact.scene === 'private') {
|
|
36
|
+
this.e.isPrivate = true
|
|
37
|
+
this.e.logText = `[Private:${this.e.sender.nick || ''}(${this.e.user_id})]`
|
|
38
|
+
logger.bot('info', this.e.self_id, `${logger.green('私聊请求: ')}[${this.e.user_id}(${this.e.sender.nick || ''})] ${this.e.raw_message}`)
|
|
39
|
+
} else if (this.e.contact.scene === 'group') {
|
|
40
|
+
this.e.isGroup = true
|
|
41
|
+
this.e.logText = `[Group:${this.e.group_id}-${this.e.user_id}(${this.e.sender.nick || ''})]`
|
|
42
|
+
this.GroupMsgPrint = review.GroupMsgPrint(this.e)
|
|
43
|
+
this.GroupMsgPrint && logger.bot('info', this.e.self_id, `${logger.green('群请求: ')}[${this.e.group_id}-${this.e.user_id}(${this.e.sender.nick || ''})] ${this.e.raw_message}`)
|
|
44
|
+
} else {
|
|
45
|
+
logger.bot('info', this.e.self_id, `未知来源请求事件:${JSON.stringify(this.e)}`)
|
|
46
|
+
}
|
|
47
|
+
/* eslint-disable no-labels */
|
|
48
|
+
a: for (const index of pluginLoader.acceptIds) {
|
|
49
|
+
const app = pluginLoader.PluginList[index]
|
|
50
|
+
/** 判断事件 */
|
|
51
|
+
if (!this.filtEvent(app.event)) { continue }
|
|
52
|
+
/** 检查黑白名单插件 */
|
|
53
|
+
if ('GroupCD' in this.config && !review.PluginEnable(app, this.config)) { continue }
|
|
54
|
+
/** 日志方法字符串 */
|
|
55
|
+
this.e.logFnc = `[${app.file.dir}][${app.name}][accept]`
|
|
56
|
+
const logFnc = logger.fnc(`[${app.name}][accept]`)
|
|
57
|
+
/** 计算插件处理时间 */
|
|
58
|
+
const start = Date.now()
|
|
59
|
+
let res
|
|
60
|
+
try {
|
|
61
|
+
if (typeof app.accept === 'function') {
|
|
62
|
+
res = await app.accept(this.e)
|
|
63
|
+
} else {
|
|
64
|
+
const cla = new app.file.Fnc()
|
|
65
|
+
if (!cla.accept || typeof cla.accept !== 'function') { continue }
|
|
66
|
+
(cla.e) = this.e
|
|
67
|
+
res = await cla.accept(this.e)
|
|
68
|
+
}
|
|
69
|
+
if (res !== false) {
|
|
70
|
+
this.GroupMsgPrint && logger.bot('info', this.e.self_id, `${logFnc} 处理完成 ${logger.green(Date.now() - start + 'ms')}`)
|
|
71
|
+
break a
|
|
72
|
+
}
|
|
73
|
+
} catch (error) {
|
|
74
|
+
logger.error(`${logFnc}`)
|
|
75
|
+
logger.error(error.stack || error.message || JSON.stringify(error))
|
|
76
|
+
break a
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 构建原始消息
|
|
83
|
+
*/
|
|
84
|
+
raw_message () {
|
|
85
|
+
switch (this.e.sub_event) {
|
|
86
|
+
/** 好友申请 */
|
|
87
|
+
case 'friend_apply': {
|
|
88
|
+
const { applier_uid, applier_uin, message } = this.e.content
|
|
89
|
+
this.e.raw_message = `[好友申请]: ${applier_uid || applier_uin} 申请理由: ${message}`
|
|
90
|
+
break
|
|
91
|
+
}
|
|
92
|
+
/** 群申请 */
|
|
93
|
+
case 'group_apply': {
|
|
94
|
+
const { group_id, applier_uid, applier_uin, inviter_uid, inviter_uin, reason } = this.e.content
|
|
95
|
+
this.e.raw_message = `[群申请]: ${group_id} 申请人: ${applier_uid || applier_uin} 邀请人: ${inviter_uid || inviter_uin} 理由: ${reason}`
|
|
96
|
+
break
|
|
97
|
+
}
|
|
98
|
+
/** 邀请入群 */
|
|
99
|
+
case 'invited_group': {
|
|
100
|
+
const { group_id, inviter_uid, inviter_uin } = this.e.content
|
|
101
|
+
this.e.raw_message = `[邀请入群]: ${group_id} 邀请人: ${inviter_uid || inviter_uin}`
|
|
102
|
+
break
|
|
103
|
+
}
|
|
104
|
+
default: {
|
|
105
|
+
this.e.raw_message = `[未知事件]: ${JSON.stringify(this.e)}`
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
package/lib/event/request.js
CHANGED
|
@@ -5,6 +5,7 @@ import { KarinEvent } from './event.js'
|
|
|
5
5
|
export class KarinRequest extends KarinEvent {
|
|
6
6
|
constructor ({ self_id, event_id, user_id, time, contact, sender, sub_event, content, group_id = '' }) {
|
|
7
7
|
super({ event: 'request', event_id, self_id, user_id, group_id, time, contact, sender, sub_event })
|
|
8
|
+
// ...
|
|
8
9
|
this.content = content
|
|
9
10
|
}
|
|
10
11
|
|
|
@@ -62,13 +62,11 @@ export const review = new (class Handler {
|
|
|
62
62
|
this.GroupEnable = e => {
|
|
63
63
|
/** 白名单不为空 */
|
|
64
64
|
if (Array.isArray(this.Config.WhiteList.groups) && this.Config.WhiteList.groups.length) {
|
|
65
|
-
|
|
66
|
-
return this.Config.WhiteList.groups.includes(group_id)
|
|
65
|
+
return this.Config.WhiteList.groups.includes(String(e.group_id))
|
|
67
66
|
}
|
|
68
67
|
/** 白名单为空 检查黑名单是否为空 */
|
|
69
68
|
if (Array.isArray(this.Config.BlackList.groups) && this.Config.BlackList.groups.length) {
|
|
70
|
-
|
|
71
|
-
return !this.Config.BlackList.groups.includes(group_id)
|
|
69
|
+
return !this.Config.BlackList.groups.includes(String(e.group_id))
|
|
72
70
|
}
|
|
73
71
|
/** 黑白名单都为空 */
|
|
74
72
|
return true
|
|
@@ -79,8 +77,7 @@ export const review = new (class Handler {
|
|
|
79
77
|
if (this.App.WhiteList.groups) {
|
|
80
78
|
this.GroupEnable = e => {
|
|
81
79
|
if (Array.isArray(this.Config.WhiteList.groups) && this.Config.WhiteList.groups.length) {
|
|
82
|
-
|
|
83
|
-
return this.Config.WhiteList.groups.includes(group_id)
|
|
80
|
+
return this.Config.WhiteList.groups.includes(String(e.group_id))
|
|
84
81
|
}
|
|
85
82
|
return true
|
|
86
83
|
}
|
|
@@ -90,8 +87,7 @@ export const review = new (class Handler {
|
|
|
90
87
|
if (this.App.BlackList.groups) {
|
|
91
88
|
this.GroupEnable = e => {
|
|
92
89
|
if (Array.isArray(this.Config.BlackList.groups) && this.Config.BlackList.groups.length) {
|
|
93
|
-
|
|
94
|
-
return !this.Config.BlackList.groups.includes(group_id)
|
|
90
|
+
return !this.Config.BlackList.groups.includes(String(e.group_id))
|
|
95
91
|
}
|
|
96
92
|
return true
|
|
97
93
|
}
|
|
@@ -110,13 +106,11 @@ export const review = new (class Handler {
|
|
|
110
106
|
this.UserEnable = e => {
|
|
111
107
|
/** 白名单不为空 */
|
|
112
108
|
if (Array.isArray(this.Config.WhiteList.users) && this.Config.WhiteList.users.length) {
|
|
113
|
-
|
|
114
|
-
return this.Config.WhiteList.users.includes(user_id)
|
|
109
|
+
return this.Config.WhiteList.users.includes(String(e.user_id))
|
|
115
110
|
}
|
|
116
111
|
/** 白名单为空 检查黑名单是否为空 */
|
|
117
112
|
if (Array.isArray(this.Config.BlackList.users) && this.Config.BlackList.users.length) {
|
|
118
|
-
|
|
119
|
-
return !this.Config.BlackList.users.includes(user_id)
|
|
113
|
+
return !this.Config.BlackList.users.includes(String(e.user_id))
|
|
120
114
|
}
|
|
121
115
|
/** 黑白名单都为空 */
|
|
122
116
|
return true
|
|
@@ -127,8 +121,7 @@ export const review = new (class Handler {
|
|
|
127
121
|
if (this.App.WhiteList.users) {
|
|
128
122
|
this.UserEnable = e => {
|
|
129
123
|
if (Array.isArray(this.Config.WhiteList.users) && this.Config.WhiteList.users.length) {
|
|
130
|
-
|
|
131
|
-
return this.Config.WhiteList.users.includes(user_id)
|
|
124
|
+
return this.Config.WhiteList.users.includes(String(e.user_id))
|
|
132
125
|
}
|
|
133
126
|
return true
|
|
134
127
|
}
|
|
@@ -138,8 +131,7 @@ export const review = new (class Handler {
|
|
|
138
131
|
if (this.App.BlackList.users) {
|
|
139
132
|
this.UserEnable = e => {
|
|
140
133
|
if (Array.isArray(this.Config.BlackList.users) && this.Config.BlackList.users.length) {
|
|
141
|
-
|
|
142
|
-
return !this.Config.BlackList.users.includes(user_id)
|
|
134
|
+
return !this.Config.BlackList.users.includes(String(e.user_id))
|
|
143
135
|
}
|
|
144
136
|
return true
|
|
145
137
|
}
|
|
@@ -158,13 +150,11 @@ export const review = new (class Handler {
|
|
|
158
150
|
this.GroupMsgPrint = e => {
|
|
159
151
|
/** 白名单不为空 */
|
|
160
152
|
if (Array.isArray(this.Config.WhiteList.GroupMsgLog) && this.Config.WhiteList.GroupMsgLog.length) {
|
|
161
|
-
|
|
162
|
-
return this.Config.WhiteList.GroupMsgLog.includes(group_id)
|
|
153
|
+
return this.Config.WhiteList.GroupMsgLog.includes(String(e.group_id))
|
|
163
154
|
}
|
|
164
155
|
/** 白名单为空 检查黑名单是否为空 */
|
|
165
156
|
if (Array.isArray(this.Config.BlackList.GroupMsgLog) && this.Config.BlackList.GroupMsgLog.length) {
|
|
166
|
-
|
|
167
|
-
return !this.Config.BlackList.GroupMsgLog.includes(group_id)
|
|
157
|
+
return !this.Config.BlackList.GroupMsgLog.includes(String(e.group_id))
|
|
168
158
|
}
|
|
169
159
|
/** 黑白名单都为空 */
|
|
170
160
|
return true
|
|
@@ -175,8 +165,7 @@ export const review = new (class Handler {
|
|
|
175
165
|
if (this.App.WhiteList.GroupMsgLog) {
|
|
176
166
|
this.GroupMsgPrint = e => {
|
|
177
167
|
if (Array.isArray(this.Config.WhiteList.GroupMsgLog) && this.Config.WhiteList.GroupMsgLog.length) {
|
|
178
|
-
|
|
179
|
-
return this.Config.WhiteList.GroupMsgLog.includes(group_id)
|
|
168
|
+
return this.Config.WhiteList.GroupMsgLog.includes(String(e.group_id))
|
|
180
169
|
}
|
|
181
170
|
return true
|
|
182
171
|
}
|
|
@@ -186,8 +175,7 @@ export const review = new (class Handler {
|
|
|
186
175
|
if (this.App.BlackList.GroupMsgLog) {
|
|
187
176
|
this.GroupMsgPrint = e => {
|
|
188
177
|
if (Array.isArray(this.Config.BlackList.GroupMsgLog) && this.Config.BlackList.GroupMsgLog.length) {
|
|
189
|
-
|
|
190
|
-
return !this.Config.BlackList.GroupMsgLog.includes(group_id)
|
|
178
|
+
return !this.Config.BlackList.GroupMsgLog.includes(String(e.group_id))
|
|
191
179
|
}
|
|
192
180
|
return true
|
|
193
181
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
1
|
export * from 'kritor-proto';
|
|
4
2
|
export * from './core/index.js';
|
|
5
3
|
export * from './event/index.js';
|
|
@@ -17,15 +15,15 @@ export declare const plugin: typeof Plugin;
|
|
|
17
15
|
*/
|
|
18
16
|
export declare const Renderer: {
|
|
19
17
|
index: number;
|
|
20
|
-
Apps: import("./types/index.js").KarinRenderApp
|
|
18
|
+
Apps: Array<import("./types/index.js").KarinRenderApp>;
|
|
21
19
|
app(data: {
|
|
22
20
|
id: string;
|
|
23
|
-
type?:
|
|
24
|
-
render:
|
|
21
|
+
type?: "image" | string;
|
|
22
|
+
render: import("./types/index.js").KarinRender["render"];
|
|
25
23
|
}): number;
|
|
26
24
|
unapp(index: number): boolean;
|
|
27
25
|
App(id?: string): import("./types/index.js").KarinRenderApp;
|
|
28
|
-
render(options: import("./types/index.js").KarinRenderType, id?: string
|
|
26
|
+
render(options: import("./types/index.js").KarinRenderType, id?: string): Promise<string | string[]>;
|
|
29
27
|
renderHtml(data: string): Promise<string | string[]>;
|
|
30
28
|
};
|
|
31
29
|
export declare const Cfg: {
|
|
@@ -39,7 +37,7 @@ export declare const Cfg: {
|
|
|
39
37
|
initCfg(): Promise<void>;
|
|
40
38
|
getPlugins(): string[];
|
|
41
39
|
dirPath(name: string, plugins: string[]): Promise<void>;
|
|
42
|
-
timeout(type?: "
|
|
40
|
+
timeout(type?: "ws" | "grpc"): number;
|
|
43
41
|
readonly redis: import("./types/index.js").Redis;
|
|
44
42
|
readonly master: string[];
|
|
45
43
|
readonly admin: string[];
|
|
@@ -55,65 +53,6 @@ export declare const Cfg: {
|
|
|
55
53
|
change_group(): Promise<void>;
|
|
56
54
|
"__#2@#review"(): Promise<void>;
|
|
57
55
|
};
|
|
58
|
-
export declare const Bot: {
|
|
59
|
-
index: number;
|
|
60
|
-
name: string;
|
|
61
|
-
list: {
|
|
62
|
-
index: number;
|
|
63
|
-
type: "internal" | "http" | "grpc" | "ws" | "render";
|
|
64
|
-
bot: import("./types/index.js").KarinAdapter;
|
|
65
|
-
}[];
|
|
66
|
-
adapter: {
|
|
67
|
-
type: "internal" | "http" | "grpc" | "ws" | "render";
|
|
68
|
-
adapter: new () => import("./types/index.js").KarinAdapter;
|
|
69
|
-
path: string;
|
|
70
|
-
}[];
|
|
71
|
-
addBot(data: {
|
|
72
|
-
bot: import("./types/index.js").KarinAdapter;
|
|
73
|
-
type: "internal" | "http" | "grpc" | "ws" | "render";
|
|
74
|
-
}): number | false;
|
|
75
|
-
delBot(index: number): void;
|
|
76
|
-
getBot(uid?: string): import("./types/index.js").KarinAdapter | undefined;
|
|
77
|
-
getBotByIndex(index: number): import("./types/index.js").KarinAdapter;
|
|
78
|
-
getBotCount(): number;
|
|
79
|
-
getBotAll(isIndex?: boolean): import("./types/index.js").KarinAdapter[] | {
|
|
80
|
-
index: number;
|
|
81
|
-
bot: import("./types/index.js").KarinAdapter;
|
|
82
|
-
}[];
|
|
83
|
-
addAdapter(data: {
|
|
84
|
-
type: "internal" | "http" | "grpc" | "ws" | "render";
|
|
85
|
-
adapter: new () => import("./types/index.js").KarinAdapter;
|
|
86
|
-
path?: string | undefined;
|
|
87
|
-
}): void;
|
|
88
|
-
getAdapter(path?: string): (new () => import("./types/index.js").KarinAdapter) | undefined;
|
|
89
|
-
getAdapterAll(isType?: boolean): {
|
|
90
|
-
type: "internal" | "http" | "grpc" | "ws" | "render";
|
|
91
|
-
adapter: new () => import("./types/index.js").KarinAdapter;
|
|
92
|
-
path: string;
|
|
93
|
-
}[] | (new () => import("./types/index.js").KarinAdapter)[];
|
|
94
|
-
sendMsg(uid: string, contact: import("./types/index.js").contact, elements: import("./types/index.js").KarinElement, options?: {
|
|
95
|
-
recallMsg?: number | undefined;
|
|
96
|
-
retry_count?: number | undefined;
|
|
97
|
-
}): Promise<{
|
|
98
|
-
message_id: string;
|
|
99
|
-
}>;
|
|
100
|
-
[EventEmitter.captureRejectionSymbol]?<K>(error: Error, event: string | symbol, ...args: any[]): void;
|
|
101
|
-
addListener<K_1>(eventName: string | symbol, listener: (...args: any[]) => void): any;
|
|
102
|
-
on<K_2>(eventName: string | symbol, listener: (...args: any[]) => void): any;
|
|
103
|
-
once<K_3>(eventName: string | symbol, listener: (...args: any[]) => void): any;
|
|
104
|
-
removeListener<K_4>(eventName: string | symbol, listener: (...args: any[]) => void): any;
|
|
105
|
-
off<K_5>(eventName: string | symbol, listener: (...args: any[]) => void): any;
|
|
106
|
-
removeAllListeners(eventName?: string | symbol | undefined): any;
|
|
107
|
-
setMaxListeners(n: number): any;
|
|
108
|
-
getMaxListeners(): number;
|
|
109
|
-
listeners<K_6>(eventName: string | symbol): Function[];
|
|
110
|
-
rawListeners<K_7>(eventName: string | symbol): Function[];
|
|
111
|
-
emit<K_8>(eventName: string | symbol, ...args: any[]): boolean;
|
|
112
|
-
listenerCount<K_9>(eventName: string | symbol, listener?: Function | undefined): number;
|
|
113
|
-
prependListener<K_10>(eventName: string | symbol, listener: (...args: any[]) => void): any;
|
|
114
|
-
prependOnceListener<K_11>(eventName: string | symbol, listener: (...args: any[]) => void): any;
|
|
115
|
-
eventNames(): (string | symbol)[];
|
|
116
|
-
};
|
|
117
56
|
export declare const Update: {
|
|
118
57
|
dir: string;
|
|
119
58
|
getPlugins(): string[];
|