mirai-js 2.7.2 → 2.8.0-1

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,20 @@
1
+ import { Bot } from './Bot';
2
+ import { ArrayToValuesUnion } from './typeHelpers';
3
+
1
4
  /**
2
5
  * 消息链的元素,是 mirai-api-http 接口需要的原始类型
3
6
  * 有多种消息类型实现了该接口,已经全部列出
4
- *
7
+ *
5
8
  * @see https://github.com/project-mirai/mirai-api-http/blob/master/docs/MessageType.md
6
9
  */
7
10
  interface MessageType {
8
- type: string;
11
+ type: MessageChainElementTypes;
9
12
 
10
13
  // Quote
11
- id?: number,
12
- groupId?: number,
13
- senderId?: number,
14
- targetId?: number,
14
+ id?: number;
15
+ groupId?: number;
16
+ senderId?: number;
17
+ targetId?: number;
15
18
  origin?: MessageType[];
16
19
 
17
20
  // At
@@ -71,7 +74,6 @@ interface BotConfigGetable {
71
74
  getSessionKey(): string;
72
75
  }
73
76
 
74
-
75
77
  // 图片 id
76
78
  type ImageId = string;
77
79
  // 语音 id
@@ -81,41 +83,291 @@ type MessageId = number;
81
83
 
82
84
  /**
83
85
  * 消息类型
84
- *
86
+ *
85
87
  * @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';
88
+ */
89
+
90
+ type MessageChainElementTypes =
91
+ | 'Source'
92
+ | 'Quote'
93
+ | 'At'
94
+ | 'AtAll'
95
+ | 'Face'
96
+ | 'Plain'
97
+ | 'Image'
98
+ | 'FlashImage'
99
+ | 'Voice'
100
+ | 'Xml'
101
+ | 'Json'
102
+ | 'App'
103
+ | 'Poke'
104
+ | 'Dice'
105
+ | 'MarketFace'
106
+ | 'MusicShare'
107
+ | 'ForwardMessage'
108
+ | 'File'
109
+ | 'MiraiCode';
110
+
111
+ interface EventBaseType {
112
+ bot: Bot;
113
+ }
114
+
115
+ // Middleware
116
+ interface MessageExtendType {
117
+ text?: string;
118
+ classified?: {
119
+ [key in MessageChainElementTypes]?: any[];
120
+ };
121
+ messageId?: number;
122
+ waitFor?: any
123
+ unlock?: () => void;
124
+ }
125
+ type RequestEventMethods =
126
+ | 'agree'
127
+ | 'refuse'
128
+ | 'ignore'
129
+ | 'refuseAndAddBlacklist'
130
+ | 'ignoreAndAddBlacklist';
131
+
132
+ type RequestEventExtendType = {
133
+ [key in RequestEventMethods]?: () => void;
134
+ };
135
+
136
+ interface Member {
137
+ id: number;
138
+ memberName: string;
139
+ specialTitle: string;
140
+ permission: GroupPermission;
141
+ joinTimestamp: number;
142
+ lastSpeakTimestamp: number;
143
+ muteTimeRemaining: number;
144
+ }
145
+
146
+ interface GroupSenderType {
147
+ id: number;
148
+ name: string;
149
+ permission: GroupPermission;
150
+ }
151
+
152
+ interface Friend {
153
+ id: number,
154
+ nickname: string,
155
+ remark: string;
156
+ }
157
+
158
+ interface EventEntityMap {
159
+ error: {
160
+ code: number;
161
+ } & EventBaseType,
162
+ close: {
163
+ reason: string;
164
+ } & EventBaseType,
165
+ 'unexpected-response': {
166
+ reason: string;
167
+ } & EventBaseType,
168
+ GroupMessage: {
169
+ type: 'GroupMessage';
170
+ sender: Member & { group: GroupSenderType },
171
+ messageChain: MessageType[];
172
+ } & EventBaseType &
173
+ MessageExtendType,
174
+ FriendMessage: {
175
+ type: 'FriendMessage';
176
+ messageChain: MessageType[];
177
+ sender: Friend
178
+ } & EventBaseType &
179
+ MessageExtendType,
180
+ BotOnlineEvent: {
181
+ type: 'BotOnlineEvent',
182
+ qq: number
183
+ } & EventBaseType,
184
+ BotOfflineEventActive: {
185
+ type: 'BotOfflineEventActive',
186
+ qq: number
187
+ } & EventBaseType,
188
+ BotOfflineEventForce: {
189
+ type: 'BotOfflineEventForce',
190
+ qq: number
191
+ } & EventBaseType,
192
+ BotOfflineEventDropped: {
193
+ type: 'BotOfflineEventDropped',
194
+ qq: number
195
+ } & EventBaseType,
196
+ BotReloginEvent: {
197
+ type: 'BotReloginEvent',
198
+ qq: number
199
+ } & EventBaseType,
200
+ BotGroupPermissionChangeEvent: {
201
+ type: 'BotGroupPermissionChangeEvent';
202
+ origin: Exclude<GroupPermission, 'OWNER'>;
203
+ current: GroupPermission;
204
+ group: GroupSenderType;
205
+ } & EventBaseType,
206
+ BotMuteEvent: {
207
+ type: 'BotMuteEvent',
208
+ durationSeconds: number,
209
+ operator: Member & { group: GroupSenderType };
210
+ } & EventBaseType,
211
+ BotUnmuteEvent: {
212
+ type: 'BotUnmuteEvent',
213
+ durationSeconds: number,
214
+ operator: Member & { group: GroupSenderType };
215
+ } & EventBaseType,
216
+ BotJoinGroupEvent: {
217
+ type: 'BotJoinGroupEvent',
218
+ group: GroupSenderType
219
+ operator?: null | Member & { group: GroupSenderType };
220
+ };
221
+ BotLeaveEventActive: {
222
+ type: 'BotLeaveEventActive',
223
+ group: GroupSenderType
224
+ };
225
+ BotLeaveEventKick: {
226
+ type: 'BotLeaveEventKick',
227
+ group: GroupSenderType
228
+ operator: Member & { group: GroupSenderType };
229
+ } & EventBaseType;
230
+ GroupRecallEvent: {
231
+ type: 'GroupRecallEvent'
232
+ authorId: number,
233
+ messageId: number,
234
+ time: number,
235
+ group: GroupSenderType
236
+ operator: Member & { group: GroupSenderType };
237
+ } & EventBaseType;
238
+ FriendRecallEvent: {
239
+ type: 'GroupRecallEvent'
240
+ authorId: number,
241
+ messageId: number,
242
+ time: number,
243
+ operator: number
244
+ } & EventBaseType;
245
+ GroupNameChangeEvent: {
246
+ type: 'GroupNameChangeEvent',
247
+ origin: string,
248
+ current: string,
249
+ group: GroupSenderType;
250
+ operator: Member & { group: GroupSenderType };
251
+ } & EventBaseType;
252
+ GroupEntranceAnnouncementChangeEvent: {
253
+ type: 'GroupEntranceAnnouncementChangeEvent',
254
+ origin: string,
255
+ current: string,
256
+ group: GroupSenderType;
257
+ operator: Member & { group: GroupSenderType };
258
+ } & EventBaseType;
259
+ GroupMuteAllEvent: {
260
+ type: 'GroupMuteAllEvent',
261
+ origin: boolean,
262
+ current: boolean,
263
+ group: GroupSenderType;
264
+ operator: Member & { group: GroupSenderType };
265
+ } & EventBaseType;
266
+ GroupAllowAnonymousChatEvent: {
267
+ type: 'GroupAllowAnonymousChatEvent',
268
+ origin: boolean,
269
+ current: boolean,
270
+ group: GroupSenderType,
271
+ operator: Member & { group: GroupSenderType };
272
+ } & EventBaseType;
273
+ GroupAllowConfessTalkEvent: {
274
+ type: 'GroupAllowAnonymousChatEvent',
275
+ origin: boolean,
276
+ current: boolean,
277
+ group: GroupSenderType,
278
+ isByBot: boolean
279
+ } & EventBaseType;
280
+ GroupAllowMemberInviteEvent: EventBaseType;
281
+ MemberJoinEvent: {
282
+ type: 'MemberJoinEvent',
283
+ member: Member & { group: GroupSenderType },
284
+ invitor: Member;
285
+ } & EventBaseType;
286
+ MemberLeaveEventKick: {
287
+ type: 'MemberLeaveEventKick',
288
+ member: Member & { group: GroupSenderType },
289
+ operator: Member & { group: GroupSenderType },
290
+ } & EventBaseType;
291
+ MemberLeaveEventQuit: {
292
+ type: 'MemberLeaveEventQuit',
293
+ member: Member & { group: GroupSenderType },
294
+ } & EventBaseType;
295
+ MemberCardChangeEvent: {
296
+ type: 'MemberCardChangeEvent',
297
+ origin: string,
298
+ current: string,
299
+ member: Member & { group: GroupSenderType };
300
+ } & EventBaseType;
301
+ MemberSpecialTitleChangeEvent: {
302
+ type: 'MemberSpecialTitleChangeEvent',
303
+ origin: string,
304
+ current: string,
305
+ member: Member & { group: GroupSenderType };
306
+ } & EventBaseType;
307
+ MemberPermissionChangeEvent: {
308
+ type: 'MemberPermissionChangeEvent',
309
+ origin: string,
310
+ current: string,
311
+ member: Member & { group: GroupSenderType };
312
+ } & EventBaseType;
313
+ MemberMuteEvent: {
314
+ type: 'MemberMuteEvent',
315
+ durationSeconds: number,
316
+ member: Member & { group: GroupSenderType };
317
+ operator: Member & { group: GroupSenderType };
318
+ } & EventBaseType;
319
+ MemberUnmuteEvent: {
320
+ type: 'MemberUnmuteEvent',
321
+ member: Member & { group: GroupSenderType };
322
+ operator: Member & { group: GroupSenderType };
323
+ } & EventBaseType;
324
+ MemberHonorChangeEvent: {
325
+ type: 'MemberHonorChangeEvent',
326
+ member: Member & { group: GroupSenderType }
327
+ action: 'achieve' | 'lose',
328
+ honor: string;
329
+ }
330
+ NewFriendRequestEvent: {
331
+ type: 'NewFriendRequestEvent',
332
+ eventId: number,
333
+ fromId: number,
334
+ groupId: number,
335
+ nick: string,
336
+ message: string
337
+ } & RequestEventExtendType & EventBaseType;
338
+ MemberJoinRequestEvent: {
339
+ type: 'MemberJoinRequestEvent',
340
+ eventId: number,
341
+ fromId: number,
342
+ groupId: number,
343
+ groupName: string,
344
+ nick: string,
345
+ message: string
346
+ } & RequestEventExtendType & EventBaseType;
347
+ BotInvitedJoinGroupRequestEvent: {
348
+ type: 'MemberJoinRequestEvent',
349
+ eventId: number,
350
+ fromId: number,
351
+ groupId: number,
352
+ groupName: string,
353
+ nick: string,
354
+ message: string
355
+ } & RequestEventExtendType & EventBaseType;
356
+ }
357
+
358
+ type EventType = keyof EventEntityMap;
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 EventType[] | 'UnknownEventType' = 'UnknownEventType'> =
370
+ (data: U extends 'UnknownEventType' ? EventBaseType : EventEntityMap[ArrayToValuesUnion<U extends 'UnknownEventType' ? never : U>]) => Awaitable<void | any>;
119
371
 
120
372
  // QQ 自带表情
121
373
  type FaceType =
@@ -175,22 +427,16 @@ type FaceType =
175
427
  export {
176
428
  // 接口
177
429
  MessageChainGetable, BotConfigGetable,
178
-
179
430
  // 消息类型
180
431
  MessageType,
181
-
182
432
  // MessageType.nodeList 的元素类型
183
433
  ForwardNode,
184
-
185
434
  // 图片 id 语音 id 消息 id
186
435
  ImageId, VoiceId, MessageId,
187
-
188
- // 事件类型 群成员权限 性别
189
- EventType, GroupPermission, SEX,
190
-
191
- // 消息处理器
192
- Processor,
193
-
436
+ // 事件类型 群成员权限 性别
437
+ EventType, EventEntityMap, GroupPermission, SEX,
194
438
  // QQ 自带表情
195
- FaceType
196
- };
439
+ FaceType,
440
+ Processor,
441
+ Awaitable,
442
+ };
@@ -3,10 +3,14 @@ import {
3
3
  ImageId, VoiceId, MessageId,
4
4
 
5
5
  // 事件类型 群成员权限 性别
6
- EventType, GroupPermission, SEX,
6
+ EventType, EventEntityMap, 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 EventType>(eventType: U, callback: Processor<[U]>): number;
97
+ on<U extends EventType[]>(eventType: U, callback: Processor<U>): 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 EventType>(eventType: U, callback: Processor<[U]>, strict: boolean): void;
108
+ one<U extends EventType[]>(eventType: U, callback: Processor<U>, 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: EventEntityMap[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
+ }
@@ -1,6 +1,8 @@
1
- import { Bot as BotType } from './Bot';
2
- import { Message as MessageType } from './Message';
3
- import { Middleware as MiddlewareType } from './Middleware';
1
+ import { Bot, Bot as BotType } from './Bot';
2
+ import { Message, Message as MessageType } from './Message';
3
+ import { Middleware, Middleware as MiddlewareType } from './Middleware';
4
+
5
+ export { Bot, Message, Middleware };
4
6
  declare module 'mirai-js' {
5
7
  export const Bot: typeof BotType;
6
8
  export const Message: typeof MessageType;
@@ -0,0 +1,2 @@
1
+ // 将数组转换为
2
+ export type ArrayToValuesUnion<T extends string[]> = T extends (infer E)[] ? E : never;
package/index.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { Bot } from './src';
2
+ const bot = new Bot();
3
+ bot.on(['FriendMessage', 'NewFriendRequestEvent'], e => {
4
+
5
+
6
+
7
+ })
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "mirai-js",
3
- "version": "2.7.2",
3
+ "version": "2.8.0-1",
4
4
  "description": "QQ robot development framework based on Mirai-api-http.",
5
5
  "main": "dist/node/index.js",
6
6
  "scripts": {
7
7
  "lint": "eslint --fix .",
8
- "build": "tsc --noEmit src/*.d.ts && webpack && babel src --out-dir dist/node --copy-files",
8
+ "build": "rm -rf dist && tsc --noEmit src/*.d.ts && webpack && babel src --out-dir dist/node --copy-files",
9
9
  "prepare": "husky install"
10
10
  },
11
11
  "lint-staged": {
@@ -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
  }