mirai-js 2.7.1-0 → 2.8.0-0

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -27,14 +27,6 @@ QQ 群: 730757181
27
27
 
28
28
  如果觉得这个项目还不错的话,就动动小手给个 star 吧!
29
29
 
30
- ## Star
31
-
32
- [![Stargazers repo roster for @Drincann/Mirai-js](https://reporoster.com/stars/Drincann/Mirai-js)](https://github.com/Drincann/Mirai-js/stargazers)
33
-
34
- ## Fork
35
-
36
- [![Forkers repo roster for @Drincann/Mirai-js](https://reporoster.com/forks/Drincann/Mirai-js)](https://github.com/Drincann/Mirai-js/network/members)
37
-
38
30
  ## 支持这个项目
39
31
 
40
32
  <a href="https://opencollective.com/mirai-js#sponsors" target="_blank"><img src="https://opencollective.com/mirai-js/sponsors.svg?width=890"></a>
@@ -1,17 +1,19 @@
1
+ import { Bot } from './Bot';
2
+
1
3
  /**
2
4
  * 消息链的元素,是 mirai-api-http 接口需要的原始类型
3
5
  * 有多种消息类型实现了该接口,已经全部列出
4
- *
6
+ *
5
7
  * @see https://github.com/project-mirai/mirai-api-http/blob/master/docs/MessageType.md
6
8
  */
7
9
  interface MessageType {
8
- type: string;
10
+ type: MessageChainElementTypes;
9
11
 
10
12
  // Quote
11
- id?: number,
12
- groupId?: number,
13
- senderId?: number,
14
- targetId?: number,
13
+ id?: number;
14
+ groupId?: number;
15
+ senderId?: number;
16
+ targetId?: number;
15
17
  origin?: MessageType[];
16
18
 
17
19
  // At
@@ -71,7 +73,6 @@ interface BotConfigGetable {
71
73
  getSessionKey(): string;
72
74
  }
73
75
 
74
-
75
76
  // 图片 id
76
77
  type ImageId = string;
77
78
  // 语音 id
@@ -81,41 +82,291 @@ type MessageId = number;
81
82
 
82
83
  /**
83
84
  * 消息类型
84
- *
85
+ *
85
86
  * @see https://github.com/project-mirai/mirai-api-http/blob/master/docs/EventType.md
86
- */
87
- type EventType =
88
- // WebSocket 事件
89
- | 'error' | 'close' | 'unexpected-response'
90
- // mirai 事件
91
- | 'GroupMessage' | 'FriendMessage'
92
- | 'BotOnlineEvent' | 'BotOfflineEventActive'
93
- | 'BotOfflineEventForce' | 'BotOfflineEventDropped'
94
- | 'BotReloginEvent' | 'BotGroupPermissionChangeEvent'
95
- | 'BotMuteEvent' | 'BotUnmuteEvent'
96
- | 'BotJoinGroupEvent' | 'BotLeaveEventActive'
97
- | 'BotLeaveEventKick' | 'GroupRecallEvent'
98
- | 'FriendRecallEvent' | 'GroupNameChangeEvent'
99
- | 'GroupEntranceAnnouncementChangeEvent' | 'GroupMuteAllEvent'
100
- | 'GroupAllowAnonymousChatEvent' | 'GroupAllowConfessTalkEvent'
101
- | 'GroupAllowMemberInviteEvent' | 'MemberJoinEvent'
102
- | 'MemberLeaveEventKick' | 'MemberLeaveEventQuit'
103
- | 'MemberCardChangeEvent' | 'MemberSpecialTitleChangeEvent'
104
- | 'MemberPermissionChangeEvent' | 'MemberMuteEvent'
105
- | 'MemberUnmuteEvent' | 'NewFriendRequestEvent'
106
- | 'MemberJoinRequestEvent' | 'BotInvitedJoinGroupRequestEvent';
87
+ */
88
+
89
+ type MessageChainElementTypes =
90
+ | 'Source'
91
+ | 'Quote'
92
+ | 'At'
93
+ | 'AtAll'
94
+ | 'Face'
95
+ | 'Plain'
96
+ | 'Image'
97
+ | 'FlashImage'
98
+ | 'Voice'
99
+ | 'Xml'
100
+ | 'Json'
101
+ | 'App'
102
+ | 'Poke'
103
+ | 'Dice'
104
+ | 'MarketFace'
105
+ | 'MusicShare'
106
+ | 'ForwardMessage'
107
+ | 'File'
108
+ | 'MiraiCode';
109
+
110
+ interface EventBaseType {
111
+ bot: Bot;
112
+ }
113
+
114
+ // Middleware
115
+ interface MessageExtendType {
116
+ text?: string;
117
+ classified?: {
118
+ [key in MessageChainElementTypes]?: any[];
119
+ };
120
+ messageId?: number;
121
+ waitFor?: any
122
+ unlock?: () => void;
123
+ }
124
+ type RequestEventMethods =
125
+ | 'agree'
126
+ | 'refuse'
127
+ | 'ignore'
128
+ | 'refuseAndAddBlacklist'
129
+ | 'ignoreAndAddBlacklist';
130
+
131
+ type RequestEventExtendType = {
132
+ [key in RequestEventMethods]?: () => void;
133
+ };
134
+
135
+ interface Member {
136
+ id: number;
137
+ memberName: string;
138
+ specialTitle: string;
139
+ permission: GroupPermission;
140
+ joinTimestamp: number;
141
+ lastSpeakTimestamp: number;
142
+ muteTimeRemaining: number;
143
+ }
144
+
145
+ interface GroupSenderType {
146
+ id: number;
147
+ name: string;
148
+ permission: GroupPermission;
149
+ }
150
+
151
+ interface Friend {
152
+ id: number,
153
+ nickname: string,
154
+ remark: string;
155
+ }
156
+
157
+ interface EventTypes {
158
+ error: {
159
+ code: number;
160
+ } & EventBaseType,
161
+ close: {
162
+ reason: string;
163
+ } & EventBaseType,
164
+ 'unexpected-response': {
165
+ reason: string;
166
+ } & EventBaseType,
167
+ GroupMessage: {
168
+ type: 'GroupMessage';
169
+ sender: Member & { group: GroupSenderType },
170
+ messageChain: MessageType[];
171
+ } & EventBaseType &
172
+ MessageExtendType,
173
+ FriendMessage: {
174
+ type: 'FriendMessage';
175
+ messageChain: MessageType[];
176
+ sender: Friend
177
+ } & EventBaseType &
178
+ MessageExtendType,
179
+ BotOnlineEvent: {
180
+ type: 'BotOnlineEvent',
181
+ qq: number
182
+ } & EventBaseType,
183
+ BotOfflineEventActive: {
184
+ type: 'BotOfflineEventActive',
185
+ qq: number
186
+ } & EventBaseType,
187
+ BotOfflineEventForce: {
188
+ type: 'BotOfflineEventForce',
189
+ qq: number
190
+ } & EventBaseType,
191
+ BotOfflineEventDropped: {
192
+ type: 'BotOfflineEventDropped',
193
+ qq: number
194
+ } & EventBaseType,
195
+ BotReloginEvent: {
196
+ type: 'BotReloginEvent',
197
+ qq: number
198
+ } & EventBaseType,
199
+ BotGroupPermissionChangeEvent: {
200
+ type: 'BotGroupPermissionChangeEvent';
201
+ origin: Exclude<GroupPermission, 'OWNER'>;
202
+ current: GroupPermission;
203
+ group: GroupSenderType;
204
+ } & EventBaseType,
205
+ BotMuteEvent: {
206
+ type: 'BotMuteEvent',
207
+ durationSeconds: number,
208
+ operator: Member & { group: GroupSenderType };
209
+ } & EventBaseType,
210
+ BotUnmuteEvent: {
211
+ type: 'BotUnmuteEvent',
212
+ durationSeconds: number,
213
+ operator: Member & { group: GroupSenderType };
214
+ } & EventBaseType,
215
+ BotJoinGroupEvent: {
216
+ type: 'BotJoinGroupEvent',
217
+ group: GroupSenderType
218
+ operator?: null | Member & { group: GroupSenderType };
219
+ };
220
+ BotLeaveEventActive: {
221
+ type: 'BotLeaveEventActive',
222
+ group: GroupSenderType
223
+ };
224
+ BotLeaveEventKick: {
225
+ type: 'BotLeaveEventKick',
226
+ group: GroupSenderType
227
+ operator: Member & { group: GroupSenderType };
228
+ } & EventBaseType;
229
+ GroupRecallEvent: {
230
+ type: 'GroupRecallEvent'
231
+ authorId: number,
232
+ messageId: number,
233
+ time: number,
234
+ group: GroupSenderType
235
+ operator: Member & { group: GroupSenderType };
236
+ } & EventBaseType;
237
+ FriendRecallEvent: {
238
+ type: 'GroupRecallEvent'
239
+ authorId: number,
240
+ messageId: number,
241
+ time: number,
242
+ operator: number
243
+ } & EventBaseType;
244
+ GroupNameChangeEvent: {
245
+ type: 'GroupNameChangeEvent',
246
+ origin: string,
247
+ current: string,
248
+ group: GroupSenderType;
249
+ operator: Member & { group: GroupSenderType };
250
+ } & EventBaseType;
251
+ GroupEntranceAnnouncementChangeEvent: {
252
+ type: 'GroupEntranceAnnouncementChangeEvent',
253
+ origin: string,
254
+ current: string,
255
+ group: GroupSenderType;
256
+ operator: Member & { group: GroupSenderType };
257
+ } & EventBaseType;
258
+ GroupMuteAllEvent: {
259
+ type: 'GroupMuteAllEvent',
260
+ origin: boolean,
261
+ current: boolean,
262
+ group: GroupSenderType;
263
+ operator: Member & { group: GroupSenderType };
264
+ } & EventBaseType;
265
+ GroupAllowAnonymousChatEvent: {
266
+ type: 'GroupAllowAnonymousChatEvent',
267
+ origin: boolean,
268
+ current: boolean,
269
+ group: GroupSenderType,
270
+ operator: Member & { group: GroupSenderType };
271
+ } & EventBaseType;
272
+ GroupAllowConfessTalkEvent: {
273
+ type: 'GroupAllowAnonymousChatEvent',
274
+ origin: boolean,
275
+ current: boolean,
276
+ group: GroupSenderType,
277
+ isByBot: boolean
278
+ } & EventBaseType;
279
+ GroupAllowMemberInviteEvent: EventBaseType;
280
+ MemberJoinEvent: {
281
+ type: 'MemberJoinEvent',
282
+ member: Member & { group: GroupSenderType },
283
+ invitor: Member;
284
+ } & EventBaseType;
285
+ MemberLeaveEventKick: {
286
+ type: 'MemberLeaveEventKick',
287
+ member: Member & { group: GroupSenderType },
288
+ operator: Member & { group: GroupSenderType },
289
+ } & EventBaseType;
290
+ MemberLeaveEventQuit: {
291
+ type: 'MemberLeaveEventQuit',
292
+ member: Member & { group: GroupSenderType },
293
+ } & EventBaseType;
294
+ MemberCardChangeEvent: {
295
+ type: 'MemberCardChangeEvent',
296
+ origin: string,
297
+ current: string,
298
+ member: Member & { group: GroupSenderType };
299
+ } & EventBaseType;
300
+ MemberSpecialTitleChangeEvent: {
301
+ type: 'MemberSpecialTitleChangeEvent',
302
+ origin: string,
303
+ current: string,
304
+ member: Member & { group: GroupSenderType };
305
+ } & EventBaseType;
306
+ MemberPermissionChangeEvent: {
307
+ type: 'MemberPermissionChangeEvent',
308
+ origin: string,
309
+ current: string,
310
+ member: Member & { group: GroupSenderType };
311
+ } & EventBaseType;
312
+ MemberMuteEvent: {
313
+ type: 'MemberMuteEvent',
314
+ durationSeconds: number,
315
+ member: Member & { group: GroupSenderType };
316
+ operator: Member & { group: GroupSenderType };
317
+ } & EventBaseType;
318
+ MemberUnmuteEvent: {
319
+ type: 'MemberUnmuteEvent',
320
+ member: Member & { group: GroupSenderType };
321
+ operator: Member & { group: GroupSenderType };
322
+ } & EventBaseType;
323
+ MemberHonorChangeEvent: {
324
+ type: 'MemberHonorChangeEvent',
325
+ member: Member & { group: GroupSenderType }
326
+ action: 'achieve' | 'lose',
327
+ honor: string;
328
+ }
329
+ NewFriendRequestEvent: {
330
+ type: 'NewFriendRequestEvent',
331
+ eventId: number,
332
+ fromId: number,
333
+ groupId: number,
334
+ nick: string,
335
+ message: string
336
+ } & RequestEventExtendType & EventBaseType;
337
+ MemberJoinRequestEvent: {
338
+ type: 'MemberJoinRequestEvent',
339
+ eventId: number,
340
+ fromId: number,
341
+ groupId: number,
342
+ groupName: string,
343
+ nick: string,
344
+ message: string
345
+ } & RequestEventExtendType & EventBaseType;
346
+ BotInvitedJoinGroupRequestEvent: {
347
+ type: 'MemberJoinRequestEvent',
348
+ eventId: number,
349
+ fromId: number,
350
+ groupId: number,
351
+ groupName: string,
352
+ nick: string,
353
+ message: string
354
+ } & RequestEventExtendType & EventBaseType;
355
+ AnyEvent: EventBaseType;
356
+ }
357
+
358
+ type EventType = keyof EventTypes;
359
+
360
+ type Awaitable<T> = T | PromiseLike<T>;
107
361
 
108
362
  // 群成员权限
109
- type GroupPermission =
110
- | 'OWNER'
111
- | 'ADMINISTRATOR'
112
- | 'MEMBER';
363
+ type GroupPermission = 'OWNER' | 'ADMINISTRATOR' | 'MEMBER';
113
364
 
114
365
  // 性别
115
- type SEX = 'UNKNOWN' | 'MALE' | 'FEMALE'
366
+ type SEX = 'UNKNOWN' | 'MALE' | 'FEMALE';
116
367
 
117
368
  // 消息处理器
118
- type Processor = (data: any) => Promise<any> | any;
369
+ type Processor<U extends keyof EventTypes> = (data: EventTypes[U]) => Awaitable<void | any>
119
370
 
120
371
  // QQ 自带表情
121
372
  type FaceType =
@@ -175,22 +426,16 @@ type FaceType =
175
426
  export {
176
427
  // 接口
177
428
  MessageChainGetable, BotConfigGetable,
178
-
179
429
  // 消息类型
180
430
  MessageType,
181
-
182
431
  // MessageType.nodeList 的元素类型
183
432
  ForwardNode,
184
-
185
433
  // 图片 id 语音 id 消息 id
186
434
  ImageId, VoiceId, MessageId,
187
-
188
- // 事件类型 群成员权限 性别
189
- EventType, GroupPermission, SEX,
190
-
191
- // 消息处理器
192
- Processor,
193
-
435
+ // 事件类型 群成员权限 性别
436
+ EventType, EventTypes, GroupPermission, SEX,
194
437
  // QQ 自带表情
195
- FaceType
196
- };
438
+ FaceType,
439
+ Processor,
440
+ Awaitable,
441
+ };
@@ -3,10 +3,14 @@ import {
3
3
  ImageId, VoiceId, MessageId,
4
4
 
5
5
  // 事件类型 群成员权限 性别
6
- EventType, GroupPermission, SEX,
6
+ EventType, EventTypes, GroupPermission, SEX,
7
7
 
8
8
  // 接口 原始消息类型 事件处理器类型
9
- MessageChainGetable, BotConfigGetable, MessageType, Processor
9
+ MessageChainGetable, BotConfigGetable, MessageType,
10
+
11
+ Awaitable,
12
+ Processor,
13
+
10
14
  } from './BaseType';
11
15
 
12
16
  // 等待器
@@ -19,9 +23,7 @@ export class Bot implements BotConfigGetable {
19
23
 
20
24
  // 类属性
21
25
  public static groupPermission: {
22
- OWNER: GroupPermission;
23
- ADMINISTRATOR: GroupPermission;
24
- MEMBER: GroupPermission;
26
+ [k in GroupPermission]: k
25
27
  };
26
28
 
27
29
  // 一些私有的实例属性
@@ -91,7 +93,8 @@ export class Bot implements BotConfigGetable {
91
93
  * @param callback 必选,回调函数
92
94
  * @returns handle 事件处理器的标识,用于移除该处理器
93
95
  */
94
- on(eventType: EventType | EventType[], processor: Processor): number | number[];
96
+ on<U extends keyof EventTypes>(eventType: U, callback: Processor<U>): number;
97
+ on<U extends (keyof EventTypes)[]>(eventType: U, callback: Processor<U[number]>): number[];
95
98
 
96
99
  /**
97
100
  * @description 添加一个一次性事件处理器,回调一次后自动移除
@@ -101,7 +104,8 @@ export class Bot implements BotConfigGetable {
101
104
  * 当为 true 时,只有开发者的处理器结束后才会移除该处理器
102
105
  * 当为 false 时,即使消息被拦截,也会移除该处理器
103
106
  */
104
- one(eventType: EventType | EventType[], processor: Processor, strict: boolean,): void;
107
+ one<U extends keyof EventTypes>(eventType: U, callback: Processor<U>, strict: boolean): void;
108
+ one<U extends (keyof EventTypes)[]>(eventType: U, callback: Processor<U[number]>, strict: boolean): void;
105
109
 
106
110
  /**
107
111
  * @description 移除一个事件处理器
@@ -314,11 +318,12 @@ declare namespace Bot {
314
318
  verifyKey: string;
315
319
  sessionKey: string;
316
320
  }
321
+
317
322
  // An index signature parameter type cannot be a union type. Consider using a mapped object type instead.
318
- interface EventProcessorMap {
323
+ type EventProcessorMap = {
319
324
  // 索引不能使用联合类型
320
- [eventType: string /* EventType */]: {
321
- [handle: number]: Processor;
325
+ [eventType in EventType]: {
326
+ [handler: number]: (data: EventTypes[eventType]) => Awaitable<void | any>;
322
327
  };
323
328
  }
324
329
 
@@ -58,9 +58,9 @@ export class ForwardMessage implements MessageChainGetable {
58
58
  time,
59
59
  senderName,
60
60
  messageChain
61
- }: ForwardNode): Message;
62
- addForwardNode(messageId: MessageId): ForwardMessage;
61
+ }: ForwardNode): this;
62
+ addForwardNode(messageId: MessageId): this;
63
63
 
64
64
  // implements MessageChainGetable
65
65
  getMessageChain(): MessageType[];
66
- }
66
+ }
@@ -128,12 +128,12 @@ export class Middleware {
128
128
  * @description 生成一个带有中间件的事件处理器
129
129
  * @param callback 事件处理器
130
130
  */
131
- done(callback: Processor): Processor;
131
+ done(callback: Processor<'AnyEvent'>): Processor<'AnyEvent'>;
132
132
 
133
133
  }
