@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.
- package/config/comment/config.json +3 -0
- package/config/config/config.yaml +53 -0
- package/lib/cli/pr.d.ts +2 -0
- package/lib/cli/pr.js +73 -0
- package/lib/core/adapter/adapter.d.ts +91 -0
- package/lib/core/adapter/adapter.js +144 -0
- package/lib/core/adapter/handler.d.ts +49 -0
- package/lib/core/adapter/handler.js +140 -0
- package/lib/core/adapter/markdown.d.ts +38 -0
- package/lib/core/adapter/markdown.js +220 -0
- package/lib/core/adapter/normal.d.ts +30 -0
- package/lib/core/adapter/normal.js +263 -0
- package/lib/core/api/index.d.ts +167 -0
- package/lib/core/api/index.js +180 -0
- package/lib/core/api/sign.d.ts +22 -0
- package/lib/core/api/sign.js +40 -0
- package/lib/core/api/types.d.ts +236 -0
- package/lib/core/event/conver.d.ts +10 -0
- package/lib/core/event/conver.js +57 -0
- package/lib/core/event/index.d.ts +9 -0
- package/lib/core/event/index.js +98 -0
- package/lib/core/event/message.d.ts +27 -0
- package/lib/core/event/message.js +95 -0
- package/lib/core/event/notice.d.ts +50 -0
- package/lib/core/event/notice.js +133 -0
- package/lib/{types/event.d.ts → core/event/types.d.ts} +255 -14
- package/lib/core/internal/axios.d.ts +25 -0
- package/lib/core/internal/axios.js +46 -0
- package/lib/core/internal/sign.d.ts +22 -0
- package/lib/core/internal/sign.js +40 -0
- package/lib/core/webhook/c2c.d.ts +2 -0
- package/lib/core/webhook/c2c.js +14 -0
- package/lib/core/webhook/http.d.ts +2 -0
- package/lib/core/webhook/http.js +35 -0
- package/lib/core/webhook/index.d.ts +17 -0
- package/lib/core/webhook/index.js +87 -0
- package/lib/core/webhook/ws.d.ts +2 -0
- package/lib/core/webhook/ws.js +79 -0
- package/lib/index.d.ts +1 -3
- package/lib/index.js +5 -7
- package/lib/root.d.ts +5 -0
- package/lib/root.js +9 -0
- package/lib/types/config.d.ts +53 -0
- package/lib/utils/common.d.ts +75 -61
- package/lib/utils/common.js +190 -202
- package/lib/utils/config.d.ts +5 -130
- package/lib/utils/config.js +50 -172
- package/lib/utils/dir.d.ts +1 -5
- package/lib/utils/dir.js +1 -10
- package/lib/utils/index.d.ts +4 -3
- package/lib/utils/index.js +4 -3
- package/package.json +41 -23
- package/config/config.yaml +0 -69
- package/lib/core/api.d.ts +0 -180
- package/lib/core/api.js +0 -454
- package/lib/core/index.d.ts +0 -90
- package/lib/core/index.js +0 -349
- package/lib/core/intents.d.ts +0 -6
- package/lib/core/intents.js +0 -57
- package/lib/core/markdown.d.ts +0 -23
- package/lib/core/markdown.js +0 -265
- package/lib/types/index.d.ts +0 -3
- package/lib/types/index.js +0 -3
- package/lib/types/media.d.ts +0 -100
- package/lib/types/message.d.ts +0 -85
- /package/lib/{types/event.js → core/api/types.js} +0 -0
- /package/lib/{types/media.js → core/event/types.js} +0 -0
- /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
|
-
|
|
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
|
|
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
|
|
166
|
+
export interface BaseEvent {
|
|
145
167
|
/** opcode */
|
|
146
168
|
op: Opcode.Dispatch;
|
|
147
169
|
/** 序列号 */
|
|
148
170
|
s: number;
|
|
149
171
|
/** 事件类型 */
|
|
150
|
-
t:
|
|
172
|
+
t: EventEnum;
|
|
151
173
|
}
|
|
152
174
|
/**
|
|
153
175
|
* READY子事件
|
|
154
176
|
*/
|
|
155
|
-
export interface ReadyEvent extends
|
|
177
|
+
export interface ReadyEvent extends BaseEvent {
|
|
156
178
|
/** 事件类型 */
|
|
157
|
-
t:
|
|
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
|
|
198
|
+
export interface C2CMsgEvent extends BaseEvent {
|
|
177
199
|
/** 事件类型 */
|
|
178
|
-
t:
|
|
179
|
-
/**
|
|
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
|
|
224
|
+
export interface GroupMsgEvent extends BaseEvent {
|
|
203
225
|
/** 事件类型 */
|
|
204
|
-
t:
|
|
205
|
-
/**
|
|
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
|
|
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;
|