@karinjs/adapter-qqbot 1.2.9 → 1.2.10

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.
Files changed (68) hide show
  1. package/config/comment/config.json +3 -0
  2. package/config/config/config.yaml +53 -0
  3. package/lib/cli/pr.d.ts +2 -0
  4. package/lib/cli/pr.js +73 -0
  5. package/lib/core/adapter/adapter.d.ts +91 -0
  6. package/lib/core/adapter/adapter.js +144 -0
  7. package/lib/core/adapter/handler.d.ts +49 -0
  8. package/lib/core/adapter/handler.js +140 -0
  9. package/lib/core/adapter/markdown.d.ts +38 -0
  10. package/lib/core/adapter/markdown.js +220 -0
  11. package/lib/core/adapter/normal.d.ts +30 -0
  12. package/lib/core/adapter/normal.js +263 -0
  13. package/lib/core/api/index.d.ts +167 -0
  14. package/lib/core/api/index.js +180 -0
  15. package/lib/core/api/sign.d.ts +22 -0
  16. package/lib/core/api/sign.js +40 -0
  17. package/lib/core/api/types.d.ts +236 -0
  18. package/lib/core/event/conver.d.ts +10 -0
  19. package/lib/core/event/conver.js +57 -0
  20. package/lib/core/event/index.d.ts +9 -0
  21. package/lib/core/event/index.js +98 -0
  22. package/lib/core/event/message.d.ts +27 -0
  23. package/lib/core/event/message.js +95 -0
  24. package/lib/core/event/notice.d.ts +50 -0
  25. package/lib/core/event/notice.js +133 -0
  26. package/lib/{types/event.d.ts → core/event/types.d.ts} +255 -14
  27. package/lib/core/internal/axios.d.ts +25 -0
  28. package/lib/core/internal/axios.js +46 -0
  29. package/lib/core/internal/sign.d.ts +22 -0
  30. package/lib/core/internal/sign.js +40 -0
  31. package/lib/core/webhook/c2c.d.ts +2 -0
  32. package/lib/core/webhook/c2c.js +14 -0
  33. package/lib/core/webhook/http.d.ts +2 -0
  34. package/lib/core/webhook/http.js +35 -0
  35. package/lib/core/webhook/index.d.ts +17 -0
  36. package/lib/core/webhook/index.js +87 -0
  37. package/lib/core/webhook/ws.d.ts +2 -0
  38. package/lib/core/webhook/ws.js +79 -0
  39. package/lib/index.d.ts +1 -3
  40. package/lib/index.js +5 -7
  41. package/lib/root.d.ts +5 -0
  42. package/lib/root.js +9 -0
  43. package/lib/types/config.d.ts +53 -0
  44. package/lib/utils/common.d.ts +75 -61
  45. package/lib/utils/common.js +190 -202
  46. package/lib/utils/config.d.ts +5 -130
  47. package/lib/utils/config.js +50 -172
  48. package/lib/utils/dir.d.ts +1 -5
  49. package/lib/utils/dir.js +1 -10
  50. package/lib/utils/index.d.ts +4 -3
  51. package/lib/utils/index.js +4 -3
  52. package/package.json +41 -23
  53. package/config/config.yaml +0 -69
  54. package/lib/core/api.d.ts +0 -180
  55. package/lib/core/api.js +0 -454
  56. package/lib/core/index.d.ts +0 -90
  57. package/lib/core/index.js +0 -349
  58. package/lib/core/intents.d.ts +0 -6
  59. package/lib/core/intents.js +0 -57
  60. package/lib/core/markdown.d.ts +0 -23
  61. package/lib/core/markdown.js +0 -265
  62. package/lib/types/index.d.ts +0 -3
  63. package/lib/types/index.js +0 -3
  64. package/lib/types/media.d.ts +0 -100
  65. package/lib/types/message.d.ts +0 -85
  66. /package/lib/{types/event.js → core/api/types.js} +0 -0
  67. /package/lib/{types/media.js → core/event/types.js} +0 -0
  68. /package/lib/types/{message.js → config.js} +0 -0
