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/src/BaseType.d.ts CHANGED
@@ -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
+ };
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, 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
 
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
+ }
package/src/index.d.ts CHANGED
@@ -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;
@@ -1,3 +1,3 @@
1
- exports.isBrowserEnv = () => {
2
- return typeof window !== 'undefined';
1
+ exports.isBrowserEnv = () => {
2
+ return typeof window !== 'undefined';
3
3
  };
@@ -1,15 +0,0 @@
1
- import { ForwardNodeGetable, ForwardNodeType, MessageId } from './BaseType';
2
-
3
- // Bot.sendForward 的 nodeList 参数是一个 ForwardNode 类型的实例
4
- // 方法内部通过 ForwardNodeType 接口的 getForwardNode 方法拿到消息链
5
- export class ForwardNode implements ForwardNodeGetable {
6
- private nodeList: ForwardNodeType[];
7
-
8
- // 自行添加一个消息节点
9
- addForwardNode(nodeList: ForwardNodeType): ForwardNode;
10
- // 使用 MessageId 添加一个消息节点
11
- addForwardNodeById(ID: MessageId): ForwardNode;
12
-
13
- // implements ForwardNodeGetable
14
- getForwardNode(): ForwardNodeType[];
15
- }
@@ -1,70 +0,0 @@
1
- "use strict";
2
-
3
- // 用于与 Bot.sendForward 耦合的接口
4
- const {
5
- ForwardNodeGetable,
6
- MessageChainGetable
7
- } = require('./interface');
8
-
9
- class ForwardNode_Data {
10
- constructor({
11
- senderId,
12
- time,
13
- senderName,
14
- messageChain
15
- }) {
16
- this.senderId = senderId;
17
- this.time = time;
18
- this.senderName = senderName;
19
- this.messageChain = messageChain;
20
- }
21
-
22
- }
23
-
24
- class ForwardNode_Id {
25
- constructor({
26
- messageId
27
- }) {
28
- this.messageId = messageId;
29
- }
30
-
31
- }
32
- /**
33
- * @description 本框架抽象的消息节点
34
- */
35
-
36
-
37
- class ForwardNode extends ForwardNodeGetable {
38
- constructor() {
39
- super();
40
- this.nodeList = [];
41
- } // 手动添加节点
42
-
43
-
44
- addForwardNode(nodeList) {
45
- if (nodeList.messageChain instanceof MessageChainGetable) {
46
- nodeList.messageChain = nodeList.messageChain.getMessageChain();
47
- }
48
-
49
- this.nodeList.push(new ForwardNode_Data(nodeList));
50
- return this;
51
- } // 使用 messageId 添加节点
52
-
53
-
54
- addForwardNodeById(messageId) {
55
- this.nodeList.push(new ForwardNode_Id({
56
- messageId
57
- }));
58
- return this;
59
- } // get 原接口格式的信息链
60
-
61
-
62
- getForwardNode() {
63
- return this.nodeList;
64
- }
65
-
66
- }
67
-
68
- module.exports = {
69
- ForwardNode
70
- };
@@ -1,77 +0,0 @@
1
- "use strict";
2
-
3
- const {
4
- errCodeMap
5
- } = require('../util/errCode');
6
-
7
- const axios = require('axios').default;
8
-
9
- let URL;
10
-
11
- if (!process.browser) {
12
- ({
13
- URL
14
- } = require('url'));
15
- } else {
16
- URL = window.URL;
17
- }
18
-
19
- const errorHandler = require('../util/errorHandler');
20
-
21
- const path = require('path');
22
-
23
- const locationStr = `core.${path.basename(__filename, path.extname(__filename))}`;
24
- /**
25
- * @description 获取群文件详细信息
26
- * @param {string} baseUrl mirai-api-http server 的地址
27
- * @param {string} sessionKey 会话标识
28
- * @param {number} target 群号
29
- * @param {string} id 文件 id
30
- * @returns {Object}
31
- * 结构 {
32
- * id, name, path, length, downloadTimes, uploaderId,
33
- * uploadTime, lastModifyTime, downloadUrl, sha1, md5
34
- * }
35
- */
36
-
37
- module.exports = async ({
38
- baseUrl,
39
- sessionKey,
40
- target,
41
- id
42
- }) => {
43
- try {
44
- // 拼接 url
45
- const url = new URL('/groupFileInfo', baseUrl).toString(); // 请求
46
-
47
- const responseData = await axios.get(url, {
48
- params: {
49
- sessionKey,
50
- target,
51
- id
52
- }
53
- });
54
-
55
- try {
56
- var {
57
- data,
58
- data: {
59
- msg: message,
60
- code
61
- }
62
- } = responseData;
63
- } catch (error) {
64
- throw new Error('请求返回格式出错,请检查 mirai-console');
65
- } // 抛出 mirai 的异常,到 catch 中处理后再抛出
66
-
67
-
68
- if (code in errCodeMap) {
69
- throw new Error(message);
70
- }
71
-
72
- return data;
73
- } catch (error) {
74
- console.error(`mirai-js: error ${locationStr}`);
75
- errorHandler(error);
76
- }
77
- };