134
134
 
135
135
  declare namespace Middleware {
136
- type NextMiddlewareCaller = () => NextMiddlewareCaller | Processor;
136
+ type NextMiddlewareCaller = () => NextMiddlewareCaller | Processor<'AnyEvent'>;
137
137
 
138
138
  interface GroupMemberMap {
139
139
  [group: number]: number[];
@@ -9,5 +9,5 @@ export class Waiter {
9
9
  * @param eventType 事件类型
10
10
  * @param callback 处理器,其返回值将被 resolve,传递到外部
11
11
  */
12
- wait(eventType: EventType, callback: Processor): Promise<any>;
12
+ wait(eventType: EventType, callback: Processor<'AnyEvent'>): Promise<any>;
13
13
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mirai-js",
3
- "version": "2.7.1-0",
3
+ "version": "2.8.0-0",
4
4
  "description": "QQ robot development framework based on Mirai-api-http.",
5
5
  "main": "dist/node/index.js",
6
6
  "scripts": {
@@ -31,22 +31,22 @@
31
31
  "license": "AGPL-3.0",
32
32
  "dependencies": {
33
33
  "axios": "^0.24.0",
34
- "form-data": "^3.0.0",
35
- "ws": "^8.4.0"
34
+ "form-data": "^3.0.1",
35
+ "ws": "^8.8.1"
36
36
  },
37
37
  "devDependencies": {
38
- "@babel/cli": "^7.13.14",
39
- "@babel/core": "^7.13.14",
40
- "@babel/preset-env": "^7.13.12",
41
- "@typescript-eslint/eslint-plugin": "^5.4.0",
42
- "@typescript-eslint/parser": "^5.5.0",
43
- "eslint": "^8.2.0",
38
+ "@babel/cli": "^7.18.9",
39
+ "@babel/core": "^7.18.9",
40
+ "@babel/preset-env": "^7.18.9",
41
+ "@typescript-eslint/eslint-plugin": "^5.30.7",
42
+ "@typescript-eslint/parser": "^5.30.7",
43
+ "eslint": "^8.20.0",
44
44
  "husky": "^6.0.0",
45
- "lint-staged": "^12.0.2",
45
+ "lint-staged": "^12.5.0",
46
46
  "path-browserify": "^1.0.1",
47
47
  "process": "^0.11.10",
48
- "typescript": "^4.2.2",
49
- "webpack": "^5.30.0",
50
- "webpack-cli": "^4.6.0"
48
+ "typescript": "^4.7.4",
49
+ "webpack": "^5.73.0",
50
+ "webpack-cli": "^4.10.0"
51
51
  }
52
52
  }
package/src/BaseType.d.ts CHANGED
@@ -1,17 +1,19 @@
1
+ import { Bot } from './Bot';
2
+
1
3
  /**
2
4
  * 消息链的元素,是 mirai-api-http 接口需要的原始类型
3
5
  * 有多种消息类型实现了该接口,已经全部列出
4
- *
6
+ *
5
7
  * @see https://github.com/project-mirai/mirai-api-http/blob/master/docs/MessageType.md
6
8
  */
7
9
  interface MessageType {
8
- type: string;
10
+ type: MessageChainElementTypes;
9
11
 
10
12
  // Quote
11
- id?: number,
12
- groupId?: number,
13
- senderId?: number,
14
- targetId?: number,
13
+ id?: number;
14
+ groupId?: number;
15
+ senderId?: number;
16
+ targetId?: number;
15
17
  origin?: MessageType[];
16
18
 
17
19
  // At
@@ -71,7 +73,6 @@ interface BotConfigGetable {
71
73
  getSessionKey(): string;
72
74
  }
73
75
 
74
-
75
76
  // 图片 id
76
77
  type ImageId = string;
77
78
  // 语音 id
@@ -81,41 +82,291 @@ type MessageId = number;
81
82
 
82
83
  /**
83
84
  * 消息类型
84
- *
85
+ *
85
86
  * @see https://github.com/project-mirai/mirai-api-http/blob/master/docs/EventType.md
86
- */
87
- type EventType =
88
- // WebSocket 事件
89
- | 'error' | 'close' | 'unexpected-response'
90
- // mirai 事件
91
- | 'GroupMessage' | 'FriendMessage'
92
- | 'BotOnlineEvent' | 'BotOfflineEventActive'
93
- | 'BotOfflineEventForce' | 'BotOfflineEventDropped'
94
- | 'BotReloginEvent' | 'BotGroupPermissionChangeEvent'
95
- | 'BotMuteEvent' | 'BotUnmuteEvent'
96
- | 'BotJoinGroupEvent' | 'BotLeaveEventActive'
97
- | 'BotLeaveEventKick' | 'GroupRecallEvent'
98
- | 'FriendRecallEvent' | 'GroupNameChangeEvent'
99
- | 'GroupEntranceAnnouncementChangeEvent' | 'GroupMuteAllEvent'
100
- | 'GroupAllowAnonymousChatEvent' | 'GroupAllowConfessTalkEvent'
101
- | 'GroupAllowMemberInviteEvent' | 'MemberJoinEvent'
102
- | 'MemberLeaveEventKick' | 'MemberLeaveEventQuit'
103
- | 'MemberCardChangeEvent' | 'MemberSpecialTitleChangeEvent'
104
- | 'MemberPermissionChangeEvent' | 'MemberMuteEvent'
105
- | 'MemberUnmuteEvent' | 'NewFriendRequestEvent'
106
- | 'MemberJoinRequestEvent' | 'BotInvitedJoinGroupRequestEvent';
87
+ */
88
+
89
+ type MessageChainElementTypes =
90
+ | 'Source'
91
+ | 'Quote'
92
+ | 'At'
93
+ | 'AtAll'
94
+ | 'Face'
95
+ | 'Plain'
96
+ | 'Image'
97
+ | 'FlashImage'
98
+ | 'Voice'
99
+ | 'Xml'
100
+ | 'Json'
101
+ | 'App'
102
+ | 'Poke'
103
+ | 'Dice'
104
+ | 'MarketFace'
105
+ | 'MusicShare'
106
+ | 'ForwardMessage'
107
+ | 'File'
108
+ | 'MiraiCode';
109
+
110
+ interface EventBaseType {
111
+ bot: Bot;
112
+ }
113
+
114
+ // Middleware
115
+ interface MessageExtendType {
116
+ text?: string;
117
+ classified?: {
118
+ [key in MessageChainElementTypes]?: any[];
119
+ };
120
+ messageId?: number;
121
+ waitFor?: any
122
+ unlock?: () => void;
123
+ }
124
+ type RequestEventMethods =
125
+ | 'agree'
126
+ | 'refuse'
127
+ | 'ignore'
128
+ | 'refuseAndAddBlacklist'
129
+ | 'ignoreAndAddBlacklist';
130
+
131
+ type RequestEventExtendType = {
132
+ [key in RequestEventMethods]?: () => void;
133
+ };
134
+
135
+ interface Member {
136
+ id: number;
137
+ memberName: string;
138
+ specialTitle: string;
139
+ permission: GroupPermission;
140
+ joinTimestamp: number;
141
+ lastSpeakTimestamp: number;
142
+ muteTimeRemaining: number;
143
+ }
144
+
145
+ interface GroupSenderType {
146
+ id: number;
147
+ name: string;
148
+ permission: GroupPermission;
149
+ }
150
+
151
+ interface Friend {
152
+ id: number,
153
+ nickname: string,
154
+ remark: string;
155
+ }
156
+
157
+ interface EventTypes {
158
+ error: {
159
+ code: number;
160
+ } & EventBaseType,
161
+ close: {
162
+ reason: string;
163
+ } & EventBaseType,
164
+ 'unexpected-response': {
165
+ reason: string;
166
+ } & EventBaseType,
167
+ GroupMessage: {
168
+ type: 'GroupMessage';
169
+ sender: Member & { group: GroupSenderType },
170
+ messageChain: MessageType[];
171
+ } & EventBaseType &
172
+ MessageExtendType,
173
+ FriendMessage: {
174
+ type: 'FriendMessage';
175
+ messageChain: MessageType[];
176
+ sender: Friend
177
+ } & EventBaseType &
178
+ MessageExtendType,
179
+ BotOnlineEvent: {
180
+ type: 'BotOnlineEvent',
181
+ qq: number
182
+ } & EventBaseType,
183
+ BotOfflineEventActive: {
184
+ type: 'BotOfflineEventActive',
185
+ qq: number
186
+ } & EventBaseType,
187
+ BotOfflineEventForce: {
188
+ type: 'BotOfflineEventForce',
189
+ qq: number
190
+ } & EventBaseType,
191
+ BotOfflineEventDropped: {
192
+ type: 'BotOfflineEventDropped',
193
+ qq: number
194
+ } & EventBaseType,
195
+ BotReloginEvent: {
196
+ type: 'BotReloginEvent',
197
+ qq: number
198
+ } & EventBaseType,
199
+ BotGroupPermissionChangeEvent: {
200
+ type: 'BotGroupPermissionChangeEvent';
201
+ origin: Exclude<GroupPermission, 'OWNER'>;
202
+ current: GroupPermission;
203
+ group: GroupSenderType;
204
+ } & EventBaseType,
205
+ BotMuteEvent: {
206
+ type: 'BotMuteEvent',
207
+ durationSeconds: number,
208
+ operator: Member & { group: GroupSenderType };
209
+ } & EventBaseType,
210
+ BotUnmuteEvent: {
211
+ type: 'BotUnmuteEvent',
212
+ durationSeconds: number,
213
+ operator: Member & { group: GroupSenderType };
214
+ } & EventBaseType,
215
+ BotJoinGroupEvent: {
216
+ type: 'BotJoinGroupEvent',
217
+ group: GroupSenderType
218
+ operator?: null | Member & { group: GroupSenderType };
219
+ };
220
+ BotLeaveEventActive: {
221
+ type: 'BotLeaveEventActive',
222
+ group: GroupSenderType
223
+ };
224
+ BotLeaveEventKick: {
225
+ type: 'BotLeaveEventKick',
226
+ group: GroupSenderType
227
+ operator: Member & { group: GroupSenderType };
228
+ } & EventBaseType;
229
+ GroupRecallEvent: {
230
+ type: 'GroupRecallEvent'
231
+ authorId: number,
232
+ messageId: number,
233
+ time: number,
234
+ group: GroupSenderType
235
+ operator: Member & { group: GroupSenderType };
236
+ } & EventBaseType;
237
+ FriendRecallEvent: {
238
+ type: 'GroupRecallEvent'
239
+ authorId: number,
240
+ messageId: number,
241
+ time: number,
242
+ operator: number
243
+ } & EventBaseType;
244
+ GroupNameChangeEvent: {
245
+ type: 'GroupNameChangeEvent',
246
+ origin: string,
247
+ current: string,
248
+ group: GroupSenderType;
249
+ operator: Member & { group: GroupSenderType };
250
+ } & EventBaseType;
251
+ GroupEntranceAnnouncementChangeEvent: {
252
+ type: 'GroupEntranceAnnouncementChangeEvent',
253
+ origin: string,
254
+ current: string,
255
+ group: GroupSenderType;
256
+ operator: Member & { group: GroupSenderType };
257
+ } & EventBaseType;
258
+ GroupMuteAllEvent: {
259
+ type: 'GroupMuteAllEvent',
260
+ origin: boolean,
261
+ current: boolean,
262
+ group: GroupSenderType;
263
+ operator: Member & { group: GroupSenderType };
264
+ } & EventBaseType;
265
+ GroupAllowAnonymousChatEvent: {
266
+ type: 'GroupAllowAnonymousChatEvent',
267
+ origin: boolean,
268
+ current: boolean,
269
+ group: GroupSenderType,
270
+ operator: Member & { group: GroupSenderType };
271
+ } & EventBaseType;
272
+ GroupAllowConfessTalkEvent: {
273
+ type: 'GroupAllowAnonymousChatEvent',
274
+ origin: boolean,
275
+ current: boolean,
276
+ group: GroupSenderType,
277
+ isByBot: boolean
278
+ } & EventBaseType;
279
+ GroupAllowMemberInviteEvent: EventBaseType;
280
+ MemberJoinEvent: {
281
+ type: 'MemberJoinEvent',
282
+ member: Member & { group: GroupSenderType },
283
+ invitor: Member;
284
+ } & EventBaseType;
285
+ MemberLeaveEventKick: {
286
+ type: 'MemberLeaveEventKick',
287
+ member: Member & { group: GroupSenderType },
288
+ operator: Member & { group: GroupSenderType },
289
+ } & EventBaseType;
290
+ MemberLeaveEventQuit: {
291
+ type: 'MemberLeaveEventQuit',
292
+ member: Member & { group: GroupSenderType },
293
+ } & EventBaseType;
294
+ MemberCardChangeEvent: {
295
+ type: 'MemberCardChangeEvent',
296
+ origin: string,
297
+ current: string,
298
+ member: Member & { group: GroupSenderType };
299
+ } & EventBaseType;
300
+ MemberSpecialTitleChangeEvent: {
301
+ type: 'MemberSpecialTitleChangeEvent',
302
+ origin: string,
303
+ current: string,
304
+ member: Member & { group: GroupSenderType };
305
+ } & EventBaseType;
306
+ MemberPermissionChangeEvent: {
307
+ type: 'MemberPermissionChangeEvent',
308
+ origin: string,
309
+ current: string,
310
+ member: Member & { group: GroupSenderType };
311
+ } & EventBaseType;
312
+ MemberMuteEvent: {
313
+ type: 'MemberMuteEvent',
314
+ durationSeconds: number,
315
+ member: Member & { group: GroupSenderType };
316
+ operator: Member & { group: GroupSenderType };
317
+ } & EventBaseType;
318
+ MemberUnmuteEvent: {
319
+ type: 'MemberUnmuteEvent',
320
+ member: Member & { group: GroupSenderType };
321
+ operator: Member & { group: GroupSenderType };
322
+ } & EventBaseType;
323
+ MemberHonorChangeEvent: {
324
+ type: 'MemberHonorChangeEvent',
325
+ member: Member & { group: GroupSenderType }
326
+ action: 'achieve' | 'lose',
327
+ honor: string;
328
+ }
329
+ NewFriendRequestEvent: {
330
+ type: 'NewFriendRequestEvent',
331
+ eventId: number,
332
+ fromId: number,
333
+ groupId: number,
334
+ nick: string,
335
+ message: string
336
+ } & RequestEventExtendType & EventBaseType;
337
+ MemberJoinRequestEvent: {
338
+ type: 'MemberJoinRequestEvent',
339
+ eventId: number,
340
+ fromId: number,
341
+ groupId: number,
342
+ groupName: string,
343
+ nick: string,
344
+ message: string
345
+ } & RequestEventExtendType & EventBaseType;
346
+ BotInvitedJoinGroupRequestEvent: {
347
+ type: 'MemberJoinRequestEvent',
348
+ eventId: number,
349
+ fromId: number,
350
+ groupId: number,
351
+ groupName: string,
352
+ nick: string,
353
+ message: string
354
+ } & RequestEventExtendType & EventBaseType;
355
+ AnyEvent: EventBaseType;
356
+ }
357
+
358
+ type EventType = keyof EventTypes;
359
+
360
+ type Awaitable<T> = T | PromiseLike<T>;
107
361
 
108
362
  // 群成员权限
109
- type GroupPermission =
110
- | 'OWNER'
111
- | 'ADMINISTRATOR'
112
- | 'MEMBER';
363
+ type GroupPermission = 'OWNER' | 'ADMINISTRATOR' | 'MEMBER';
113
364
 
114
365
  // 性别
115
- type SEX = 'UNKNOWN' | 'MALE' | 'FEMALE'
366
+ type SEX = 'UNKNOWN' | 'MALE' | 'FEMALE';
116
367
 
117
368
  // 消息处理器
118
- type Processor = (data: any) => Promise<any> | any;
369
+ type Processor<U extends keyof EventTypes> = (data: EventTypes[U]) => Awaitable<void | any>
119
370
 
120
371
  // QQ 自带表情
121
372
  type FaceType =
@@ -175,22 +426,16 @@ type FaceType =
175
426
  export {
176
427
  // 接口
177
428
  MessageChainGetable, BotConfigGetable,
178
-
179
429
  // 消息类型
180
430
  MessageType,
181
-
182
431
  // MessageType.nodeList 的元素类型
183
432
  ForwardNode,
184
-
185
433
  // 图片 id 语音 id 消息 id
186
434
  ImageId, VoiceId, MessageId,
187
-
188
- // 事件类型 群成员权限 性别
189
- EventType, GroupPermission, SEX,
190
-
191
- // 消息处理器
192
- Processor,
193
-
435
+ // 事件类型 群成员权限 性别
436
+ EventType, EventTypes, GroupPermission, SEX,
194
437
  // QQ 自带表情
195
- FaceType
196
- };
438
+ FaceType,
439
+ Processor,
440
+ Awaitable,
441
+ };
package/src/Bot.d.ts CHANGED
@@ -3,10 +3,14 @@ import {
3
3
  ImageId, VoiceId, MessageId,
4
4
 
5
5
  // 事件类型 群成员权限 性别
6
- EventType, GroupPermission, SEX,
6
+ EventType, EventTypes, GroupPermission, SEX,
7
7
 
8
8
  // 接口 原始消息类型 事件处理器类型
9
- MessageChainGetable, BotConfigGetable, MessageType, Processor
9
+ MessageChainGetable, BotConfigGetable, MessageType,
10
+
11
+ Awaitable,
12
+ Processor,
13
+
10
14
  } from './BaseType';
11
15
 
12
16
  // 等待器
@@ -19,9 +23,7 @@ export class Bot implements BotConfigGetable {
19
23
 
20
24
  // 类属性
21
25
  public static groupPermission: {
22
- OWNER: GroupPermission;
23
- ADMINISTRATOR: GroupPermission;
24
- MEMBER: GroupPermission;
26
+ [k in GroupPermission]: k
25
27
  };
26
28
 
27
29
  // 一些私有的实例属性
@@ -91,7 +93,8 @@ export class Bot implements BotConfigGetable {
91
93
  * @param callback 必选,回调函数
92
94
  * @returns handle 事件处理器的标识,用于移除该处理器
93
95
  */
94
- on(eventType: EventType | EventType[], processor: Processor): number | number[];
96
+ on<U extends keyof EventTypes>(eventType: U, callback: Processor<U>): number;
97
+ on<U extends (keyof EventTypes)[]>(eventType: U, callback: Processor<U[number]>): number[];
95
98
 
96
99
  /**
97
100
  * @description 添加一个一次性事件处理器,回调一次后自动移除
@@ -101,7 +104,8 @@ export class Bot implements BotConfigGetable {
101
104
  * 当为 true 时,只有开发者的处理器结束后才会移除该处理器
102
105
  * 当为 false 时,即使消息被拦截,也会移除该处理器
103
106
  */
104
- one(eventType: EventType | EventType[], processor: Processor, strict: boolean,): void;
107
+ one<U extends keyof EventTypes>(eventType: U, callback: Processor<U>, strict: boolean): void;
108
+ one<U extends (keyof EventTypes)[]>(eventType: U, callback: Processor<U[number]>, strict: boolean): void;
105
109
 
106
110
  /**
107
111
  * @description 移除一个事件处理器
@@ -314,11 +318,12 @@ declare namespace Bot {
314
318
  verifyKey: string;
315
319
  sessionKey: string;
316
320
  }
321
+
317
322
  // An index signature parameter type cannot be a union type. Consider using a mapped object type instead.
318
- interface EventProcessorMap {
323
+ type EventProcessorMap = {
319
324
  // 索引不能使用联合类型
320
- [eventType: string /* EventType */]: {
321
- [handle: number]: Processor;
325
+ [eventType in EventType]: {
326
+ [handler: number]: (data: EventTypes[eventType]) => Awaitable<void | any>;
322
327
  };
323
328
  }
324
329
 
package/src/Message.d.ts CHANGED
@@ -58,9 +58,9 @@ export class ForwardMessage implements MessageChainGetable {
58
58
  time,
59
59
  senderName,
60
60
  messageChain
61
- }: ForwardNode): Message;
62
- addForwardNode(messageId: MessageId): ForwardMessage;
61
+ }: ForwardNode): this;
62
+ addForwardNode(messageId: MessageId): this;
63
63
 
64
64
  // implements MessageChainGetable
65
65
  getMessageChain(): MessageType[];
66
- }
66
+ }
@@ -128,12 +128,12 @@ export class Middleware {
128
128
  * @description 生成一个带有中间件的事件处理器
129
129
  * @param callback 事件处理器
130
130
  */
131
- done(callback: Processor): Processor;
131
+ done(callback: Processor<'AnyEvent'>): Processor<'AnyEvent'>;
132
132
 
133
133
  }
134
134
 
135
135
  declare namespace Middleware {
136
- type NextMiddlewareCaller = () => NextMiddlewareCaller | Processor;
136
+ type NextMiddlewareCaller = () => NextMiddlewareCaller | Processor<'AnyEvent'>;
137
137
 
138
138
  interface GroupMemberMap {
139
139
  [group: number]: number[];
package/src/Waiter.d.ts CHANGED
@@ -9,5 +9,5 @@ export class Waiter {
9
9
  * @param eventType 事件类型
10
10
  * @param callback 处理器,其返回值将被 resolve,传递到外部
11
11
  */
12
- wait(eventType: EventType, callback: Processor): Promise<any>;
12
+ wait(eventType: EventType, callback: Processor<'AnyEvent'>): Promise<any>;
13
13
  }
@@ -1,3 +1,3 @@
1
- exports.isBrowserEnv = () => {
2
- return typeof window !== 'undefined';
1
+ exports.isBrowserEnv = () => {
2
+ return typeof window !== 'undefined';
3
3
  };