@@ -0,0 +1,95 @@
1
+ import { QQBotConvertKarin } from './conver';
2
+ import { karin, createGroupMessage, createFriendMessage, segment, createGuildMessage, createDirectMessage } from 'node-karin';
3
+ /**
4
+ * 创建群消息事件
5
+ * @param client 机器人实例
6
+ * @param event 事件
7
+ */
8
+ export const onGroupMsg = (client, event) => {
9
+ const selfId = client.selfId;
10
+ const userId = event.d.author.member_openid;
11
+ const contact = karin.contactGroup(event.d.group_id);
12
+ const sender = karin.groupSender(userId, 'unknown');
13
+ const e = createGroupMessage({
14
+ bot: client,
15
+ elements: QQBotConvertKarin(selfId, event, client.selfSubId('id')),
16
+ eventId: event.id,
17
+ messageId: event.d.id,
18
+ messageSeq: 0,
19
+ rawEvent: event,
20
+ time: Number(event.d.timestamp),
21
+ contact,
22
+ sender,
23
+ srcReply: (elements) => client.srcReply(e, [...elements, segment.pasmsg(event.d.id)])
24
+ });
25
+ };
26
+ /**
27
+ * 创建好友消息事件
28
+ * @param client 机器人实例
29
+ * @param event 事件
30
+ */
31
+ export const onFriendMsg = (client, event) => {
32
+ const selfId = client.selfId;
33
+ const userId = event.d.author.user_openid;
34
+ const contact = karin.contactFriend(userId);
35
+ const sender = karin.friendSender(userId, '');
36
+ const e = createFriendMessage({
37
+ bot: client,
38
+ elements: QQBotConvertKarin(selfId, event, client.selfSubId('id')),
39
+ eventId: event.id,
40
+ messageId: event.d.id,
41
+ messageSeq: 0,
42
+ rawEvent: event,
43
+ time: Number(event.d.timestamp),
44
+ contact,
45
+ sender,
46
+ srcReply: (elements) => client.srcReply(e, [...elements, segment.pasmsg(event.d.id)])
47
+ });
48
+ };
49
+ /**
50
+ * 创建频道消息事件
51
+ * @param client 机器人实例
52
+ * @param event 事件
53
+ */
54
+ export const onChannelMsg = (client, event) => {
55
+ const selfId = client.selfId;
56
+ const userId = event.d.author.id;
57
+ const contact = karin.contact('guild', event.d.guild_id, event.d.channel_id);
58
+ const sender = karin.groupSender(userId, 'unknown', event.d.author.username);
59
+ const e = createGuildMessage({
60
+ bot: client,
61
+ elements: QQBotConvertKarin(selfId, event, client.selfSubId('id')),
62
+ eventId: event.id,
63
+ messageId: event.d.id,
64
+ messageSeq: 0,
65
+ rawEvent: event,
66
+ time: Number(event.d.timestamp),
67
+ contact,
68
+ sender,
69
+ srcReply: (elements) => client.srcReply(e, [...elements, segment.pasmsg(event.d.id)])
70
+ });
71
+ };
72
+ /**
73
+ * 创建频道私信事件
74
+ * @param client 机器人实例
75
+ * @param event 事件
76
+ */
77
+ export const onDirectMsg = (client, event) => {
78
+ const selfId = client.selfId;
79
+ const userId = event.d.author.id;
80
+ const contact = karin.contact('direct', event.d.guild_id, event.d.channel_id);
81
+ const sender = karin.friendSender(userId, event.d.author.username);
82
+ const e = createDirectMessage({
83
+ bot: client,
84
+ elements: QQBotConvertKarin(selfId, event, client.selfSubId('id')),
85
+ eventId: event.id,
86
+ messageId: event.d.id,
87
+ messageSeq: 0,
88
+ rawEvent: event,
89
+ time: Number(event.d.timestamp),
90
+ contact,
91
+ sender,
92
+ srcGuildId: event.d.src_guild_id,
93
+ srcReply: (elements) => client.srcReply(e, [...elements, segment.pasmsg(event.d.id)]),
94
+ });
95
+ };
@@ -0,0 +1,50 @@
1
+ import { AdapterQQBot } from '@/core/adapter/adapter';
2
+ import type { GroupAddRobotEvent, GroupDelRobotEvent, GroupMsgRejectEvent, GroupMsgReceiveEvent, FriendAddEvent, FriendDelEvent, C2CMsgRejectEvent, C2CMsgReceiveEvent } from './types';
3
+ /**
4
+ * 机器人加入群聊事件
5
+ * @param client 机器人实例
6
+ * @param event 事件
7
+ */
8
+ export declare const onGroupAddRobot: (client: AdapterQQBot, event: GroupAddRobotEvent) => void;
9
+ /**
10
+ * 机器人退出群聊事件
11
+ * @param client 机器人实例
12
+ * @param event 事件
13
+ */
14
+ export declare const onGroupDelRobot: (client: AdapterQQBot, event: GroupDelRobotEvent) => void;
15
+ /**
16
+ * 群聊接受机器人主动消息
17
+ * @param client 机器人实例
18
+ * @param event 事件
19
+ */
20
+ export declare const onGroupMsgReceive: (client: AdapterQQBot, event: GroupMsgReceiveEvent) => void;
21
+ /**
22
+ * 群聊拒绝机器人主动消息
23
+ * @param client 机器人实例
24
+ * @param event 事件
25
+ */
26
+ export declare const onGroupMsgReject: (client: AdapterQQBot, event: GroupMsgRejectEvent) => void;
27
+ /**
28
+ * 好友添加事件
29
+ * @param client 机器人实例
30
+ * @param event 事件
31
+ */
32
+ export declare const onFriendAdd: (client: AdapterQQBot, event: FriendAddEvent) => void;
33
+ /**
34
+ * 好友删除事件
35
+ * @param client 机器人实例
36
+ * @param event 事件
37
+ */
38
+ export declare const onFriendDel: (client: AdapterQQBot, event: FriendDelEvent) => void;
39
+ /**
40
+ * 好友接受机器人主动消息
41
+ * @param client 机器人实例
42
+ * @param event 事件
43
+ */
44
+ export declare const onC2CMsgReceive: (client: AdapterQQBot, event: C2CMsgReceiveEvent) => void;
45
+ /**
46
+ * 好友拒绝机器人主动消息
47
+ * @param client 机器人实例
48
+ * @param event 事件
49
+ */
50
+ export declare const onC2CMsgReject: (client: AdapterQQBot, event: C2CMsgRejectEvent) => void;
@@ -0,0 +1,133 @@
1
+ import { karin, segment, createGroupMemberAddNotice, createGroupMemberDelNotice, createFriendIncreaseNotice, createFriendDecreaseNotice } from 'node-karin';
2
+ /**
3
+ * 机器人加入群聊事件
4
+ * @param client 机器人实例
5
+ * @param event 事件
6
+ */
7
+ export const onGroupAddRobot = (client, event) => {
8
+ const selfId = client.selfId;
9
+ const userId = event.d.op_member_openid;
10
+ const groupId = event.d.group_openid;
11
+ const contact = karin.contactGroup(groupId);
12
+ const sender = karin.groupSender(userId, 'unknown');
13
+ const eventId = event.id;
14
+ const srcReply = (elements) => client.sendMsg(contact, [...elements, segment.pasmsg(eventId, 'event')]);
15
+ createGroupMemberAddNotice({
16
+ contact,
17
+ eventId,
18
+ sender,
19
+ srcReply,
20
+ bot: client,
21
+ rawEvent: event,
22
+ time: event.d.timestamp,
23
+ content: { operatorId: userId, targetId: selfId, type: 'invite' }
24
+ });
25
+ };
26
+ /**
27
+ * 机器人退出群聊事件
28
+ * @param client 机器人实例
29
+ * @param event 事件
30
+ */
31
+ export const onGroupDelRobot = (client, event) => {
32
+ const selfId = client.selfId;
33
+ const userId = event.d.op_member_openid;
34
+ const groupId = event.d.group_openid;
35
+ const contact = karin.contactGroup(groupId);
36
+ const sender = karin.groupSender(userId, 'unknown');
37
+ const eventId = event.id;
38
+ const srcReply = (elements) => client.sendMsg(contact, [...elements, segment.pasmsg(eventId, 'event')]);
39
+ createGroupMemberDelNotice({
40
+ contact,
41
+ eventId,
42
+ sender,
43
+ srcReply,
44
+ bot: client,
45
+ rawEvent: event,
46
+ time: event.d.timestamp,
47
+ content: { operatorId: userId, targetId: selfId, type: 'kick' }
48
+ });
49
+ };
50
+ /**
51
+ * 群聊接受机器人主动消息
52
+ * @param client 机器人实例
53
+ * @param event 事件
54
+ */
55
+ export const onGroupMsgReceive = (client, event) => {
56
+ const groupId = event.d.group_openid;
57
+ const userId = event.d.op_member_openid;
58
+ client.logger('mark', `群聊 ${groupId} 已允许机器人主动发送消息 操作人: ${userId}`);
59
+ };
60
+ /**
61
+ * 群聊拒绝机器人主动消息
62
+ * @param client 机器人实例
63
+ * @param event 事件
64
+ */
65
+ export const onGroupMsgReject = (client, event) => {
66
+ const groupId = event.d.group_openid;
67
+ const userId = event.d.op_member_openid;
68
+ client.logger('mark', `群聊 ${groupId} 已拒绝机器人主动发送消息 操作人: ${userId}`);
69
+ };
70
+ /**
71
+ * 好友添加事件
72
+ * @param client 机器人实例
73
+ * @param event 事件
74
+ */
75
+ export const onFriendAdd = (client, event) => {
76
+ const selfId = client.selfId;
77
+ const userId = event.d.openid;
78
+ const contact = karin.contactFriend(userId);
79
+ const sender = karin.friendSender(userId, '');
80
+ const eventId = event.id;
81
+ const srcReply = (elements) => client.sendMsg(contact, [...elements, segment.pasmsg(eventId, 'event')]);
82
+ createFriendIncreaseNotice({
83
+ contact,
84
+ eventId,
85
+ sender,
86
+ srcReply,
87
+ bot: client,
88
+ rawEvent: event,
89
+ time: event.d.timestamp,
90
+ content: { targetId: selfId }
91
+ });
92
+ };
93
+ /**
94
+ * 好友删除事件
95
+ * @param client 机器人实例
96
+ * @param event 事件
97
+ */
98
+ export const onFriendDel = (client, event) => {
99
+ const selfId = client.selfId;
100
+ const userId = event.d.openid;
101
+ const contact = karin.contactFriend(userId);
102
+ const sender = karin.friendSender(userId, '');
103
+ const eventId = event.id;
104
+ const srcReply = (elements) => client.sendMsg(contact, [...elements, segment.pasmsg(eventId, 'event')]);
105
+ createFriendDecreaseNotice({
106
+ contact,
107
+ eventId,
108
+ sender,
109
+ srcReply,
110
+ bot: client,
111
+ rawEvent: event,
112
+ time: event.d.timestamp,
113
+ content: { targetId: selfId }
114
+ });
115
+ };
116
+ /**
117
+ * 好友接受机器人主动消息
118
+ * @param client 机器人实例
119
+ * @param event 事件
120
+ */
121
+ export const onC2CMsgReceive = (client, event) => {
122
+ const userId = event.d.openid;
123
+ client.logger('mark', `好友 ${userId} 已允许机器人主动发送消息`);
124
+ };
125
+ /**
126
+ * 好友拒绝机器人主动消息
127
+ * @param client 机器人实例
128
+ * @param event 事件
129
+ */
130
+ export const onC2CMsgReject = (client, event) => {
131
+ const userId = event.d.openid;
132
+ client.logger('mark', `好友 ${userId} 已拒绝机器人主动发送消息`);
133
+ };
@@ -1,4 +1,26 @@
1
- import { Attachment } from './media.js';
1
+ /**
2
+ * 需要注意 目前只有私聊可以收到file类型的消息
3
+ */
4
+ export type Content_type = 'image/gif' | 'image/jpeg' | 'image/png' | 'file';
5
+ /**
6
+ * 富媒体基类
7
+ */
8
+ export interface Attachment {
9
+ /** 类型 */
10
+ content_type: Content_type;
11
+ /** 未知作用 */
12
+ content?: string;
13
+ /** 文件名 */
14
+ filename: string;
15
+ /** 图片高度 */
16
+ height?: number;
17
+ /** 图片宽度 */
18
+ width?: number;
19
+ /** 文件大小 */
20
+ size: number;
21
+ /** 文件url */
22
+ url: string;
23
+ }
2
24
  /**
3
25
  * opcode
4
26
  * 客户端操作含义如下:
@@ -48,7 +70,7 @@ export interface HeartbeatACKEvent {
48
70
  /**
49
71
  * 子事件类型
50
72
  */
