@karinjs/adapter-qqbot 1.3.1 → 2.1.0
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/README.md +105 -802
- package/dist/apps/cleanup.d.ts +5 -0
- package/dist/apps/cleanup.js +22 -0
- package/dist/apps/login.d.ts +18 -0
- package/dist/apps/login.js +106 -0
- package/dist/common-by1GpV0b.js +49 -0
- package/dist/config-DKa7596f.js +170 -0
- package/dist/index.d.ts +1060 -418
- package/dist/index.js +4742 -97
- package/dist/message-O73AeL_P.js +1739 -0
- package/dist/onboard-DPWgX39H.js +252 -0
- package/dist/utils-BPbnNAix.js +4 -0
- package/dist/web.config.d.ts +21 -24
- package/dist/web.config.js +186 -221
- package/package.json +19 -18
- package/dist/chunk-PYOUSZ6B.js +0 -1501
package/dist/index.d.ts
CHANGED
|
@@ -1,499 +1,1141 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { karinToQQBot, AdapterBase, LogMethodNames, Contact, ButtonElement, KeyboardElement, MarkdownElement, MarkdownTplElement, SendMsgResults } from 'node-karin';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @description 创建axios实例
|
|
7
|
-
* @param url 请求地址
|
|
8
|
-
* @param appId 机器人ID
|
|
9
|
-
*/
|
|
10
|
-
declare const createAxiosInstance: (url: string, appId: string) => axios.AxiosInstance;
|
|
1
|
+
import { AdapterBase, AdapterType, Contact, CreateGroupFolderResponse, DownloadFileOptions, DownloadFileResponse, ElementTypes, ForwardOptions, GetAiCharactersResponse, GetAtAllCountResponse, GetGroupFileListResponse, GetGroupFileSystemInfoResponse, GetGroupHighlightsResponse, GetGroupMuteListResponse, GetRkeyResponse, GroupInfo, GroupMemberInfo, LogMethodNames, Message, MessageResponse, NodeElement, QQGroupHonorInfo, SendMsgResults, Sender, UserInfo, karinToQQBot } from "node-karin";
|
|
2
|
+
import FormData from "form-data";
|
|
11
3
|
|
|
4
|
+
//#region src/core/api/types.d.ts
|
|
12
5
|
/** 上传富媒体文件场景 */
|
|
13
6
|
type Scene = 'user' | 'group';
|
|
14
7
|
/** 上传富媒体文件类型 */
|
|
15
8
|
type MediaType = 'image' | 'video' | 'record' | 'file';
|
|
16
9
|
/** 发送QQ消息请求参数基类 */
|
|
17
10
|
interface SendQQMessageRequest {
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
/** 消息类型:0 是文本,2 是 markdown, 3 ark,4 embed,7 media 富媒体 */
|
|
12
|
+
msg_type: 0 | 2 | 3 | 4 | 7;
|
|
13
|
+
}
|
|
14
|
+
/** 消息引用对象 */
|
|
15
|
+
interface MessageReference {
|
|
16
|
+
/** 需要引用回复的消息 id */
|
|
17
|
+
message_id: string;
|
|
18
|
+
/** 是否忽略获取引用消息详情错误,默认否 */
|
|
19
|
+
ignore_get_message_error?: boolean;
|
|
20
20
|
}
|
|
21
21
|
/** 发送QQ被动消息参数 */
|
|
22
22
|
interface QQMessageID {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
/** 前置收到的事件 ID,用于发送被动消息,支持事件:"INTERACTION_CREATE"、"C2C_MSG_RECEIVE"、"FRIEND_ADD" */
|
|
24
|
+
event_id?: string;
|
|
25
|
+
/** 前置收到的用户发送过来的消息 ID,用于发送被动(回复)消息 */
|
|
26
|
+
msg_id?: string;
|
|
27
|
+
/** 回复消息的序号,与 msg_id 联合使用,避免相同消息id回复重复发送,不填默认是1。相同的 msg_id + msg_seq 重复发送会失败。 */
|
|
28
|
+
msg_seq?: number;
|
|
29
|
+
/** 指明发送消息为互动召回消息,与 msg_id,event_id 互斥使用 */
|
|
30
|
+
is_wakeup?: boolean;
|
|
31
|
+
/** 引用消息对象,QQ单聊和群聊场景均支持 */
|
|
32
|
+
message_reference?: MessageReference;
|
|
29
33
|
}
|
|
30
34
|
/** 发送QQ文本消息请求参数 */
|
|
31
35
|
interface SendQQTextMessageRequest extends SendQQMessageRequest, QQMessageID {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
/** markdown
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}[];
|
|
52
|
-
};
|
|
53
|
-
/** 按钮消息结构 */
|
|
54
|
-
type Keyboard = {
|
|
55
|
-
content: {
|
|
56
|
-
rows: ReturnType<typeof karinToQQBot>;
|
|
57
|
-
};
|
|
58
|
-
} | {
|
|
59
|
-
/** 按钮模版id */
|
|
60
|
-
id: string;
|
|
61
|
-
};
|
|
36
|
+
msg_type: 0;
|
|
37
|
+
/**
|
|
38
|
+
* 消息内容 支持如下内嵌格式
|
|
39
|
+
* - `<qqbot-at-user id="" />` `@用户` **注意双引号不能省略**
|
|
40
|
+
* - `<qqbot-at-everyone />` `@所有人`
|
|
41
|
+
*/
|
|
42
|
+
content: string;
|
|
43
|
+
}
|
|
44
|
+
/** markdown 消息结构(官方已全量开放原生 markdown,2.0 不再支持模板模式) */
|
|
45
|
+
interface Markdown {
|
|
46
|
+
/** markdown 文本 */
|
|
47
|
+
content: string;
|
|
48
|
+
}
|
|
49
|
+
/** 按钮消息结构(官方已全量开放自定义 keyboard,2.0 不再支持模板按钮) */
|
|
50
|
+
interface Keyboard {
|
|
51
|
+
content: {
|
|
52
|
+
rows: ReturnType<typeof karinToQQBot>;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
62
55
|
/** 发送QQ Markdown 消息请求参数 */
|
|
63
56
|
interface SendQQMarkdownMessageRequest extends SendQQMessageRequest, QQMessageID {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
57
|
+
msg_type: 2;
|
|
58
|
+
/**
|
|
59
|
+
* markdown 消息内容 支持如下内嵌格式
|
|
60
|
+
* - `<qqbot-cmd-enter text="xxx" />` `回车按钮: 点击后,文本直接发送`
|
|
61
|
+
* - `<qqbot-cmd-input text="xxx" show="xxx" reference="false" />` `点击后,文本输入框弹出`
|
|
62
|
+
* - `text 用户点击后插入输入框的文本,参数必填,最大限制 100 字符,传值时需要 urlencode`
|
|
63
|
+
* - `show 用户在消息内看到的文本,参数选填,默认取 text 值,最大限制 100 字符,传值时需要 urlencode。`
|
|
64
|
+
* - `reference 插入输入框时是否带消息原文回复引用,参数选填,默认为 false,填入 true 时则带引用回复到输入框中。`
|
|
65
|
+
*
|
|
66
|
+
* {@link https://bot.q.qq.com/wiki/develop/api-v2/server-inter/message/trans/text-chain.html}
|
|
67
|
+
*/
|
|
68
|
+
markdown: Markdown;
|
|
69
|
+
/** 按钮 */
|
|
70
|
+
keyboard?: Keyboard;
|
|
78
71
|
}
|
|
79
72
|
/** 发送QQ Ark 消息请求参数 */
|
|
80
73
|
interface SendQQArkMessageRequest extends SendQQMessageRequest, QQMessageID {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
kv: any[];
|
|
88
|
-
};
|
|
74
|
+
msg_type: 3;
|
|
75
|
+
/** ark 消息内容 */
|
|
76
|
+
ark: {
|
|
77
|
+
/** ark 模版id */template_id: number; /** 模版内变量与填充值的kv映射 tips: 未经测试 先any */
|
|
78
|
+
kv: any[];
|
|
79
|
+
};
|
|
89
80
|
}
|
|
90
81
|
/** 发送QQ Embed 消息请求参数 文档没看到发送接口 */
|
|
91
82
|
/** 发送QQ Media 消息请求参数 */
|
|
92
83
|
interface SendQQMediaMessageRequest extends SendQQMessageRequest, QQMessageID {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
};
|
|
99
|
-
/** 当 msg_type = 7 时,content 字段需要填入一个值,譬如一个空格 “ ”,后续版本会修复该问题。 */
|
|
100
|
-
content: string;
|
|
84
|
+
msg_type: 7;
|
|
85
|
+
/** media 消息内容 */
|
|
86
|
+
media: {
|
|
87
|
+
/** 文件信息,用于发消息接口的 media 字段使用 */file_info: string;
|
|
88
|
+
};
|
|
101
89
|
}
|
|
102
90
|
/** 发送QQ消息请求参数 */
|
|
103
91
|
type SendQQMsg = SendQQTextMessageRequest | SendQQMarkdownMessageRequest | SendQQArkMessageRequest | SendQQMediaMessageRequest;
|
|
104
92
|
/** 发送频道被动消息参数 */
|
|
105
93
|
interface SendGuildMessageID {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
94
|
+
/** 消息ID */
|
|
95
|
+
msg_id?: string;
|
|
96
|
+
/** 事件id */
|
|
97
|
+
event_id?: string;
|
|
98
|
+
/** 引用消息对象 */
|
|
99
|
+
message_reference?: MessageReference;
|
|
110
100
|
}
|
|
111
101
|
/** 发送频道引用消息参数 */
|
|
112
102
|
interface SendGuildQuoteMessage {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
103
|
+
/** 引用消息的ID */
|
|
104
|
+
message_id?: string;
|
|
105
|
+
/** 是否忽略获取引用消息详情错误,默认否 */
|
|
106
|
+
ignore_get_message_error?: boolean;
|
|
117
107
|
}
|
|
118
108
|
/** 发送频道消息请求参数基类 */
|
|
119
109
|
interface SendGuildMessageRequest {
|
|
120
|
-
|
|
121
|
-
|
|
110
|
+
/** 单独加一个类型 用于区分不同的消息类型 */
|
|
111
|
+
type: 'text' | 'image' | 'embed' | 'ark' | 'markdown';
|
|
122
112
|
}
|
|
123
113
|
/** 发送频道 文本 消息请求参数 */
|
|
124
114
|
interface SendGuildTextMessageRequest extends SendGuildMessageID, SendGuildQuoteMessage, SendGuildMessageRequest {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
115
|
+
type: 'text';
|
|
116
|
+
/**
|
|
117
|
+
* 消息内容 支持如下内嵌格式
|
|
118
|
+
* - `<@user_id>` `@用户`
|
|
119
|
+
* - `@everyone` `@所有人`
|
|
120
|
+
* - `<#channel_id>` `#子频道`
|
|
121
|
+
* - `<emoji:id>` `表情`
|
|
122
|
+
*/
|
|
123
|
+
content: string;
|
|
124
|
+
/** 图片url地址 */
|
|
125
|
+
image?: string;
|
|
136
126
|
}
|
|
137
127
|
/** 发送频道 图片 消息请求参数 */
|
|
138
128
|
interface SendGuildImageMessageRequest extends SendGuildMessageID, SendGuildQuoteMessage, SendGuildMessageRequest {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
129
|
+
type: 'image';
|
|
130
|
+
/** 图片url地址 */
|
|
131
|
+
image: string;
|
|
142
132
|
}
|
|
143
133
|
/** embeds消息结构 */
|
|
144
134
|
interface Embeds {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
fields: Record<string, any>[];
|
|
135
|
+
/** 标题 */
|
|
136
|
+
title: string;
|
|
137
|
+
/** 消息弹窗内容 */
|
|
138
|
+
prompt: string;
|
|
139
|
+
/** 缩略图 */
|
|
140
|
+
thumbnail: {
|
|
141
|
+
/** 图片地址 */url: string;
|
|
142
|
+
};
|
|
143
|
+
/** embed 字段数据 */
|
|
144
|
+
fields: Record<string, any>[];
|
|
156
145
|
}
|
|
157
146
|
/** 发送频道 embed 消息请求参数 */
|
|
158
147
|
interface SendGuildEmbedMessageRequest extends SendGuildMessageID, SendGuildMessageRequest {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
148
|
+
type: 'embed';
|
|
149
|
+
/** embed 消息内容 */
|
|
150
|
+
embed: Embeds;
|
|
162
151
|
}
|
|
163
152
|
/** ark消息结构 */
|
|
164
153
|
interface Ark {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
154
|
+
/** 模版id */
|
|
155
|
+
template_id: number;
|
|
156
|
+
/** 模版内变量与填充值的kv映射 */
|
|
157
|
+
kv: {
|
|
158
|
+
key: string;
|
|
159
|
+
value: string; /** 这个嵌套是认真的嘛... */
|
|
160
|
+
obj: {
|
|
161
|
+
obj_kv: {
|
|
169
162
|
key: string;
|
|
170
163
|
value: string;
|
|
171
|
-
|
|
172
|
-
obj: {
|
|
173
|
-
obj_kv: {
|
|
174
|
-
key: string;
|
|
175
|
-
value: string;
|
|
176
|
-
}[];
|
|
177
|
-
}[];
|
|
164
|
+
}[];
|
|
178
165
|
}[];
|
|
166
|
+
}[];
|
|
179
167
|
}
|
|
180
168
|
/** 发送频道 ark 消息请求参数 */
|
|
181
169
|
interface SendGuildArkMessageRequest extends SendGuildMessageID, SendGuildMessageRequest {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
170
|
+
type: 'ark';
|
|
171
|
+
/** ark 消息内容 */
|
|
172
|
+
ark: Ark;
|
|
185
173
|
}
|
|
186
174
|
/** 发送频道 markdown 消息请求参数 */
|
|
187
175
|
interface SendGuildMarkdownMessageRequest extends SendGuildMessageID, SendGuildMessageRequest {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
176
|
+
type: 'markdown';
|
|
177
|
+
/** markdown 消息内容 */
|
|
178
|
+
markdown: Markdown;
|
|
179
|
+
/** 按钮 */
|
|
180
|
+
keyboard?: Keyboard;
|
|
193
181
|
}
|
|
194
182
|
/** 发送频道消息请求参数 */
|
|
195
183
|
type SendGuildMsg = SendGuildTextMessageRequest | SendGuildImageMessageRequest | SendGuildEmbedMessageRequest | SendGuildArkMessageRequest | SendGuildMarkdownMessageRequest;
|
|
196
184
|
/** 获取当前机器人详情接口响应 */
|
|
197
185
|
interface GetMeResponse {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
186
|
+
/** 机器人的频道ID */
|
|
187
|
+
id: string;
|
|
188
|
+
/** 机器人的昵称 */
|
|
189
|
+
username: string;
|
|
190
|
+
/** 用户头像 */
|
|
191
|
+
avatar: string;
|
|
192
|
+
/** 特殊关联应用的 openid */
|
|
193
|
+
union_openid: string;
|
|
194
|
+
/** 机器人关联的互联应用的用户信息 */
|
|
195
|
+
union_user_account: string;
|
|
196
|
+
/** 机器人的分享url */
|
|
197
|
+
share_url: string;
|
|
198
|
+
/** 机器人介绍 */
|
|
199
|
+
welcome_msg: string;
|
|
212
200
|
}
|
|
213
201
|
/** 创建私信会话接口响应 */
|
|
214
202
|
interface DmsResponse {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
203
|
+
/** 频道ID 用于私信会话使用 */
|
|
204
|
+
guild_id: string;
|
|
205
|
+
/** 子频道ID 用于私信会话使用 */
|
|
206
|
+
channel_id: string;
|
|
207
|
+
/** 创建时间 */
|
|
208
|
+
create_time: string;
|
|
221
209
|
}
|
|
222
210
|
/** 发送QQ消息后响应 */
|
|
223
211
|
interface SendQQMsgResponse {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
212
|
+
/** 消息唯一 ID */
|
|
213
|
+
id: string;
|
|
214
|
+
/** 发送时间 */
|
|
215
|
+
timestamp: number | string;
|
|
216
|
+
/** 扩展信息;部分 QQ 消息发送响应会返回可用于 message_reference 的 REFIDX。 */
|
|
217
|
+
ext_info?: {
|
|
218
|
+
/** 当前发送消息可被引用时使用的索引。 */ref_idx?: string;
|
|
219
|
+
};
|
|
228
220
|
}
|
|
229
221
|
/** 发送频道消息后响应 */
|
|
230
222
|
interface SendGuildResponse {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
223
|
+
/** 消息唯一 ID */
|
|
224
|
+
id: string;
|
|
225
|
+
/** 发送时间 ISO8601 timestamp */
|
|
226
|
+
timestamp: string;
|
|
235
227
|
}
|
|
236
228
|
/** 上传富媒体文件响应 */
|
|
237
229
|
interface UploadMediaResponse {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
230
|
+
/** 文件 ID */
|
|
231
|
+
file_uuid: string;
|
|
232
|
+
/** 文件信息,用于发消息接口的 media 字段使用 */
|
|
233
|
+
file_info: string;
|
|
234
|
+
/** 有效期,表示剩余多少秒到期,到期后 file_info 失效,当等于 0 时,表示可长期使用 */
|
|
235
|
+
ttl: number;
|
|
236
|
+
/** 发送消息的唯一ID,当srv_send_msg设置为true时返回 */
|
|
237
|
+
id: string;
|
|
246
238
|
}
|
|
247
|
-
|
|
239
|
+
//#endregion
|
|
240
|
+
//#region src/core/internal/axios.d.ts
|
|
241
|
+
/**
|
|
242
|
+
* 创建 axios 实例,自动从 tokens map 取最新 access_token
|
|
243
|
+
*/
|
|
244
|
+
declare const createAxiosInstance: (baseURL: string, appId: string) => import("node-karin/axios").AxiosInstance;
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region src/core/api/http.d.ts
|
|
247
|
+
type AxiosInstance = ReturnType<typeof createAxiosInstance>;
|
|
248
|
+
/**
|
|
249
|
+
* Http 基础类,子模块继承此类共享 axios 实例与错误格式化
|
|
250
|
+
*/
|
|
251
|
+
declare class Http {
|
|
252
|
+
readonly axios: AxiosInstance;
|
|
253
|
+
constructor(axios: AxiosInstance);
|
|
254
|
+
protected get<T>(path: string): Promise<T>;
|
|
255
|
+
protected post<T>(path: string, body?: unknown, headers?: Record<string, string>, timeout?: number): Promise<T>;
|
|
256
|
+
protected put<T>(path: string, body?: unknown, headers?: Record<string, string>, timeout?: number): Promise<T>;
|
|
257
|
+
protected delete<T>(path: string): Promise<T>;
|
|
258
|
+
}
|
|
259
|
+
//#endregion
|
|
260
|
+
//#region src/core/api/messages.d.ts
|
|
261
|
+
/**
|
|
262
|
+
* 消息发送 + 撤回
|
|
263
|
+
*/
|
|
264
|
+
declare class MessagesApi extends Http {
|
|
265
|
+
/** 单聊消息 */
|
|
266
|
+
sendFriendMsg(openid: string, body: SendQQMsg): Promise<SendQQMsgResponse>;
|
|
267
|
+
/** 群聊消息 */
|
|
268
|
+
sendGroupMsg(groupOpenid: string, body: SendQQMsg): Promise<SendQQMsgResponse>;
|
|
269
|
+
/** 文字子频道消息 */
|
|
270
|
+
sendChannelMsg(channelId: string, body: SendGuildMsg | FormData): Promise<SendGuildResponse>;
|
|
271
|
+
/**
|
|
272
|
+
* 频道私信消息
|
|
273
|
+
* - 单参 (guildId, body):guildId 已知
|
|
274
|
+
* - 双参 (recipientId, srcGuildId, body):先创建会话再发送
|
|
275
|
+
*/
|
|
276
|
+
sendDmsMsg(guildId: string, body: SendGuildMsg | FormData): Promise<SendGuildResponse>;
|
|
277
|
+
sendDmsMsg(recipientId: string, srcGuildId: string, body: SendGuildMsg | FormData): Promise<SendGuildResponse>;
|
|
278
|
+
/**
|
|
279
|
+
* 撤回消息
|
|
280
|
+
* - 'user' / 'group' 对应 QQ 单聊 / 群聊
|
|
281
|
+
* - 'channels' / 'dms' 对应频道 / 频道私信,支持 hidetip
|
|
282
|
+
*/
|
|
283
|
+
recall(type: 'user' | 'group', peer: string, messageId: string): Promise<true>;
|
|
284
|
+
recall(type: 'channels' | 'dms', peer: string, messageId: string, hidetip?: boolean): Promise<true>;
|
|
285
|
+
}
|
|
286
|
+
//#endregion
|
|
287
|
+
//#region src/core/api/media.d.ts
|
|
288
|
+
/**
|
|
289
|
+
* 富媒体上传
|
|
290
|
+
*/
|
|
291
|
+
declare class MediaApi extends Http {
|
|
292
|
+
/**
|
|
293
|
+
* @param scene user(单聊) / group(群聊)
|
|
294
|
+
* @param peer openid 或 group_openid
|
|
295
|
+
* @param type 文件类型
|
|
296
|
+
* @param source http url、本地路径或 base64 字符串
|
|
297
|
+
* @param srvSendMsg 上传后是否由服务端直接发送
|
|
298
|
+
* @param fileName 文件消息的展示文件名
|
|
299
|
+
*/
|
|
300
|
+
upload(scene: Scene, peer: string, type: MediaType, source: string, srvSendMsg?: boolean, fileName?: string): Promise<UploadMediaResponse>;
|
|
301
|
+
/**
|
|
302
|
+
* 上传没有公网 URL 处理器可用时的 fallback 富媒体资源。
|
|
303
|
+
*
|
|
304
|
+
* 较大的 fallback 资源会优先使用 QQ 分片上传,提高直接发送成功率。
|
|
305
|
+
* `srvSendMsg` 为 true 时保留普通上传路径,避免分片完成接口与服务端直接发送语义冲突。
|
|
306
|
+
*
|
|
307
|
+
* @param scene user(单聊) / group(群聊)
|
|
308
|
+
* @param peer openid 或 group_openid
|
|
309
|
+
* @param type 文件类型
|
|
310
|
+
* @param source 本地路径、http url、data URL、base64:// 或裸 base64
|
|
311
|
+
* @param srvSendMsg 上传后是否由服务端直接发送
|
|
312
|
+
* @param fileName 文件消息的展示文件名
|
|
313
|
+
* @returns 上传结果,包含后续发送消息所需的 file_info
|
|
314
|
+
*/
|
|
315
|
+
uploadFallback(scene: Scene, peer: string, type: MediaType, source: string, srvSendMsg?: boolean, fileName?: string): Promise<UploadMediaResponse>;
|
|
316
|
+
/**
|
|
317
|
+
* 确认单个分片已完成上传。
|
|
318
|
+
*
|
|
319
|
+
* QQ 有时会在分片刚 PUT 完时短暂返回 40093001,此时需要在服务端给出的
|
|
320
|
+
* retry_timeout 窗口内持续重试,而不是直接判定整个大文件上传失败。
|
|
321
|
+
*
|
|
322
|
+
* @param scene user(单聊) / group(群聊)
|
|
323
|
+
* @param peer openid 或 group_openid
|
|
324
|
+
* @param body upload_part_finish 请求体
|
|
325
|
+
* @param retryTimeout 服务端返回的持续重试秒数
|
|
326
|
+
*/
|
|
327
|
+
private finishUploadPart;
|
|
328
|
+
/**
|
|
329
|
+
* 持续重试 upload_part_finish 的短暂服务端状态。
|
|
330
|
+
*
|
|
331
|
+
* @param scene user(单聊) / group(群聊)
|
|
332
|
+
* @param peer openid 或 group_openid
|
|
333
|
+
* @param body upload_part_finish 请求体
|
|
334
|
+
* @param retryTimeout 服务端返回的持续重试秒数
|
|
335
|
+
*/
|
|
336
|
+
private retryUploadPartFinish;
|
|
337
|
+
/**
|
|
338
|
+
* 完成 QQ 分片上传,并对短暂失败做有限重试。
|
|
339
|
+
*
|
|
340
|
+
* @param scene user(单聊) / group(群聊)
|
|
341
|
+
* @param peer openid 或 group_openid
|
|
342
|
+
* @param uploadId upload_prepare 返回的上传任务 ID
|
|
343
|
+
* @returns 上传结果
|
|
344
|
+
*/
|
|
345
|
+
private completeChunkedUpload;
|
|
346
|
+
/**
|
|
347
|
+
* 使用 QQ 官方分片协议上传 fallback 大资源。
|
|
348
|
+
*
|
|
349
|
+
* 流程为:准备上传 -> PUT 每个分片 -> 确认每个分片 -> 完成上传。
|
|
350
|
+
*
|
|
351
|
+
* @param scene user(单聊) / group(群聊)
|
|
352
|
+
* @param peer openid 或 group_openid
|
|
353
|
+
* @param type 文件类型
|
|
354
|
+
* @param source 已归一化的 fallback 来源
|
|
355
|
+
* @param preparedHashes 预计算的文件 hash
|
|
356
|
+
* @returns 上传结果,包含后续发送消息所需的 file_info
|
|
357
|
+
*/
|
|
358
|
+
private uploadChunked;
|
|
359
|
+
}
|
|
360
|
+
//#endregion
|
|
361
|
+
//#region src/core/api/interaction.d.ts
|
|
362
|
+
/** ack 返回码 */
|
|
363
|
+
type AckCode = 0 | 1 | 2 | 3 | 4 | 5;
|
|
364
|
+
/**
|
|
365
|
+
* INTERACTION_CREATE 回应
|
|
366
|
+
*/
|
|
367
|
+
declare class InteractionApi extends Http {
|
|
368
|
+
/**
|
|
369
|
+
* @param interactionId INTERACTION_CREATE 事件中的 id
|
|
370
|
+
* @param code 0 成功 / 1 操作失败 / 2 操作频繁 / 3 重复操作 / 4 无权限 / 5 仅管理员
|
|
371
|
+
*/
|
|
372
|
+
ack(interactionId: string, code?: AckCode): Promise<void>;
|
|
373
|
+
}
|
|
374
|
+
//#endregion
|
|
375
|
+
//#region src/core/api/meta.d.ts
|
|
376
|
+
/**
|
|
377
|
+
* 元信息接口:@me / dms / gateway
|
|
378
|
+
*/
|
|
379
|
+
declare class MetaApi extends Http {
|
|
380
|
+
/** 当前机器人详情 */
|
|
381
|
+
getMe(): Promise<GetMeResponse>;
|
|
382
|
+
/** 创建频道私信会话 */
|
|
383
|
+
createDms(recipientId: string, srcGuildId: string): Promise<DmsResponse>;
|
|
384
|
+
/** 获取通用 WSS 地址 */
|
|
385
|
+
getGateway(): Promise<{
|
|
386
|
+
url: string;
|
|
387
|
+
}>;
|
|
388
|
+
}
|
|
389
|
+
//#endregion
|
|
390
|
+
//#region src/core/api/index.d.ts
|
|
391
|
+
/**
|
|
392
|
+
* QQBot 官方 API 门面
|
|
393
|
+
*
|
|
394
|
+
* 子模块按职能拆分:
|
|
395
|
+
* - messages:发送 / 撤回
|
|
396
|
+
* - media:富媒体上传
|
|
397
|
+
* - interaction:按钮回调 ack
|
|
398
|
+
* - meta:@me / dms / gateway
|
|
399
|
+
*
|
|
400
|
+
* 请求体构造器 {@link buildQQMsg} / {@link buildGuildMsg} 独立导出,避免与 HTTP 调用耦合
|
|
401
|
+
*/
|
|
248
402
|
declare class QQBotApi {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
handleError(path: string, options: any, error: any): void;
|
|
270
|
-
/**
|
|
271
|
-
* 发送单聊消息
|
|
272
|
-
* @param targetId 目标QQ用户的 openid
|
|
273
|
-
* @param options 消息参数
|
|
274
|
-
*/
|
|
275
|
-
sendFriendMsg(targetId: string, options: SendQQMsg): Promise<SendQQMsgResponse>;
|
|
276
|
-
/**
|
|
277
|
-
* 发送群聊消息
|
|
278
|
-
* @param targetId 目标QQ群的 openid
|
|
279
|
-
* @param options 消息参数
|
|
280
|
-
*/
|
|
281
|
-
sendGroupMsg(targetId: string, options: SendQQMsg): Promise<SendQQMsgResponse>;
|
|
282
|
-
/**
|
|
283
|
-
* 构建QQBot文本消息参数
|
|
284
|
-
* @param content 消息文本内容
|
|
285
|
-
*/
|
|
286
|
-
QQdMsgOptions(type: 'text', content: string): SendQQTextMessageRequest;
|
|
287
|
-
/**
|
|
288
|
-
* 构建Markdown消息参数
|
|
289
|
-
* @param markdown Markdown文本内容
|
|
290
|
-
* @param keyboard 按钮
|
|
291
|
-
*/
|
|
292
|
-
QQdMsgOptions(type: 'markdown', markdown: Markdown, keyboard?: Keyboard): SendQQMarkdownMessageRequest;
|
|
293
|
-
/**
|
|
294
|
-
* 构建Ark消息参数
|
|
295
|
-
* @param ark Ark参数
|
|
296
|
-
*/
|
|
297
|
-
QQdMsgOptions(type: 'ark', ark: SendQQArkMessageRequest['ark']): SendQQArkMessageRequest;
|
|
298
|
-
/**
|
|
299
|
-
* 构建Media消息参数
|
|
300
|
-
* @param file 文件信息
|
|
301
|
-
*/
|
|
302
|
-
QQdMsgOptions(type: 'media', file: string): SendQQMediaMessageRequest;
|
|
303
|
-
/**
|
|
304
|
-
* 构建频道文本、文本图片消息参数
|
|
305
|
-
* @param type 消息类型
|
|
306
|
-
* @param content 消息内容
|
|
307
|
-
* @param image 图片url
|
|
308
|
-
*/
|
|
309
|
-
GuildMsgOptions(type: 'text', content: string, image?: string): SendGuildTextMessageRequest;
|
|
310
|
-
/**
|
|
311
|
-
* 构建图片消息参数
|
|
312
|
-
* @param type 消息类型
|
|
313
|
-
* @param image 图片url
|
|
314
|
-
*/
|
|
315
|
-
GuildMsgOptions(type: 'image', image: string): SendGuildTextMessageRequest;
|
|
316
|
-
/**
|
|
317
|
-
* 构建Embed消息参数
|
|
318
|
-
* @param type 消息类型
|
|
319
|
-
* @param embed Embed参数
|
|
320
|
-
*/
|
|
321
|
-
GuildMsgOptions(type: 'embed', embed: Embeds): SendGuildEmbedMessageRequest;
|
|
322
|
-
/**
|
|
323
|
-
* 构建Ark消息参数
|
|
324
|
-
* @param type 消息类型
|
|
325
|
-
* @param ark Ark参数
|
|
326
|
-
*/
|
|
327
|
-
GuildMsgOptions(type: 'ark', ark: Ark): SendGuildArkMessageRequest;
|
|
328
|
-
/**
|
|
329
|
-
* 构建Markdown消息参数
|
|
330
|
-
* @param type 消息类型
|
|
331
|
-
* @param markdown Markdown文本
|
|
332
|
-
*/
|
|
333
|
-
GuildMsgOptions(type: 'markdown', markdown: Markdown): SendGuildMarkdownMessageRequest;
|
|
334
|
-
/**
|
|
335
|
-
* 上传富媒体文件
|
|
336
|
-
* @param scene 上传场景
|
|
337
|
-
* @param targetId 目标id
|
|
338
|
-
* @param type 文件类型
|
|
339
|
-
* @param url 需要上传的文件的url
|
|
340
|
-
* @param srvSendMsg 是否发送消息
|
|
341
|
-
*/
|
|
342
|
-
uploadMedia(scene: Scene, targetId: string, type: MediaType, url: string, srvSendMsg?: boolean): Promise<UploadMediaResponse>;
|
|
343
|
-
/**
|
|
344
|
-
* 上传富媒体文件
|
|
345
|
-
* @param scene 上传场景
|
|
346
|
-
* @param targetId 目标id
|
|
347
|
-
* @param type 文件类型
|
|
348
|
-
* @param base64 需要上传的文件的base64编码
|
|
349
|
-
* @param srvSendMsg 是否发送消息
|
|
350
|
-
*/
|
|
351
|
-
uploadMedia(scene: Scene, targetId: string, type: MediaType, base64: string, srvSendMsg?: boolean): Promise<UploadMediaResponse>;
|
|
352
|
-
/**
|
|
353
|
-
* 单聊撤回消息
|
|
354
|
-
* @param type 场景类型
|
|
355
|
-
* @param targetId 目标QQ用户的openid
|
|
356
|
-
* @param messageId 消息id
|
|
357
|
-
*/
|
|
358
|
-
recallMsg(type: 'user', targetId: string, messageId: string): Promise<boolean>;
|
|
359
|
-
/**
|
|
360
|
-
* 群聊撤回消息
|
|
361
|
-
* @param type 场景类型
|
|
362
|
-
* @param targetId 目标QQ群的openid
|
|
363
|
-
* @param messageId 消息id
|
|
364
|
-
*/
|
|
365
|
-
recallMsg(type: 'group', targetId: string, messageId: string): Promise<boolean>;
|
|
366
|
-
/**
|
|
367
|
-
* 文字子频道撤回消息
|
|
368
|
-
* @param type 场景类型
|
|
369
|
-
* @param channelId 子频道的id
|
|
370
|
-
* @param messageId 消息id
|
|
371
|
-
* @param hidetip 是否隐藏提示小灰条,true 为隐藏,false 为显示。默认为false
|
|
372
|
-
*/
|
|
373
|
-
recallMsg(type: 'channels', channelId: string, messageId: string, hidetip?: boolean): Promise<boolean>;
|
|
374
|
-
/**
|
|
375
|
-
* 频道私信撤回消息
|
|
376
|
-
* @param type 场景类型
|
|
377
|
-
* @param guildId 频道的id
|
|
378
|
-
* @param messageId 消息id
|
|
379
|
-
* @param hidetip 是否隐藏提示小灰条,true 为隐藏,false 为显示。默认为false
|
|
380
|
-
*/
|
|
381
|
-
recallMsg(type: 'dms', guildId: string, messageId: string, hidetip?: boolean): Promise<boolean>;
|
|
382
|
-
/**
|
|
383
|
-
* 发送文字子频道消息
|
|
384
|
-
* @param targetId 目标子频道的id
|
|
385
|
-
* @param options 消息参数
|
|
386
|
-
*/
|
|
387
|
-
sendChannelMsg(targetId: string, options: SendGuildMsg | FormData): Promise<SendGuildResponse>;
|
|
388
|
-
/**
|
|
389
|
-
* 直接发送频道消息
|
|
390
|
-
* @param guildID 频道的id
|
|
391
|
-
* @param options 消息参数
|
|
392
|
-
*/
|
|
393
|
-
sendDmsMsg(guildID: string, options: SendGuildMsg | FormData): Promise<SendGuildResponse>;
|
|
394
|
-
/**
|
|
395
|
-
* 发送频道私信消息
|
|
396
|
-
* @param targetId 目标的id
|
|
397
|
-
* @param srcGuildId 源频道的id
|
|
398
|
-
* @param options 消息参数
|
|
399
|
-
*/
|
|
400
|
-
sendDmsMsg(targetId: string, srcGuildId: string, options: SendGuildMsg | FormData): Promise<SendGuildResponse>;
|
|
401
|
-
/**
|
|
402
|
-
* 获取当前机器人详情
|
|
403
|
-
*/
|
|
404
|
-
getMe(): Promise<GetMeResponse>;
|
|
405
|
-
/**
|
|
406
|
-
* 创建私信会话
|
|
407
|
-
* @param recipientID 接受者id
|
|
408
|
-
* @param srcGuildID 源频道id
|
|
409
|
-
*/
|
|
410
|
-
dms(recipientID: string, srcGuildID: string): Promise<DmsResponse>;
|
|
403
|
+
readonly axios: AxiosInstance;
|
|
404
|
+
readonly messages: MessagesApi;
|
|
405
|
+
readonly media: MediaApi;
|
|
406
|
+
readonly interaction: InteractionApi;
|
|
407
|
+
readonly meta: MetaApi;
|
|
408
|
+
/** 请求体构造器(静态便利) */
|
|
409
|
+
readonly qq: {
|
|
410
|
+
text(content: string): SendQQTextMessageRequest;
|
|
411
|
+
markdown(markdown: Markdown, keyboard?: Keyboard): SendQQMarkdownMessageRequest;
|
|
412
|
+
ark(ark: SendQQArkMessageRequest["ark"]): SendQQArkMessageRequest;
|
|
413
|
+
media(fileInfo: string): SendQQMediaMessageRequest;
|
|
414
|
+
};
|
|
415
|
+
readonly guild: {
|
|
416
|
+
text(content: string, image?: string): SendGuildTextMessageRequest;
|
|
417
|
+
image(image: string): SendGuildImageMessageRequest;
|
|
418
|
+
embed(embed: Embeds): SendGuildEmbedMessageRequest;
|
|
419
|
+
ark(ark: Ark): SendGuildArkMessageRequest;
|
|
420
|
+
markdown(markdown: Markdown, keyboard?: Keyboard): SendGuildMarkdownMessageRequest;
|
|
421
|
+
};
|
|
422
|
+
constructor(axios: AxiosInstance);
|
|
411
423
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
/** 文本 */
|
|
422
|
-
content: string[];
|
|
423
|
-
/** 图片 QQ专属 */
|
|
424
|
-
image: string[];
|
|
425
|
-
/** 单行按钮 */
|
|
426
|
-
button: ButtonElement[];
|
|
427
|
-
/** 多行按钮 */
|
|
428
|
-
keyboard: KeyboardElement[];
|
|
429
|
-
/** markdown */
|
|
430
|
-
markdown: MarkdownElement[];
|
|
431
|
-
/** markdown模板 */
|
|
432
|
-
markdownTpl: MarkdownTplElement[];
|
|
433
|
-
/** 频道专属 图片url */
|
|
434
|
-
imageUrls: string[];
|
|
435
|
-
/** 频道专属 图片file */
|
|
436
|
-
imageFiles: string[];
|
|
437
|
-
/** 引用回复 频道专属 */
|
|
438
|
-
reply: {
|
|
439
|
-
message_id: string;
|
|
440
|
-
};
|
|
441
|
-
/** pasmsg */
|
|
442
|
-
pasmsg: Pasmsg<T>;
|
|
443
|
-
/** 代发送列表 */
|
|
444
|
-
list: Array<Options<T>>;
|
|
445
|
-
/**
|
|
446
|
-
* 处理按钮、markdown
|
|
447
|
-
* 统一格式后推入待发送消息列表
|
|
448
|
-
* @param type 构建类型
|
|
449
|
-
* @param list 分类列表
|
|
450
|
-
* @returns
|
|
451
|
-
*/
|
|
452
|
-
markdownToButton: (type: T, list: Grouping<T>) => void;
|
|
424
|
+
//#endregion
|
|
425
|
+
//#region src/core/storage/message-store/types.d.ts
|
|
426
|
+
interface CachedMessage {
|
|
427
|
+
messageId: string;
|
|
428
|
+
messageSeq: number;
|
|
429
|
+
time: number;
|
|
430
|
+
contact: Contact;
|
|
431
|
+
sender: Sender;
|
|
432
|
+
elements: ElementTypes[];
|
|
453
433
|
}
|
|
434
|
+
//#endregion
|
|
435
|
+
//#region src/core/storage/message-store/store.d.ts
|
|
454
436
|
/**
|
|
455
|
-
*
|
|
456
|
-
*
|
|
437
|
+
* QQBot 收到的消息缓存。
|
|
438
|
+
*
|
|
439
|
+
* 热路径只写内存并入队,不等待 SQLite:
|
|
440
|
+
* - `getMsg` 优先查内存,插件在同一事件回调内可立即命中;
|
|
441
|
+
* - SQLite 在后台按批次事务落库,避免一条消息一个事务拖慢事件分发;
|
|
442
|
+
* - 元素表只保存 `type + value`,避免宽表 NULL 和多详情表多次 INSERT。
|
|
457
443
|
*/
|
|
458
|
-
declare
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
444
|
+
declare class MessageStore {
|
|
445
|
+
private db?;
|
|
446
|
+
private readonly ready;
|
|
447
|
+
private lastCleanup;
|
|
448
|
+
private shouldVacuum;
|
|
449
|
+
private flushTimer?;
|
|
450
|
+
private flushing;
|
|
451
|
+
private mediaTimer?;
|
|
452
|
+
private mediaActive;
|
|
453
|
+
private readonly pending;
|
|
454
|
+
private readonly pendingMedia;
|
|
455
|
+
private readonly pendingMediaKeys;
|
|
456
|
+
private readonly memory;
|
|
457
|
+
private readonly directIndex;
|
|
458
|
+
private readonly aliasIndex;
|
|
459
|
+
private readonly scopedAliasIndex;
|
|
460
|
+
private readonly botRefCache;
|
|
461
|
+
private readonly contactRefCache;
|
|
462
|
+
private readonly senderRefCache;
|
|
463
|
+
constructor();
|
|
464
|
+
/**
|
|
465
|
+
* 立即执行一次过期消息和本地媒体缓存清理。
|
|
466
|
+
*
|
|
467
|
+
* 该方法交给 Karin `task` 调度调用;类内部只保留清理能力,不自行维护常驻定时器。
|
|
468
|
+
*
|
|
469
|
+
* @returns 清理完成 Promise。
|
|
470
|
+
*/
|
|
471
|
+
cleanupExpired(): Promise<void>;
|
|
472
|
+
/**
|
|
473
|
+
* 保存实际消息,并为 QQ 的 `msg_idx` 等引用索引建立轻量映射。
|
|
474
|
+
*
|
|
475
|
+
* 该方法只同步写入内存并投递后台队列,不等待 SQLite。这样消息事件创建不会被
|
|
476
|
+
* 数据库写锁或小事务阻塞。
|
|
477
|
+
*
|
|
478
|
+
* @param botId 当前 QQBot appId。
|
|
479
|
+
* @param message 已转换为 Karin elements 的消息缓存。
|
|
480
|
+
* @param aliases 可查询到该消息的额外消息索引,例如 QQ `msg_idx`。
|
|
481
|
+
*/
|
|
482
|
+
save(botId: string, message: CachedMessage, aliases?: string[]): Promise<void>;
|
|
483
|
+
/**
|
|
484
|
+
* 仅当内存中没有该引用索引时保存 QQ 下发的引用上下文。
|
|
485
|
+
* 数据库是否已存在由后台 flush 再判断,避免阻塞事件热路径。
|
|
486
|
+
*
|
|
487
|
+
* @param botId 当前 QQBot appId。
|
|
488
|
+
* @param message 以 `ref_msg_idx` 作为 messageId 的引用上下文。
|
|
489
|
+
*/
|
|
490
|
+
saveReferenceIfAbsent(botId: string, message: CachedMessage): Promise<void>;
|
|
491
|
+
/**
|
|
492
|
+
* 读取缓存消息。
|
|
493
|
+
*
|
|
494
|
+
* OneBot v11 标准调用只传 messageId;contact 参数仅用于额外限定范围。
|
|
495
|
+
*
|
|
496
|
+
* @param botId 当前 QQBot appId。
|
|
497
|
+
* @param messageId 真实消息 ID 或 QQ `REFIDX` 引用索引。
|
|
498
|
+
* @param contact 可选会话范围,传入后只在该会话下查询。
|
|
499
|
+
* @returns 命中的消息缓存;未命中或已过期时返回 null。
|
|
500
|
+
*/
|
|
501
|
+
get(botId: string, messageId: string, contact?: Contact): Promise<MessageResponse | null>;
|
|
502
|
+
/**
|
|
503
|
+
* 按起始消息 ID 读取同一会话内的历史缓存消息。
|
|
504
|
+
*
|
|
505
|
+
* QQ 官方 Bot 没有 seq 历史查询能力;这里以本地缓存中命中的起始消息为锚点,
|
|
506
|
+
* 按时间倒序返回最近的 `count` 条消息,包含起始消息本身。
|
|
507
|
+
*
|
|
508
|
+
* @param botId 当前 QQBot appId。
|
|
509
|
+
* @param contact 查询限定的会话。
|
|
510
|
+
* @param startMsgId 起始消息 ID 或 QQ `REFIDX` 引用索引。
|
|
511
|
+
* @param count 获取消息数量。
|
|
512
|
+
* @returns 命中的历史消息数组;未命中或已过期时返回空数组。
|
|
513
|
+
*/
|
|
514
|
+
getHistory(botId: string, contact: Contact, startMsgId: string, count: number): Promise<MessageResponse[]>;
|
|
515
|
+
/**
|
|
516
|
+
* 初始化 SQLite 连接、表结构,并执行启动清理和媒体本地化补救。
|
|
517
|
+
*
|
|
518
|
+
* @returns 初始化完成 Promise。
|
|
519
|
+
*/
|
|
520
|
+
private initialize;
|
|
521
|
+
/**
|
|
522
|
+
* 投递待落库消息。
|
|
523
|
+
*
|
|
524
|
+
* @param item 待写入 SQLite 的缓存任务。
|
|
525
|
+
*/
|
|
526
|
+
private enqueue;
|
|
527
|
+
/**
|
|
528
|
+
* 安排一次后台批量落库。
|
|
529
|
+
*
|
|
530
|
+
* 已有 timer 或正在 flush 时不会重复安排。
|
|
531
|
+
*/
|
|
532
|
+
private scheduleFlush;
|
|
533
|
+
/**
|
|
534
|
+
* 批量落库队列中的消息。
|
|
535
|
+
*
|
|
536
|
+
* 单次最多处理 `FLUSH_BATCH_SIZE` 条,并在一个事务内完成写入。
|
|
537
|
+
*
|
|
538
|
+
* @returns flush 完成 Promise。
|
|
539
|
+
*/
|
|
540
|
+
private flushQueue;
|
|
541
|
+
/**
|
|
542
|
+
* 写入一条待落库消息。
|
|
543
|
+
*
|
|
544
|
+
* @param item 待写入的消息、alias 和引用上下文标记。
|
|
545
|
+
*/
|
|
546
|
+
private writeItem;
|
|
547
|
+
/**
|
|
548
|
+
* 清理待写队列中已经过期的消息。
|
|
549
|
+
*/
|
|
550
|
+
private prunePending;
|
|
551
|
+
/**
|
|
552
|
+
* 投递媒体本地化任务。
|
|
553
|
+
*
|
|
554
|
+
* 原消息会先保留短期 URL 写入缓存;本地化成功后再覆盖同一条消息。队列会按
|
|
555
|
+
* message scoped key 去重,避免高频更新同一条消息时重复下载。
|
|
556
|
+
*
|
|
557
|
+
* @param botId 当前 QQBot appId。
|
|
558
|
+
* @param message 可能包含远程媒体 URL 的消息快照。
|
|
559
|
+
* @param aliases 该消息可被查询到的额外 alias。
|
|
560
|
+
*/
|
|
561
|
+
private enqueueMediaLocalize;
|
|
562
|
+
/**
|
|
563
|
+
* 安排媒体本地化队列处理。
|
|
564
|
+
*
|
|
565
|
+
* @returns 已存在定时器或队列为空时直接返回。
|
|
566
|
+
*/
|
|
567
|
+
private scheduleMediaLocalize;
|
|
568
|
+
/**
|
|
569
|
+
* 按固定并发处理媒体本地化任务。
|
|
570
|
+
*
|
|
571
|
+
* @returns 队列为空或达到并发上限时返回。
|
|
572
|
+
*/
|
|
573
|
+
private drainMediaLocalizeQueue;
|
|
574
|
+
/**
|
|
575
|
+
* 本地化单条消息中的远程媒体字段,并在成功后覆盖内存与 SQLite。
|
|
576
|
+
*
|
|
577
|
+
* @param item 待处理的媒体本地化任务。
|
|
578
|
+
* @returns 本地化与回写完成 Promise。
|
|
579
|
+
*/
|
|
580
|
+
private localizeMediaItem;
|
|
581
|
+
/**
|
|
582
|
+
* 清理已经过期的媒体本地化待处理任务。
|
|
583
|
+
*
|
|
584
|
+
* @returns 无返回值;会同步维护 pendingMediaKeys。
|
|
585
|
+
*/
|
|
586
|
+
private prunePendingMedia;
|
|
587
|
+
/**
|
|
588
|
+
* 启动时扫描 SQLite 中尚未本地化的远程媒体 URL,并重新投递队列补救。
|
|
589
|
+
*
|
|
590
|
+
* @returns 扫描和投递完成 Promise。
|
|
591
|
+
*/
|
|
592
|
+
private recoverRemoteMedia;
|
|
593
|
+
/**
|
|
594
|
+
* 写入内存热缓存。
|
|
595
|
+
*
|
|
596
|
+
* @param botId 当前 QQBot appId。
|
|
597
|
+
* @param message 消息缓存。
|
|
598
|
+
* @param aliases 可查询到该消息的额外消息索引。
|
|
599
|
+
*/
|
|
600
|
+
private putMemory;
|
|
601
|
+
/**
|
|
602
|
+
* 从内存热缓存读取消息。
|
|
603
|
+
*
|
|
604
|
+
* @param botId 当前 QQBot appId。
|
|
605
|
+
* @param messageId 真实消息 ID 或 alias。
|
|
606
|
+
* @param contact 可选会话范围。
|
|
607
|
+
* @returns 命中的缓存消息;未命中或过期时返回 null。
|
|
608
|
+
*/
|
|
609
|
+
private getFromMemory;
|
|
610
|
+
/**
|
|
611
|
+
* 到达清理间隔时清理内存缓存。
|
|
612
|
+
*/
|
|
613
|
+
private cleanupMemoryIfDue;
|
|
614
|
+
/**
|
|
615
|
+
* 清理一天前的内存消息,并同步清理失效索引。
|
|
616
|
+
*/
|
|
617
|
+
private cleanupMemory;
|
|
618
|
+
/**
|
|
619
|
+
* 清理指向已删除内存消息的索引。
|
|
620
|
+
*
|
|
621
|
+
* @param index 需要清理的索引 Map。
|
|
622
|
+
*/
|
|
623
|
+
private cleanIndex;
|
|
624
|
+
/**
|
|
625
|
+
* 浅拷贝消息缓存,避免后续事件对象被插件侧修改后污染缓存。
|
|
626
|
+
*
|
|
627
|
+
* @param message 原始缓存消息。
|
|
628
|
+
* @returns 可安全放入缓存的消息副本。
|
|
629
|
+
*/
|
|
630
|
+
private cloneMessage;
|
|
631
|
+
/**
|
|
632
|
+
* 将内存缓存转换为 Karin `MessageResponse`。
|
|
633
|
+
*
|
|
634
|
+
* @param message 内存缓存消息。
|
|
635
|
+
* @returns Karin 标准消息查询结果。
|
|
636
|
+
*/
|
|
637
|
+
private toResponse;
|
|
638
|
+
/**
|
|
639
|
+
* 执行数据库版本迁移。
|
|
640
|
+
*
|
|
641
|
+
* 使用 SQLite `PRAGMA user_version` 记录已应用的 schema 版本。
|
|
642
|
+
* 版本 0 只表示“未初始化或开发期旧库”,首个 alpha 发布基线为 v1。
|
|
643
|
+
*
|
|
644
|
+
* @returns 迁移完成 Promise。
|
|
645
|
+
*/
|
|
646
|
+
private migrate;
|
|
647
|
+
/**
|
|
648
|
+
* 获取或创建 bot 映射 ID。
|
|
649
|
+
*
|
|
650
|
+
* @param botId 当前 QQBot appId。
|
|
651
|
+
* @returns `qqbot_bots.id`。
|
|
652
|
+
*/
|
|
653
|
+
private ensureBot;
|
|
654
|
+
/**
|
|
655
|
+
* 获取或创建会话映射 ID。
|
|
656
|
+
*
|
|
657
|
+
* @param botRef `qqbot_bots.id`。
|
|
658
|
+
* @param contact Karin 会话对象。
|
|
659
|
+
* @returns `qqbot_contacts.id`。
|
|
660
|
+
*/
|
|
661
|
+
private ensureContact;
|
|
662
|
+
/**
|
|
663
|
+
* 获取或创建发送者映射 ID。
|
|
664
|
+
*
|
|
665
|
+
* @param botRef `qqbot_bots.id`。
|
|
666
|
+
* @param sender Karin sender 对象。
|
|
667
|
+
* @returns `qqbot_senders.id`。
|
|
668
|
+
*/
|
|
669
|
+
private ensureSender;
|
|
670
|
+
/**
|
|
671
|
+
* 获取或创建消息主记录。
|
|
672
|
+
*
|
|
673
|
+
* @param botRef `qqbot_bots.id`。
|
|
674
|
+
* @param contactRef `qqbot_contacts.id`。
|
|
675
|
+
* @param senderRef `qqbot_senders.id`。
|
|
676
|
+
* @param message 消息缓存。
|
|
677
|
+
* @returns `qqbot_messages.id`。
|
|
678
|
+
*/
|
|
679
|
+
private ensureMessage;
|
|
680
|
+
/**
|
|
681
|
+
* 从查询行还原 Karin Contact。
|
|
682
|
+
*
|
|
683
|
+
* @param row 消息主查询结果。
|
|
684
|
+
* @returns Karin Contact。
|
|
685
|
+
*/
|
|
686
|
+
private contactFromRow;
|
|
687
|
+
/**
|
|
688
|
+
* 将数据库行还原为 Karin `MessageResponse`。
|
|
689
|
+
*
|
|
690
|
+
* @param row 消息主查询结果。
|
|
691
|
+
* @returns Karin 标准消息查询结果。
|
|
692
|
+
*/
|
|
693
|
+
private rowToResponse;
|
|
694
|
+
/**
|
|
695
|
+
* 在指定会话中解析消息 ID 或 alias 到消息主表行。
|
|
696
|
+
*
|
|
697
|
+
* @param botId 当前 QQBot appId。
|
|
698
|
+
* @param contact Karin 会话对象。
|
|
699
|
+
* @param messageId 真实消息 ID 或 alias。
|
|
700
|
+
* @returns 命中的消息行;未命中时返回 null。
|
|
701
|
+
*/
|
|
702
|
+
private resolveMessageRow;
|
|
703
|
+
/**
|
|
704
|
+
* 构造会话级查询键。
|
|
705
|
+
*
|
|
706
|
+
* @param botId 当前 QQBot appId。
|
|
707
|
+
* @param contact Karin 会话对象。
|
|
708
|
+
* @param messageId 消息 ID 或 alias。
|
|
709
|
+
* @returns 用于 SQL 参数或内存 key 的字段数组。
|
|
710
|
+
*/
|
|
711
|
+
private contactKey;
|
|
712
|
+
/**
|
|
713
|
+
* 构造内存会话级 key。
|
|
714
|
+
*
|
|
715
|
+
* @param botId 当前 QQBot appId。
|
|
716
|
+
* @param contact Karin 会话对象。
|
|
717
|
+
* @param messageId 消息 ID 或 alias。
|
|
718
|
+
* @returns 内存 Map 使用的稳定 key。
|
|
719
|
+
*/
|
|
720
|
+
private scopedKey;
|
|
721
|
+
/**
|
|
722
|
+
* 构造内存全局 key。
|
|
723
|
+
*
|
|
724
|
+
* @param botId 当前 QQBot appId。
|
|
725
|
+
* @param messageId 消息 ID 或 alias。
|
|
726
|
+
* @returns 不限定会话时使用的内存 key。
|
|
727
|
+
*/
|
|
728
|
+
private globalKey;
|
|
729
|
+
/**
|
|
730
|
+
* 删除指定会话下的 alias。
|
|
731
|
+
*
|
|
732
|
+
* @param botId 当前 QQBot appId。
|
|
733
|
+
* @param contact Karin 会话对象。
|
|
734
|
+
* @param messageId 需要删除的 alias ID。
|
|
735
|
+
*/
|
|
736
|
+
private deleteAlias;
|
|
737
|
+
/**
|
|
738
|
+
* 判断某条消息是否包含指向指定 ID 的 reply 段。
|
|
739
|
+
*
|
|
740
|
+
* @param messageRef `qqbot_messages.id`。
|
|
741
|
+
* @param replyId 被引用的消息 ID。
|
|
742
|
+
* @returns true 表示该消息包含对应 reply 段。
|
|
743
|
+
*/
|
|
744
|
+
private hasReplyTo;
|
|
745
|
+
/**
|
|
746
|
+
* 判断消息是否已经超过本地缓存 TTL。
|
|
747
|
+
*
|
|
748
|
+
* @param row 带 `time` 字段的消息对象。
|
|
749
|
+
* @returns true 表示已经超过一天缓存窗口。
|
|
750
|
+
*/
|
|
751
|
+
private isExpired;
|
|
752
|
+
/**
|
|
753
|
+
* 到达清理间隔时清理内存和 SQLite 过期消息。
|
|
754
|
+
*/
|
|
755
|
+
private cleanupIfDue;
|
|
756
|
+
/**
|
|
757
|
+
* 清理一天前的缓存消息。
|
|
758
|
+
*
|
|
759
|
+
* SQLite 只删除主消息表,消息段和 alias 通过外键级联删除。
|
|
760
|
+
*/
|
|
761
|
+
private cleanup;
|
|
762
|
+
/**
|
|
763
|
+
* 判断 SQLite 表是否存在。
|
|
764
|
+
*
|
|
765
|
+
* @param name 表名。
|
|
766
|
+
* @returns true 表示表存在。
|
|
767
|
+
*/
|
|
768
|
+
private tableExists;
|
|
769
|
+
/**
|
|
770
|
+
* 读取 SQLite 表字段名。
|
|
771
|
+
*
|
|
772
|
+
* @param name 表名。
|
|
773
|
+
* @returns 字段名数组;表不存在时返回空数组。
|
|
774
|
+
*/
|
|
775
|
+
private tableColumns;
|
|
776
|
+
/**
|
|
777
|
+
* 读取 SQLite schema 版本。
|
|
778
|
+
*
|
|
779
|
+
* @returns 当前 `PRAGMA user_version`;新库默认为 0。
|
|
780
|
+
*/
|
|
781
|
+
private getUserVersion;
|
|
782
|
+
/**
|
|
783
|
+
* 写入 SQLite schema 版本。
|
|
784
|
+
*
|
|
785
|
+
* @param version 已成功应用的数据库版本号。
|
|
786
|
+
*/
|
|
787
|
+
private setUserVersion;
|
|
788
|
+
/**
|
|
789
|
+
* 在 `BEGIN IMMEDIATE` 事务中执行写操作。
|
|
790
|
+
*
|
|
791
|
+
* @param fn 事务内执行的异步函数。
|
|
792
|
+
*/
|
|
793
|
+
private transaction;
|
|
794
|
+
/**
|
|
795
|
+
* 执行不返回行的 SQL。
|
|
796
|
+
*
|
|
797
|
+
* @param sql SQL 字符串。
|
|
798
|
+
* @param params SQL 参数。
|
|
799
|
+
*/
|
|
800
|
+
private run;
|
|
801
|
+
/**
|
|
802
|
+
* 查询单行数据。
|
|
803
|
+
*
|
|
804
|
+
* @param sql SQL 字符串。
|
|
805
|
+
* @param params SQL 参数。
|
|
806
|
+
* @returns 查询结果;未命中时返回 undefined。
|
|
807
|
+
*/
|
|
808
|
+
private getRow;
|
|
809
|
+
/**
|
|
810
|
+
* 查询多行数据。
|
|
811
|
+
*
|
|
812
|
+
* @param sql SQL 字符串。
|
|
813
|
+
* @param params SQL 参数。
|
|
814
|
+
* @returns 查询结果数组。
|
|
815
|
+
*/
|
|
816
|
+
private getRows;
|
|
497
817
|
}
|
|
498
|
-
|
|
499
|
-
|
|
818
|
+
//#endregion
|
|
819
|
+
//#region src/types/config.d.ts
|
|
820
|
+
/**
|
|
821
|
+
* 单个 QQBot 配置
|
|
822
|
+
*/
|
|
823
|
+
interface QQBotConfig {
|
|
824
|
+
/** 机器人名称 */
|
|
825
|
+
name: string;
|
|
826
|
+
/** 机器人 ID */
|
|
827
|
+
appId: string;
|
|
828
|
+
/** 机器人密钥 */
|
|
829
|
+
secret: string;
|
|
830
|
+
/** 正式环境 API */
|
|
831
|
+
prodApi: string;
|
|
832
|
+
/** 测试环境 API */
|
|
833
|
+
sandboxApi: string;
|
|
834
|
+
/** 调用凭证 API */
|
|
835
|
+
tokenApi: string;
|
|
836
|
+
/** 开启沙盒环境 */
|
|
837
|
+
sandbox: boolean;
|
|
838
|
+
/** 开启 QQ 场景能力(单聊 / 群聊) */
|
|
839
|
+
qqEnable: boolean;
|
|
840
|
+
/** 开启频道场景能力 */
|
|
841
|
+
guildEnable: boolean;
|
|
842
|
+
/** 频道场景模式 0 公域 / 1 私域 */
|
|
843
|
+
guildMode: 0 | 1;
|
|
844
|
+
/** 收到消息后对文本进行表达式处理 */
|
|
845
|
+
regex: {
|
|
846
|
+
reg: string | RegExp;
|
|
847
|
+
rep: string;
|
|
848
|
+
}[];
|
|
849
|
+
/** 按钮自动化 */
|
|
850
|
+
keyboard: {
|
|
851
|
+
/** 是否将文本中的 URL 自动转换为 keyboard 按钮 */enable: boolean;
|
|
852
|
+
};
|
|
853
|
+
/** 消息缓存配置 */
|
|
854
|
+
messageCache: {
|
|
855
|
+
/** 是否启用数据库消息缓存,用于 bot.getMsg */enable: boolean; /** 是否缓存机器人自己发送的消息 */
|
|
856
|
+
self: boolean;
|
|
857
|
+
};
|
|
858
|
+
/** 事件接收配置 */
|
|
859
|
+
event: {
|
|
860
|
+
/** 接收方式 0 关闭 / 1 webhook / 2 ws */type: 0 | 1 | 2;
|
|
861
|
+
};
|
|
862
|
+
}
|
|
863
|
+
//#endregion
|
|
864
|
+
//#region src/core/adapter/base.d.ts
|
|
865
|
+
/**
|
|
866
|
+
* QQ Official Bot 适配器
|
|
867
|
+
*
|
|
868
|
+
* 全场景统一走 msg_type=2 Markdown 通道(详见 pipeline-qq / pipeline-guild)。
|
|
869
|
+
* 视频 / 语音 / 文件由 pipeline 内部以 msg_type=7 紧随主消息补发。
|
|
870
|
+
*/
|
|
871
|
+
declare class AdapterQQBot extends AdapterBase implements AdapterType {
|
|
872
|
+
/** 与官方 API 交互 */
|
|
873
|
+
super: QQBotApi;
|
|
874
|
+
/** openId / member_openid -> 昵称 缓存 */
|
|
875
|
+
nicknameCache: Map<string, string>;
|
|
876
|
+
constructor(cfg: QQBotConfig, api: QQBotApi);
|
|
877
|
+
/** 当前 bot 配置。真实配置存放在 WeakMap,避免被系统接口序列化整个适配器时带出。 */
|
|
878
|
+
get cfg(): QQBotConfig;
|
|
879
|
+
/** 接收消息的一天热缓存 + SQLite 缓存,用于实现 Karin 标准 `getMsg`。 */
|
|
880
|
+
get messageStore(): MessageStore;
|
|
881
|
+
logger(level: LogMethodNames, ...args: any[]): void;
|
|
882
|
+
/**
|
|
883
|
+
* 主消息回复入口(karin 调用)
|
|
884
|
+
*/
|
|
885
|
+
srcReply(e: Message, elements: ElementTypes[]): Promise<SendMsgResults>;
|
|
886
|
+
/**
|
|
887
|
+
* 发送消息
|
|
888
|
+
*/
|
|
889
|
+
sendMsg(contact: Contact, elements: Array<ElementTypes>, _retryCount?: number): Promise<SendMsgResults>;
|
|
890
|
+
/**
|
|
891
|
+
* 撤回消息
|
|
892
|
+
*
|
|
893
|
+
* 群聊中机器人被群主设为管理员后,也可撤回成员消息;平台仍限制消息发送后两分钟内。
|
|
894
|
+
*/
|
|
895
|
+
recallMsg(contact: Contact, messageId: string): Promise<void>;
|
|
896
|
+
/**
|
|
897
|
+
* 构造空发送结果,pipeline 内填充 rawData
|
|
898
|
+
*/
|
|
899
|
+
initSendMsgResults(): SendMsgResults;
|
|
900
|
+
/**
|
|
901
|
+
* 将 rawData[0].id / timestamp 同步到顶层字段
|
|
902
|
+
*/
|
|
903
|
+
handleResponse(data: SendMsgResults): SendMsgResults;
|
|
904
|
+
/**
|
|
905
|
+
* 发送长消息
|
|
906
|
+
*/
|
|
907
|
+
sendLongMsg(_contact: Contact, _resId: string): Promise<SendMsgResults>;
|
|
908
|
+
/**
|
|
909
|
+
* 发送合并转发消息
|
|
910
|
+
*
|
|
911
|
+
* 将 NodeElement 拆解为文本 + 图片等元素,拼接成 markdown 发送。
|
|
912
|
+
* 节点之间仅用换行隔开,不添加任何前缀提示文本。
|
|
913
|
+
*/
|
|
914
|
+
sendForwardMsg(contact: Contact, elements: Array<NodeElement>, _options?: ForwardOptions): Promise<{
|
|
915
|
+
messageId: string;
|
|
916
|
+
forwardId: string;
|
|
917
|
+
}>;
|
|
918
|
+
/**
|
|
919
|
+
* 获取头像 url
|
|
920
|
+
*/
|
|
921
|
+
getAvatarUrl(_userId: string, _size?: 0 | 40 | 100 | 140): Promise<string>;
|
|
922
|
+
/**
|
|
923
|
+
* 获取群头像 url
|
|
924
|
+
*/
|
|
925
|
+
getGroupAvatarUrl(_groupId: string, _size?: 0 | 40 | 100 | 140, _history?: number): Promise<string>;
|
|
926
|
+
/**
|
|
927
|
+
* 按消息 ID 获取已接收的消息。
|
|
928
|
+
*
|
|
929
|
+
* QQ 官方 Bot API 没有历史消息查询接口,因此仅从本地缓存读取。
|
|
930
|
+
* 消息在接收时已转换为 Karin elements,最长保留一天;引用消息的 `REFIDX`
|
|
931
|
+
* 索引同样可作为 `messageId` 查询。
|
|
932
|
+
*
|
|
933
|
+
* @param input OneBot v11 标准单参 messageId,或用于限定查询范围的 Contact。
|
|
934
|
+
* @param messageId 当 input 是 Contact 时传入的目标消息 ID。
|
|
935
|
+
* @returns 命中的消息;未命中时返回空消息结构。
|
|
936
|
+
*/
|
|
937
|
+
getMsg(input: Contact | string, messageId?: string): Promise<MessageResponse>;
|
|
938
|
+
/**
|
|
939
|
+
* 获取本地缓存历史消息(仅支持 message_id)
|
|
940
|
+
*/
|
|
941
|
+
getHistoryMsg(contact: Contact, startMsgId: string, count: number): Promise<Array<MessageResponse>>;
|
|
942
|
+
/**
|
|
943
|
+
* 获取本地缓存历史消息(message_seq 暂不支持)
|
|
944
|
+
*/
|
|
945
|
+
getHistoryMsg(contact: Contact, startMsgSeq: number, count: number): Promise<Array<MessageResponse>>;
|
|
946
|
+
/**
|
|
947
|
+
* 获取合并转发消息
|
|
948
|
+
*/
|
|
949
|
+
getForwardMsg(_resId: string): Promise<Array<MessageResponse>>;
|
|
950
|
+
/**
|
|
951
|
+
* 获取精华消息
|
|
952
|
+
*/
|
|
953
|
+
getGroupHighlights(_groupId: string, _page: number, _pageSize: number): Promise<Array<GetGroupHighlightsResponse>>;
|
|
954
|
+
/**
|
|
955
|
+
* 构造资源 ID
|
|
956
|
+
*/
|
|
957
|
+
createResId(_contact: Contact, _elements: Array<NodeElement>): Promise<string>;
|
|
958
|
+
/**
|
|
959
|
+
* 设置、取消群精华消息
|
|
960
|
+
*/
|
|
961
|
+
setGroupHighlights(_groupId: string, _messageId: string, _create: boolean): Promise<void>;
|
|
962
|
+
/**
|
|
963
|
+
* 发送好友赞
|
|
964
|
+
*/
|
|
965
|
+
sendLike(_targetId: string, _count: number): Promise<void>;
|
|
966
|
+
/**
|
|
967
|
+
* 群踢人
|
|
968
|
+
*/
|
|
969
|
+
groupKickMember(_groupId: string, _targetId: string, _rejectAddRequest?: boolean, _kickReason?: string): Promise<void>;
|
|
970
|
+
/**
|
|
971
|
+
* 禁言群成员
|
|
972
|
+
*/
|
|
973
|
+
setGroupMute(_groupId: string, _targetId: string, _duration: number): Promise<void>;
|
|
974
|
+
/**
|
|
975
|
+
* 群全员禁言
|
|
976
|
+
*/
|
|
977
|
+
setGroupAllMute(_groupId: string, _isBan: boolean): Promise<void>;
|
|
978
|
+
/**
|
|
979
|
+
* 设置群管理员
|
|
980
|
+
*/
|
|
981
|
+
setGroupAdmin(_groupId: string, _targetId: string, _isAdmin: boolean): Promise<void>;
|
|
982
|
+
/**
|
|
983
|
+
* 设置群名片
|
|
984
|
+
*/
|
|
985
|
+
setGroupMemberCard(_groupId: string, _targetId: string, _card: string): Promise<void>;
|
|
986
|
+
/**
|
|
987
|
+
* 设置群名
|
|
988
|
+
*/
|
|
989
|
+
setGroupName(_groupId: string, _groupName: string): Promise<void>;
|
|
990
|
+
/**
|
|
991
|
+
* 退出群组
|
|
992
|
+
*/
|
|
993
|
+
setGroupQuit(_groupId: string, _isDismiss: boolean): Promise<void>;
|
|
994
|
+
/**
|
|
995
|
+
* 设置群专属头衔
|
|
996
|
+
*/
|
|
997
|
+
setGroupMemberTitle(_groupId: string, _targetId: string, _title: string): Promise<void>;
|
|
998
|
+
/**
|
|
999
|
+
* 获取陌生人信息
|
|
1000
|
+
*/
|
|
1001
|
+
getStrangerInfo(_targetId: string): Promise<UserInfo>;
|
|
1002
|
+
/**
|
|
1003
|
+
* 获取好友列表
|
|
1004
|
+
*/
|
|
1005
|
+
getFriendList(_refresh?: boolean): Promise<Array<UserInfo>>;
|
|
1006
|
+
/**
|
|
1007
|
+
* 获取群信息
|
|
1008
|
+
*/
|
|
1009
|
+
getGroupInfo(_groupId: string, _noCache?: boolean): Promise<GroupInfo>;
|
|
1010
|
+
/**
|
|
1011
|
+
* 获取群列表
|
|
1012
|
+
*/
|
|
1013
|
+
getGroupList(_refresh?: boolean): Promise<Array<GroupInfo>>;
|
|
1014
|
+
/**
|
|
1015
|
+
* 获取群成员信息
|
|
1016
|
+
*/
|
|
1017
|
+
getGroupMemberInfo(_groupId: string, _targetId: string, _refresh?: boolean): Promise<GroupMemberInfo>;
|
|
1018
|
+
/**
|
|
1019
|
+
* 获取群成员列表
|
|
1020
|
+
*/
|
|
1021
|
+
getGroupMemberList(_groupId: string, _refresh?: boolean): Promise<Array<GroupMemberInfo>>;
|
|
1022
|
+
/**
|
|
1023
|
+
* 获取群荣誉信息
|
|
1024
|
+
*/
|
|
1025
|
+
getGroupHonor(_groupId: string): Promise<Array<QQGroupHonorInfo>>;
|
|
1026
|
+
/**
|
|
1027
|
+
* 设置好友请求结果
|
|
1028
|
+
*/
|
|
1029
|
+
setFriendApplyResult(_requestId: string, _isApprove: boolean, _remark?: string): Promise<void>;
|
|
1030
|
+
/**
|
|
1031
|
+
* 设置申请加入群请求结果
|
|
1032
|
+
*/
|
|
1033
|
+
setGroupApplyResult(_requestId: string, _isApprove: boolean, _denyReason?: string): Promise<void>;
|
|
1034
|
+
/**
|
|
1035
|
+
* 设置邀请加入群请求结果
|
|
1036
|
+
*/
|
|
1037
|
+
setInvitedJoinGroupResult(_requestId: string, _isApprove: boolean): Promise<void>;
|
|
1038
|
+
/**
|
|
1039
|
+
* 设置消息表情回应
|
|
1040
|
+
*/
|
|
1041
|
+
setMsgReaction(_contact: Contact, _messageId: string, _faceId: number | string, _isSet: boolean): Promise<void>;
|
|
1042
|
+
/**
|
|
1043
|
+
* 上传群文件、私聊文件
|
|
1044
|
+
*/
|
|
1045
|
+
uploadFile(_contact: Contact, _file: string, _name: string, _folder?: string): Promise<void>;
|
|
1046
|
+
/**
|
|
1047
|
+
* 下载文件到协议端本地
|
|
1048
|
+
*/
|
|
1049
|
+
downloadFile(_options?: DownloadFileOptions): Promise<DownloadFileResponse>;
|
|
1050
|
+
/**
|
|
1051
|
+
* 创建群文件夹
|
|
1052
|
+
*/
|
|
1053
|
+
createGroupFolder(_groupId: string, _name: string): Promise<CreateGroupFolderResponse>;
|
|
1054
|
+
/**
|
|
1055
|
+
* 重命名群文件夹
|
|
1056
|
+
*/
|
|
1057
|
+
renameGroupFolder(_groupId: string, _folderId: string, _name: string): Promise<boolean>;
|
|
1058
|
+
/**
|
|
1059
|
+
* 删除群文件夹
|
|
1060
|
+
*/
|
|
1061
|
+
delGroupFolder(_groupId: string, _folderId: string): Promise<boolean>;
|
|
1062
|
+
/**
|
|
1063
|
+
* 上传群文件
|
|
1064
|
+
*/
|
|
1065
|
+
uploadGroupFile(_groupId: string, _file: string, _name?: string): Promise<boolean>;
|
|
1066
|
+
/**
|
|
1067
|
+
* 获取文件 url
|
|
1068
|
+
*/
|
|
1069
|
+
getFileUrl(_contact: Contact, _fileId: string): Promise<string>;
|
|
1070
|
+
/**
|
|
1071
|
+
* 删除群文件
|
|
1072
|
+
*/
|
|
1073
|
+
delGroupFile(_groupId: string, _fileId: string, _busId: number): Promise<boolean>;
|
|
1074
|
+
/**
|
|
1075
|
+
* 获取群文件系统信息
|
|
1076
|
+
*/
|
|
1077
|
+
getGroupFileSystemInfo(_groupId: string): Promise<GetGroupFileSystemInfoResponse>;
|
|
1078
|
+
/**
|
|
1079
|
+
* 获取群文件夹下文件列表
|
|
1080
|
+
*/
|
|
1081
|
+
getGroupFileList(_groupId: string, _folderId?: string): Promise<GetGroupFileListResponse>;
|
|
1082
|
+
/**
|
|
1083
|
+
* 设置群备注
|
|
1084
|
+
*/
|
|
1085
|
+
setGroupRemark(_groupId: string, _remark: string): Promise<boolean>;
|
|
1086
|
+
/**
|
|
1087
|
+
* 获取陌生群信息
|
|
1088
|
+
*/
|
|
1089
|
+
getNotJoinedGroupInfo(_groupId: string): Promise<GroupInfo>;
|
|
1090
|
+
/**
|
|
1091
|
+
* 获取艾特全体成员剩余次数
|
|
1092
|
+
*/
|
|
1093
|
+
getAtAllCount(_groupId: string): Promise<GetAtAllCountResponse>;
|
|
1094
|
+
/**
|
|
1095
|
+
* 获取群被禁言用户列表
|
|
1096
|
+
*/
|
|
1097
|
+
getGroupMuteList(_groupId: string): Promise<Array<GetGroupMuteListResponse>>;
|
|
1098
|
+
/**
|
|
1099
|
+
* 戳一戳用户
|
|
1100
|
+
*/
|
|
1101
|
+
pokeUser(_contact: Contact, _targetId: string, _count?: number): Promise<boolean>;
|
|
1102
|
+
/**
|
|
1103
|
+
* 获取 Cookies
|
|
1104
|
+
*/
|
|
1105
|
+
getCookies(_domain: string): Promise<{
|
|
1106
|
+
cookie: string;
|
|
1107
|
+
}>;
|
|
1108
|
+
/**
|
|
1109
|
+
* 获取 QQ 相关接口凭证
|
|
1110
|
+
*/
|
|
1111
|
+
getCredentials(_domain: string): Promise<{
|
|
1112
|
+
cookies: string;
|
|
1113
|
+
csrf_token: number;
|
|
1114
|
+
}>;
|
|
1115
|
+
/**
|
|
1116
|
+
* 获取 CSRF Token
|
|
1117
|
+
*/
|
|
1118
|
+
getCSRFToken(): Promise<{
|
|
1119
|
+
token: number;
|
|
1120
|
+
}>;
|
|
1121
|
+
/**
|
|
1122
|
+
* 设置头像
|
|
1123
|
+
*/
|
|
1124
|
+
setAvatar(_file: string): Promise<void>;
|
|
1125
|
+
/**
|
|
1126
|
+
* 获取 rkey
|
|
1127
|
+
*/
|
|
1128
|
+
getRkey(): Promise<Array<GetRkeyResponse>>;
|
|
1129
|
+
/**
|
|
1130
|
+
* 获取群 Ai 语音可用声色列表
|
|
1131
|
+
*/
|
|
1132
|
+
getAiCharacters(): Promise<Array<GetAiCharactersResponse>>;
|
|
1133
|
+
/**
|
|
1134
|
+
* 设置群 Ai 语音声色
|
|
1135
|
+
*/
|
|
1136
|
+
sendAiCharacter(_groupId: string, _characterId: string, _text: string): Promise<{
|
|
1137
|
+
messageId: string;
|
|
1138
|
+
}>;
|
|
1139
|
+
}
|
|
1140
|
+
//#endregion
|
|
1141
|
+
export type { AdapterQQBot };
|