51
- export declare const enum EventType {
73
+ export declare const enum EventEnum {
52
74
  /** 在鉴权成功后下发 代表建立连接成功 */
53
75
  READY = "READY",
54
76
  /** 恢复登录状态后 不发遗漏事件完毕下发 */
@@ -141,20 +163,20 @@ export declare const enum EventType {
141
163
  /**
142
164
  * 子事件基类
143
165
  */
144
- export interface Event {
166
+ export interface BaseEvent {
145
167
  /** opcode */
146
168
  op: Opcode.Dispatch;
147
169
  /** 序列号 */
148
170
  s: number;
149
171
  /** 事件类型 */
150
- t: EventType;
172
+ t: EventEnum;
151
173
  }
152
174
  /**
153
175
  * READY子事件
154
176
  */
155
- export interface ReadyEvent extends Event {
177
+ export interface ReadyEvent extends BaseEvent {
156
178
  /** 事件类型 */
157
- t: EventType.READY;
179
+ t: EventEnum.READY;
158
180
  /** 事件内容 */
159
181
  d: {
160
182
  version: number;
@@ -173,10 +195,10 @@ export interface ReadyEvent extends Event {
173
195
  /**
174
196
  * C2C_MESSAGE_CREATE子事件
175
197
  */
176
- export interface C2CMessageCreateEvent extends Event {
198
+ export interface C2CMsgEvent extends BaseEvent {
177
199
  /** 事件类型 */
178
- t: EventType.C2C_MESSAGE_CREATE;
179
- /** 平台方消息ID 格式: C2C_MESSAGE_CREATE:abc... */
200
+ t: EventEnum.C2C_MESSAGE_CREATE;
201
+ /** 平台方事件ID 格式: C2C_MESSAGE_CREATE:abc... */
180
202
  id: string;
181
203
  d: {
182
204
  /** 富媒体消息 */
@@ -199,10 +221,10 @@ export interface C2CMessageCreateEvent extends Event {
199
221
  /**
200
222
  * GROUP_AT_MESSAGE_CREATE子事件
201
223
  */
202
- export interface GroupAtMessageCreateEvent extends Event {
224
+ export interface GroupMsgEvent extends BaseEvent {
203
225
  /** 事件类型 */
204
- t: EventType.GROUP_AT_MESSAGE_CREATE;
205
- /** 平台方消息ID 格式: GROUP_AT_MESSAGE_CREATE:abc... */
226
+ t: EventEnum.GROUP_AT_MESSAGE_CREATE;
227
+ /** 平台方事件ID 格式: GROUP_AT_MESSAGE_CREATE:abc... */
206
228
  id: string;
207
229
  d: {
208
230
  /** 富媒体消息 */
@@ -227,6 +249,225 @@ export interface GroupAtMessageCreateEvent extends Event {
227
249
  };
228
250
  }
229
251
  /**
230
- * 所有子事件
252
+ * 频道的user信息
253
+ */
254
+ export interface GuildUser {
255
+ /** 发送者的头像url */
256
+ avatar: string;
257
+ /** 发送者是否为bot */
258
+ bot: boolean;
259
+ /** 发送者的id */
260
+ id: string;
261
+ /** 发送者的nickname */
262
+ username: string;
263
+ }
264
+ /** 基础消息事件 */
265
+ export interface BaseMessageEvent {
266
+ /** 消息ID message_id */
267
+ id: string;
268
+ /** 消息内容 */
269
+ content: string;
270
+ /** 富媒体消息 */
271
+ attachments?: Array<Attachment>;
272
+ /** 消息发送时间 */
273
+ timestamp: string;
274
+ }
275
+ /** Guild 消息的通用结构 */
276
+ export interface GuildMemberInfo {
277
+ /** 用户加入频道的时间 ISO8601 timestamp */
278
+ joined_at: string;
279
+ /** 用户在频道内的昵称 */
280
+ nick: string;
281
+ /** 用户在频道内的身份组ID */
282
+ roles: string[];
283
+ }
284
+ /** Guild 事件的公共部分 */
285
+ export interface GuildBaseEvent extends BaseMessageEvent {
286
+ /** 发送者信息 */
287
+ author: GuildUser;
288
+ /** 子频道id */
289
+ channel_id: string;
290
+ /** 频道id */
291
+ guild_id: string;
292
+ /** 用于消息间的排序 */
293
+ seq: number;
294
+ /** 子频道消息 seq */
295
+ seq_in_channel: number;
296
+ /** 消息创建者的member信息 */
297
+ member: GuildMemberInfo;
298
+ /** 引用消息对象 */
299
+ message_reference?: {
300
+ /** 引用回复的消息 id */
301
+ message_id: string;
302
+ /** 是否忽略获取引用消息详情错误,默认否 */
303
+ ignore_get_message_error: boolean;
304
+ };
305
+ /** 附件 */
306
+ attachments?: Attachment[];
307
+ }
308
+ /**
309
+ * 频道文字子频道消息
310
+ */
311
+ export interface GuildMsgEvent extends BaseEvent {
312
+ /** 事件类型 */
313
+ t: EventEnum.MESSAGE_CREATE | EventEnum.AT_MESSAGE_CREATE;
314
+ /** 平台方事件ID */
315
+ id: string;
316
+ /** 事件内容 */
317
+ d: GuildBaseEvent & {
318
+ /** 消息中at的人 */
319
+ mentions: [GuildUser];
320
+ /** 是否at all */
321
+ mention_everyone?: boolean;
322
+ };
323
+ }
324
+ /**
325
+ * 频道私信消息
326
+ */
327
+ export interface DirectMsgEvent extends BaseEvent {
328
+ /** 事件类型 */
329
+ t: EventEnum.DIRECT_MESSAGE_CREATE;
330
+ /** 平台方事件ID */
331
+ id: string;
332
+ /** 事件内容 */
333
+ d: GuildBaseEvent & {
334
+ /** 是否为私信 */
335
+ direct_message: boolean;
336
+ /** 消息来源的频道id */
337
+ src_guild_id: string;
338
+ /** 未知字段 */
339
+ seq_in_channel: string;
340
+ };
341
+ }
342
+ /**
343
+ * 机器人加入群聊事件
344
+ */
345
+ export interface GroupAddRobotEvent extends BaseEvent {
346
+ t: EventEnum.GROUP_ADD_ROBOT;
347
+ op: 0;
348
+ /** 平台方消息ID */
349
+ id: string;
350
+ d: {
351
+ /** 加入的时间戳 */
352
+ timestamp: number;
353
+ /** 加入群的群openid */
354
+ group_openid: string;
355
+ /** 操作添加机器人进群的群成员openid */
356
+ op_member_openid: '0337369D1F67F72EA9EEB6287B600488';
357
+ };
358
+ }
359
+ /**
360
+ * 机器人被移出群聊事件
361
+ */
362
+ export interface GroupDelRobotEvent extends BaseEvent {
363
+ t: EventEnum.GROUP_DEL_ROBOT;
364
+ op: 0;
365
+ /** 平台方消息ID */
366
+ id: string;
367
+ d: {
368
+ /** 移出的时间戳 */
369
+ timestamp: number;
370
+ /** 移出群的群openid */
371
+ group_openid: string;
372
+ /** 操作移出机器人的群成员openid */
373
+ op_member_openid: '0337369D1F67F72EA9EEB6287B600488';
374
+ };
375
+ }
376
+ /**
377
+ * 群聊拒绝机器人主动消息
378
+ */
379
+ export interface GroupMsgRejectEvent extends BaseEvent {
380
+ t: EventEnum.GROUP_MSG_REJECT;
381
+ op: 0;
382
+ /** 平台方消息ID */
383
+ id: string;
384
+ d: {
385
+ /** 操作时间戳 */
386
+ timestamp: number;
387
+ /** 操作群的群openid */
388
+ group_openid: string;
389
+ /** 操作拒绝机器人主动消息的群成员openid */
390
+ op_member_openid: '0337369D1F67F72EA9EEB6287B600488';
391
+ };
392
+ }
393
+ /**
394
+ * 群聊接受机器人主动消息
395
+ */
396
+ export interface GroupMsgReceiveEvent extends BaseEvent {
397
+ t: EventEnum.GROUP_MSG_RECEIVE;
398
+ op: 0;
399
+ /** 平台方消息ID */
400
+ id: string;
401
+ d: {
402
+ /** 操作时间戳 */
403
+ timestamp: number;
404
+ /** 操作群的群openid */
405
+ group_openid: string;
406
+ /** 操作接受机器人主动消息的群成员openid */
407
+ op_member_openid: '0337369D1F67F72EA9EEB6287B600488';
408
+ };
409
+ }
410
+ /**
411
+ * 用户添加机器人事件
412
+ */
413
+ export interface FriendAddEvent extends BaseEvent {
414
+ t: EventEnum.FRIEND_ADD;
415
+ op: 0;
416
+ /** 平台方消息ID */
417
+ id: string;
418
+ d: {
419
+ /** 添加时间戳 */
420
+ timestamp: number;
421
+ /** 添加机器人的用户openid */
422
+ openid: string;
423
+ };
424
+ }
425
+ /**
426
+ * 用户删除机器人事件
427
+ */
428
+ export interface FriendDelEvent extends BaseEvent {
429
+ t: EventEnum.FRIEND_DEL;
430
+ op: 0;
431
+ /** 平台方消息ID */
432
+ id: string;
433
+ d: {
434
+ /** 删除时间戳 */
435
+ timestamp: number;
436
+ /** 删除机器人的用户openid */
437
+ openid: string;
438
+ };
439
+ }
440
+ /**
441
+ * 用户在机器人资料卡手动关闭"主动消息"推送
442
+ */
443
+ export interface C2CMsgRejectEvent extends BaseEvent {
444
+ t: EventEnum.C2C_MSG_REJECT;
445
+ op: 0;
446
+ /** 平台方消息ID */
447
+ id: string;
448
+ d: {
449
+ /** 操作时间戳 */
450
+ timestamp: number;
451
+ /** 操作关闭主动消息推送的用户openid */
452
+ openid: string;
453
+ };
454
+ }
455
+ /**
456
+ * 用户在机器人资料卡手动开启"主动消息"推送开关
457
+ */
458
+ export interface C2CMsgReceiveEvent extends BaseEvent {
459
+ t: EventEnum.C2C_MSG_RECEIVE;
460
+ op: 0;
461
+ /** 平台方消息ID */
462
+ id: string;
463
+ d: {
464
+ /** 操作时间戳 */
465
+ timestamp: number;
466
+ /** 操作开启主动消息推送的用户openid */
467
+ openid: string;
468
+ };
469
+ }
470
+ /**
471
+ * 所有事件
231
472
  */
232
- export type SubEvent = ReadyEvent | C2CMessageCreateEvent | GroupAtMessageCreateEvent;
473
+ export type Event = ReadyEvent | C2CMsgEvent | GroupMsgEvent | GuildMsgEvent | DirectMsgEvent | GroupAddRobotEvent | GroupDelRobotEvent | GroupMsgRejectEvent | GroupMsgReceiveEvent | FriendAddEvent | FriendDelEvent | C2CMsgRejectEvent | C2CMsgReceiveEvent;
@@ -0,0 +1,25 @@
1
+ /** 获取调用凭证返回类型 */
2
+ export interface AccessTokenResponse {
3
+ /** 获取到的凭证 */
4
+ accessToken: string;
5
+ /** 凭证有效时间,单位:秒。目前是7200秒之内的值。 */
6
+ expiresIn: number;
7
+ }
8
+ /**
9
+ * @description 获取调用凭证
10
+ * @param url 请求地址
11
+ * @param appId 机器人ID
12
+ * @param secret 机器人密钥
13
+ * @returns 获取到的凭证
14
+ * @throws 获取调用凭证失败
15
+ */
16
+ export declare const getAccessToken: (url: string, appId: string, secret: string) => Promise<{
17
+ accessToken: any;
18
+ expiresIn: any;
19
+ }>;
20
+ /**
21
+ * @description 创建axios实例
22
+ * @param url 请求地址
23
+ * @param appId 机器人ID
24
+ */
25
+ export declare const createAxiosInstance: (url: string, appId: string) => import("axios").AxiosInstance;
@@ -0,0 +1,46 @@
1
+ import axios from 'node-karin/axios';
2
+ /** 存储Bot对应的鉴权凭证 */
3
+ const BotMap = new Map();
4
+ /**
5
+ * @description 获取调用凭证
6
+ * @param url 请求地址
7
+ * @param appId 机器人ID
8
+ * @param secret 机器人密钥
9
+ * @returns 获取到的凭证
10
+ * @throws 获取调用凭证失败
11
+ */
12
+ export const getAccessToken = async (url, appId, secret) => {
13
+ const response = await axios.post(url, {
14
+ appId: String(appId),
15
+ clientSecret: secret,
16
+ });
17
+ const { access_token: accessToken, expires_in: expiresIn } = response.data;
18
+ if (!accessToken || !expiresIn) {
19
+ throw new Error(`获取调用凭证失败: ${JSON.stringify(response.data)}`);
20
+ }
21
+ BotMap.set(appId, accessToken);
22
+ /** 剩下1分钟开始刷新 */
23
+ setTimeout(() => {
24
+ getAccessToken(url, appId, secret);
25
+ }, Number(expiresIn) * 1000 - 50000);
26
+ return { accessToken, expiresIn };
27
+ };
28
+ /**
29
+ * @description 创建axios实例
30
+ * @param url 请求地址
31
+ * @param appId 机器人ID
32
+ */
33
+ export const createAxiosInstance = (url, appId) => {
34
+ const instance = axios.create({
35
+ baseURL: url,
36
+ headers: {
37
+ 'Content-Type': 'application/json',
38
+ },
39
+ timeout: 5500,
40
+ });
41
+ instance.interceptors.request.use((config) => {
42
+ config.headers.Authorization = `QQBot ${BotMap.get(appId)}`;
43
+ return config;
44
+ });
45
+ return instance;
46
+ };
@@ -0,0 +1,22 @@
1
+ import nacl from 'tweetnacl';
2
+ /**
3
+ * 从提供的种子生成密钥对
4
+ * @param seed 用于生成密钥的种子
5
+ */
6
+ export declare const generateKeyPair: (seed: string) => nacl.SignKeyPair;
7
+ /**
8
+ * 使用提供的私钥、事件时间戳和明文令牌对消息进行签名
9
+ * @param privateKey 用于签名的私钥
10
+ * @param eventTs 计算签名使用时间戳
11
+ * @param plainToken 需要计算签名的字符串
12
+ * @returns 生成的十六进制格式的签名
13
+ */
14
+ export declare const signMessage: (privateKey: Uint8Array, eventTs: string, plainToken: string) => string;
15
+ /**
16
+ * 签名
17
+ * @param secret 机器人密钥
18
+ * @param eventTs 计算签名使用时间戳
19
+ * @param plainToken 需要计算签名的字符串
20
+ * @returns 生成的十六进制格式的签名
21
+ */
22
+ export declare const sign: (secret: string, eventTs: string, plainToken: string) => string;