oicq-icalingua-plus-plus 1.22.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.
Files changed (50) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +73 -0
  3. package/bin/oicq +2 -0
  4. package/http-api/README.md +187 -0
  5. package/http-api/api.js +217 -0
  6. package/http-api/config.sample.js +44 -0
  7. package/http-api/core.js +480 -0
  8. package/http-api/cq-notice.js +39 -0
  9. package/http-api/filter.js +128 -0
  10. package/http-api/index.js +39 -0
  11. package/index.d.ts +1214 -0
  12. package/index.js +34 -0
  13. package/lib/algo/jce/index.js +63 -0
  14. package/lib/algo/jce/jce.js +341 -0
  15. package/lib/algo/pb.js +159 -0
  16. package/lib/algo/protobuf.min.js +8 -0
  17. package/lib/algo/tea.js +121 -0
  18. package/lib/client-ext.js +312 -0
  19. package/lib/client-net.js +147 -0
  20. package/lib/client.js +594 -0
  21. package/lib/common.js +252 -0
  22. package/lib/core/friendlist.js +415 -0
  23. package/lib/core/nessy.js +148 -0
  24. package/lib/core/ref.d.ts +1 -0
  25. package/lib/core/sysmsg.js +388 -0
  26. package/lib/core/troop.js +586 -0
  27. package/lib/device.js +181 -0
  28. package/lib/exception.js +57 -0
  29. package/lib/message/builder.js +1093 -0
  30. package/lib/message/chat.js +276 -0
  31. package/lib/message/face.js +293 -0
  32. package/lib/message/file.js +425 -0
  33. package/lib/message/history.js +73 -0
  34. package/lib/message/image.js +533 -0
  35. package/lib/message/multi.js +242 -0
  36. package/lib/message/music.js +172 -0
  37. package/lib/message/parser.js +774 -0
  38. package/lib/message/ptt.js +389 -0
  39. package/lib/oicq.js +427 -0
  40. package/lib/onlinepush.js +616 -0
  41. package/lib/ref.d.ts +177 -0
  42. package/lib/service.js +204 -0
  43. package/lib/wtlogin/ecdh.js +15 -0
  44. package/lib/wtlogin/login-password.js +215 -0
  45. package/lib/wtlogin/login-qrcode.js +249 -0
  46. package/lib/wtlogin/tlv.js +331 -0
  47. package/lib/wtlogin/writer.js +88 -0
  48. package/lib/wtlogin/wt.js +422 -0
  49. package/package.json +50 -0
  50. package/util.js +115 -0
package/index.d.ts ADDED
@@ -0,0 +1,1214 @@
1
+ // Project: https://github.com/takayama-lily/oicq
2
+
3
+ /// <reference types="node" />
4
+
5
+ import { EventEmitter } from 'events';
6
+ import { OutgoingHttpHeaders } from 'http';
7
+ import * as log4js from 'log4js';
8
+
9
+ export type Uin = number;
10
+
11
+ /** 大多数情况下你无需关心这些配置项,因为默认配置就是最常用的,除非你需要一些与默认不同的规则 */
12
+ export interface ConfBot {
13
+
14
+ /** 日志等级,默认info (往屏幕打印日志会降低性能,若消息量巨大建议修改此参数或重定向) */
15
+ log_level?: "trace" | "debug" | "info" | "warn" | "error" | "fatal" | "mark" | "off",
16
+ /** 1:安卓手机(默认) 2:aPad 3:安卓手表 4:MacOS 5:iPad */
17
+ platform?: number,
18
+ /** 被踢下线是否在3秒后重新登陆,默认false */
19
+ kickoff?: boolean,
20
+ /** 群聊是否屏蔽自己的发言,默认true */
21
+ ignore_self?: boolean,
22
+ /** 被风控时是否尝试用分片发送,默认true */
23
+ resend?: boolean,
24
+ /** raw_message里是否不使用CQ码字符串,而是使用简短易读的形式(如:"[图片][表情]"),可以加快解析速度,默认false */
25
+ brief?: boolean,
26
+ /** 数据存储文件夹,需要可写权限,默认主模块下的data文件夹 */
27
+ data_dir?: string,
28
+
29
+ //触发system.offline.network事件后的重连间隔秒数,默认5(秒),不建议设置低于3(秒)
30
+ //设置为0则不会自动重连,然后你可以监听此事件自己处理
31
+ reconn_interval?: number,
32
+
33
+ //一些内部缓存(如群员详细资料、群详细资料等)的生命周期,默认3600(秒)
34
+ //即使不用相关API(使用`no_cache=true`)强制刷新数据,超过这个时间后内部也会自动刷新
35
+ internal_cache_life?: number,
36
+
37
+ /** 自动选择最优服务器(默认true),关闭后会一直使用`msfwifi.3g.qq.com`进行连接 */
38
+ auto_server?: boolean;
39
+
40
+ /** 手动指定ip和port,不推荐使用,大多数情况下你应该使用auto_server */
41
+ remote_ip?: string,
42
+ remote_port?: number,
43
+
44
+ /** ffmpeg */
45
+ ffmpeg_path?: string,
46
+ ffprobe_path?: string,
47
+ }
48
+
49
+ export interface Statistics {
50
+ readonly start_time: number, //启动时刻
51
+ readonly lost_times: number, //断线次数
52
+ readonly recv_pkt_cnt: number, //收到包总数
53
+ readonly sent_pkt_cnt: number, //发送包总数
54
+ readonly lost_pkt_cnt: number, //丢包总数
55
+ readonly recv_msg_cnt: number, //收到消息总数
56
+ readonly sent_msg_cnt: number, //发送消息总数
57
+ readonly msg_cnt_per_min: number, //每分钟消息数
58
+ readonly remote_ip: string,
59
+ readonly remote_port: number,
60
+ }
61
+
62
+ /** @deprecated */
63
+ export interface Status {
64
+ online: boolean,
65
+ status: number, //在线状态
66
+ remote_ip?: number,
67
+ remote_port?: number,
68
+ msg_cnt_per_min: number, //每分钟消息数
69
+ statistics: Statistics,
70
+ config: ConfBot,
71
+ }
72
+
73
+ /** @deprecated */
74
+ export type LoginInfo = StrangerInfo;
75
+
76
+ export type GroupRole = "owner" | "admin" | "member";
77
+ export type Gender = "male" | "female" | "unknown";
78
+
79
+ //////////
80
+
81
+ export interface RetError {
82
+ code: number,
83
+ message: string,
84
+ }
85
+ interface RetSuccess<T> {
86
+ retcode: 0,
87
+ status: "ok",
88
+ data: T,
89
+ error: null,
90
+ }
91
+ interface RetAsync {
92
+ retcode: 1,
93
+ status: "async",
94
+ data: null,
95
+ error: null,
96
+ }
97
+ interface RetFailure {
98
+ retcode: 100 | 102 | 103 | 104, //100error 102failed 103timeout 104offline
99
+ status: "failed",
100
+ data: null,
101
+ error: RetError,
102
+ }
103
+ export type Ret<T = null> = RetSuccess<T> | RetAsync | RetFailure;
104
+ export type RetCommon = Ret;
105
+
106
+ //////////
107
+
108
+ /** 陌生人资料 */
109
+ export interface StrangerInfo {
110
+ readonly user_id: number, //账号
111
+ readonly nickname: string, //昵称
112
+ readonly sex: Gender, //性别
113
+ readonly age: number, //年龄
114
+ readonly area?: string, //地区
115
+ readonly signature?: string, //个性签名
116
+ readonly description?: string, //个人说明
117
+ readonly group_id?: number, //临时会话群号
118
+ }
119
+ /** 好友资料 */
120
+ export interface FriendInfo extends StrangerInfo {
121
+ readonly remark: string //好友备注
122
+ }
123
+ /** 群资料 */
124
+ export interface GroupInfo {
125
+ readonly group_id: number, //群号
126
+ readonly group_name: string, //群名
127
+ readonly member_count: number, //群员数
128
+ readonly max_member_count: number, //最大群员数
129
+ readonly owner_id: number, //群主账号
130
+ readonly last_join_time: number, //最后入群时间
131
+ readonly last_sent_time: number, //最后发言时间
132
+ readonly shutup_time_whole: number, //全员禁言到期时间
133
+ readonly shutup_time_me: number, //我的禁言到期时间
134
+ readonly create_time: number, //创建时间
135
+ readonly grade: number, //群等级
136
+ readonly max_admin_count: number, //最大管理员数
137
+ readonly active_member_count: number, //活跃群员数
138
+ readonly update_time: number, //当前群资料的最后更新时间
139
+ }
140
+ /** 群员基础资料 */
141
+ export interface MemberBaseInfo {
142
+ readonly user_id: number,
143
+ readonly nickname: string,
144
+ readonly card: string, //群名片
145
+ readonly sex: Gender,
146
+ readonly age: number,
147
+ readonly area: string,
148
+ readonly level: number, //等级
149
+ readonly role: GroupRole, //权限
150
+ readonly title: string, //头衔
151
+ }
152
+ /** 群员资料 */
153
+ export interface MemberInfo extends MemberBaseInfo {
154
+ readonly group_id: number,
155
+ // readonly user_id: number,
156
+ // readonly nickname: string,
157
+ // readonly card: string,
158
+ // readonly sex: Gender,
159
+ // readonly age: number,
160
+ // readonly area: string,
161
+ readonly join_time: number, //入群时间
162
+ readonly last_sent_time: number, //最后发言时间
163
+ // readonly level: number,
164
+ readonly rank: string,
165
+ // readonly role: GroupRole,
166
+ /** @deprecated */
167
+ readonly unfriendly: boolean,
168
+ // readonly title: string,
169
+ readonly title_expire_time: number, //头衔过期时间
170
+ /** @deprecated */
171
+ readonly card_changeable: boolean,
172
+ readonly shutup_time: number, //禁言到期时间
173
+ readonly update_time: number, //此群员资料的最后更新时间
174
+ }
175
+
176
+ ////////// Message Elements
177
+
178
+ /**
179
+ * 使用cqhttp风格的消息元素类型
180
+ * @see https://github.com/howmanybots/onebot/blob/master/v11/specs/message/segment.md 在此基础上进行了扩展
181
+ */
182
+ export type MessageElem = TextElem | AtElem | FaceElem | BfaceElem | MfaceElem |
183
+ ImgPttElem | LocationElem | MusicElem | ShareElem | JsonElem | XmlElem |
184
+ AnonymousElem | ReplyElem | NodeElem | ShakeElem | PokeElem | FileElem | VideoElem | MiraiElem;
185
+
186
+ export type Sendable = string | MessageElem | Iterable<MessageElem | string>
187
+
188
+ /** 一般文本 */
189
+ export interface TextElem {
190
+ type: "text",
191
+ data: {
192
+ text: string
193
+ }
194
+ }
195
+
196
+ export interface AtElem {
197
+ type: "at",
198
+ data: {
199
+ qq: number | "all",
200
+ text?: string, //at失败时显示的文本
201
+ dummy?: boolean, //假at
202
+ }
203
+ }
204
+
205
+ /** 经典表情 */
206
+ export interface FaceElem {
207
+ type: "face" | "sface",
208
+ data: {
209
+ id: number,
210
+ text?: string
211
+ }
212
+ }
213
+
214
+ /** 原创表情 */
215
+ export interface BfaceElem {
216
+ type: "bface",
217
+ data: {
218
+ file: string,
219
+ text: string
220
+ }
221
+ }
222
+
223
+ /** 魔法表情 */
224
+ export interface MfaceElem {
225
+ type: "rps" | "dice", //猜拳和骰子
226
+ data: {
227
+ id: number,
228
+ }
229
+ }
230
+
231
+ /**
232
+ * @typedef MediaFile 为string时等同于[CQ:image]中的file参数
233
+ * string支持以下写法:
234
+ * http(s)://
235
+ * base64://
236
+ * /tmp/example.jpg 本地绝对路径
237
+ * example.jpg 本地相对(于启动目录的)路径
238
+ * file:///
239
+ * protobuf:// 仅用于语音和视频的转发
240
+ */
241
+ export type MediaFile = string | Uint8Array | ArrayBuffer | SharedArrayBuffer;
242
+
243
+ /** 图片,闪照,语音 */
244
+ export interface ImgPttElem {
245
+ type: "image" | "flash" | "record",
246
+ data: {
247
+ file: MediaFile,
248
+ cache?: boolean, //file为网络资源时是否使用缓存
249
+ timeout?: number, //file为网络资源时请求超时时间
250
+ headers?: OutgoingHttpHeaders, //file为网络资源时请求头
251
+ url?: string, //仅接收
252
+ type?: "image" | "flash" | "face",
253
+ }
254
+ }
255
+
256
+ /** 视频 */
257
+ export interface VideoElem {
258
+ type: "video",
259
+ data: {
260
+ file: string, //发送仅支持本地文件路径或转发
261
+ url?: string, //仅接收
262
+ }
263
+ }
264
+
265
+ /** 地点分享 */
266
+ export interface LocationElem {
267
+ type: "location",
268
+ data: {
269
+ address: string,
270
+ lat: number, //经纬度
271
+ lng: number, //经纬度
272
+ name?: string,
273
+ id?: string,
274
+ }
275
+ }
276
+
277
+ export type MusicType = "qq" | "163" | "migu" | "kugou" | "kuwo";
278
+ /** 音乐分享 */
279
+ export interface MusicElem {
280
+ type: "music",
281
+ data: {
282
+ type: MusicType,
283
+ id: string,
284
+ }
285
+ }
286
+
287
+ /** 链接分享 */
288
+ export interface ShareElem {
289
+ type: "share",
290
+ data: {
291
+ url: string,
292
+ title: string,
293
+ content?: string,
294
+ image?: string,
295
+ }
296
+ }
297
+
298
+ export interface JsonElem {
299
+ type: "json",
300
+ data: {
301
+ data: any, // a json string or a json object
302
+ text?: string,
303
+ }
304
+ }
305
+
306
+ export interface XmlElem {
307
+ type: "xml",
308
+ data: {
309
+ data: string,
310
+ type?: number, //type为35的是合并转发
311
+ text?: string,
312
+ }
313
+ }
314
+
315
+ /** 匿名消息 */
316
+ export interface AnonymousElem {
317
+ type: "anonymous",
318
+ data?: {
319
+ ignore?: boolean, //匿名失败时是否继续发送,default: true
320
+ }
321
+ }
322
+
323
+ /** 回复 */
324
+ export interface ReplyElem {
325
+ type: "reply",
326
+ data: {
327
+ id: string, //message_id
328
+ }
329
+ }
330
+
331
+ export interface NodeElem {
332
+ type: "node",
333
+ data: {
334
+ id: string,
335
+ }
336
+ }
337
+
338
+ /** 窗口抖动 */
339
+ export interface ShakeElem {
340
+ type: "shake",
341
+ }
342
+
343
+ /** 戳一戳 */
344
+ export interface PokeElem {
345
+ type: "poke",
346
+ data: {
347
+ type: number, //0~6
348
+ id?: number,
349
+ }
350
+ }
351
+
352
+ /** 该元素仅mirai系的客户端可解析,官方客户端无法识别 */
353
+ export interface MiraiElem {
354
+ type: "mirai",
355
+ data: {
356
+ data: string,
357
+ }
358
+ }
359
+
360
+ /** 文件(仅接受) */
361
+ export interface FileElem {
362
+ type: "file",
363
+ data: {
364
+ name: string,
365
+ url: string,
366
+ size: number,
367
+ md5: string,
368
+ duration: number,
369
+ /** @deprecated */
370
+ busid: number,
371
+ /** @deprecated */
372
+ fileid: string,
373
+ fid: string,
374
+ }
375
+ }
376
+
377
+ ////////// Events
378
+
379
+ export interface CommonEventData {
380
+ self_id: number,
381
+ time: number,
382
+ post_type: "system" | "request" | "message" | "notice" | "sync" | string,
383
+ sub_type?: string,
384
+ }
385
+
386
+ // system events
387
+ export interface CommonSystemEventData extends CommonEventData {
388
+ post_type: "system",
389
+ }
390
+ export interface QrcodeEventData extends CommonSystemEventData {
391
+ system_type: "login",
392
+ sub_type: "qrcode", //收到二维码
393
+ image: Buffer,
394
+ }
395
+ export interface SliderEventData extends CommonSystemEventData {
396
+ system_type: "login",
397
+ sub_type: "slider", //收到滑动验证码
398
+ url: string, //滑动地址
399
+ }
400
+ export interface DeviceEventData extends CommonSystemEventData {
401
+ system_type: "login",
402
+ sub_type: "device", //收到设备锁验证请求
403
+ url: string, //验证地址
404
+ phone: string, //密保手机
405
+ }
406
+ export interface LoginErrorEventData extends CommonSystemEventData {
407
+ system_type: "login",
408
+ sub_type: "error", //登录遇到错误
409
+ code: number, //错误码
410
+ message: string, //错误消息
411
+ }
412
+ export interface OnlineEventData extends CommonSystemEventData {
413
+ system_type: "online", //上线
414
+ }
415
+ export interface OfflineEventData extends CommonSystemEventData {
416
+ system_type: "offline", //掉线
417
+ sub_type: "network" | "kickoff" | "frozen" | "unknown",
418
+ message: string, //掉线原因
419
+ }
420
+
421
+ // request events
422
+ interface CommonRequestEventData extends CommonEventData {
423
+ post_type: "request",
424
+ user_id: number,
425
+ nickname: string,
426
+ flag: string, //同意或拒绝时传入
427
+ }
428
+ export interface FriendAddEventData extends CommonRequestEventData {
429
+ request_type: "friend",
430
+ sub_type: "add" | "single", //加好友请求
431
+ comment: string, //附加信息
432
+ source: string, //来源(如"条件查找")
433
+ age: number,
434
+ sex: Gender,
435
+ }
436
+ export interface GroupAddEventData extends CommonRequestEventData {
437
+ request_type: "group",
438
+ sub_type: "add", //加群请求
439
+ group_id: number,
440
+ group_name: string,
441
+ comment: string, //附加信息
442
+ inviter_id?: number, //邀请者(来自群员的邀请时)
443
+ tips: string, //如"该帐号存在风险,请谨慎操作"
444
+ }
445
+ export interface GroupInviteEventData extends CommonRequestEventData {
446
+ request_type: "group",
447
+ sub_type: "invite", //群邀请
448
+ group_id: number,
449
+ group_name: string,
450
+ role: GroupRole, //邀请者权限
451
+ }
452
+
453
+ // message events
454
+ interface CommonMessageEventData extends CommonEventData {
455
+ post_type: "message",
456
+ message: MessageElem[], //消息链
457
+ raw_message: string, //字符串格式的消息
458
+ message_id: string,
459
+ user_id: number,
460
+ font: string,
461
+ reply(message: Sendable, auto_escape?: boolean): Promise<Ret<{ message_id: string }>>,
462
+ }
463
+ export interface PrivateMessageEventData extends CommonMessageEventData {
464
+ message_type: "private", //私聊消息
465
+ sub_type: "friend" | "group" | "single" | "other" | "self",
466
+ sender: FriendInfo,
467
+ auto_reply: boolean, //是否自动回复
468
+ }
469
+ export interface GroupMessageEventData extends CommonMessageEventData {
470
+ message_type: "group", //群消息
471
+ sub_type: "normal" | "anonymous",
472
+ group_id: number,
473
+ group_name: string,
474
+ anonymous: Anonymous | null, //匿名消息
475
+ sender: MemberBaseInfo,
476
+ atme: boolean,
477
+ seqid: number,
478
+ block: boolean, //是否已屏蔽
479
+ }
480
+ export interface Anonymous {
481
+ id: number,
482
+ name: string,
483
+ flag: string,
484
+ }
485
+ export interface DiscussMessageEventData extends CommonMessageEventData {
486
+ message_type: "discuss", //讨论组消息
487
+ discuss_id: number,
488
+ discuss_name: string,
489
+ atme: boolean,
490
+ sender: {
491
+ user_id: number,
492
+ nickname: string,
493
+ card: string,
494
+ },
495
+ }
496
+
497
+ // notice events
498
+ interface CommonFriendNoticeEventData extends CommonEventData {
499
+ post_type: "notice",
500
+ notice_type: "friend",
501
+ }
502
+ export interface FriendRecallEventData extends CommonFriendNoticeEventData {
503
+ sub_type: "recall", //好友消息撤回
504
+ user_id: number, //好友号
505
+ operator_id: number, //撤回者(好友或自己)
506
+ message_id: string,
507
+ }
508
+ export interface FriendProfileEventData extends CommonFriendNoticeEventData {
509
+ sub_type: "profile", //好友资料变更
510
+ user_id: number,
511
+ nickname?: string,
512
+ signature?: string,
513
+ }
514
+ export interface FriendIncreaseEventData extends CommonFriendNoticeEventData {
515
+ sub_type: "increase", //好友增加
516
+ user_id: number,
517
+ nickname: string,
518
+ }
519
+ export interface FriendDecreaseEventData extends CommonFriendNoticeEventData {
520
+ sub_type: "decrease", //好友减少
521
+ user_id: number,
522
+ nickname: string,
523
+ }
524
+ export interface FriendPokeEventData extends CommonFriendNoticeEventData {
525
+ sub_type: "poke", //好友戳一戳
526
+ user_id: number, //好友号
527
+ operator_id: number, //poke者
528
+ target_id: number, //被poke者
529
+ action: string, //动作名
530
+ suffix: string, //后缀
531
+ }
532
+
533
+ interface CommonGroupNoticeEventData extends CommonEventData {
534
+ post_type: "notice",
535
+ notice_type: "group",
536
+ }
537
+ export interface GroupPokeEventData extends CommonGroupNoticeEventData {
538
+ sub_type: "poke", //群戳一戳
539
+ group_id: number, //群号
540
+ operator_id: number, //poke者
541
+ user_id: number, //被poke者
542
+ target_id: number, //被poke者
543
+ action: string, //动作名
544
+ suffix: string, //后缀
545
+ }
546
+ export interface MemberIncreaseEventData extends CommonGroupNoticeEventData {
547
+ sub_type: "increase", //群增加或群员增加
548
+ group_id: number,
549
+ user_id: number,
550
+ nickname: string,
551
+ }
552
+ export interface MemberDecreaseEventData extends CommonGroupNoticeEventData {
553
+ sub_type: "decrease", //群减少或群员减少
554
+ group_id: number,
555
+ operator_id: number, //踢人者
556
+ user_id: number, //被踢者
557
+ dismiss: boolean, //是否是解散
558
+ member?: MemberInfo, //该群员的最后资料(有缓存时提供)
559
+ group?: GroupInfo, //该群的最后资料(自己被踢或群解散时提供)
560
+ }
561
+ export interface GroupRecallEventData extends CommonGroupNoticeEventData {
562
+ sub_type: "recall", //群消息撤回
563
+ group_id: number,
564
+ operator_id: number, //撤回者
565
+ user_id: number, //被撤回者
566
+ message_id: string,
567
+ }
568
+ export interface GroupAdminEventData extends CommonGroupNoticeEventData {
569
+ sub_type: "admin", //管理员变更
570
+ group_id: number,
571
+ user_id: number,
572
+ set: boolean,
573
+ }
574
+ export interface GroupMuteEventData extends CommonGroupNoticeEventData {
575
+ sub_type: "ban", //群禁言
576
+ group_id: number,
577
+ operator_id: number, //禁言者
578
+ user_id: number, //被禁言者(全员禁言为0)
579
+ nickname?: string, //匿名者昵称(当user_id为80000000时提供)
580
+ duration: number, //时长
581
+ }
582
+ export interface GroupTransferEventData extends CommonGroupNoticeEventData {
583
+ sub_type: "transfer", //群转让
584
+ group_id: number,
585
+ operator_id: number, //旧群主
586
+ user_id: number, //新群主
587
+ }
588
+ export interface GroupTitleEventData extends CommonGroupNoticeEventData {
589
+ sub_type: "title", //群头衔变更(暂未实现该事件)
590
+ group_id: number,
591
+ user_id: number,
592
+ nickname: string,
593
+ title: string,
594
+ }
595
+ export interface GroupSettingEventData extends CommonGroupNoticeEventData {
596
+ sub_type: "setting", //群设置变更
597
+ group_id: number,
598
+ group_name?: string, //群名变更
599
+ enable_guest?: boolean, //允许游客
600
+ enable_anonymous?: boolean, //允许匿名
601
+ enable_upload_album?: boolean, //允许群员上传相册
602
+ enable_upload_file?: boolean, //允许群员上传文件
603
+ enable_temp_chat?: boolean, //允许发起临时会话
604
+ enable_new_group?: boolean, //允许发起新群
605
+ enable_show_honor?: boolean, //显示群员荣誉
606
+ enable_show_level?: boolean, //显示群员等级
607
+ enable_show_title?: boolean, //显示群员头衔
608
+ enable_confess?: boolean, //开关坦白说
609
+ avatar?: boolean, //头像变更
610
+ }
611
+
612
+ //sync events 同一账号的其他客户端做了某些操作而触发的事件
613
+ export interface SyncMessageEventData extends Omit<PrivateMessageEventData, "post_type" | "message_type" | "reply"> {
614
+ post_type: "sync",
615
+ sync_type: "message", //同步其他客户端发送的私聊
616
+ }
617
+ export interface SyncStatusEventData extends CommonEventData {
618
+ post_type: "sync",
619
+ sync_type: "status", //同步在线状态
620
+ old_status: number,
621
+ new_status: number,
622
+ }
623
+ export interface SyncProfileEventData extends CommonEventData {
624
+ post_type: "sync",
625
+ sync_type: "profile", //同步个人资料
626
+ nickname?: string,
627
+ sex?: Gender,
628
+ age?: number,
629
+ signature?: string,
630
+ description?: string,
631
+ avatar?: boolean,
632
+ }
633
+ export interface SyncReadedEventData extends CommonEventData {
634
+ post_type: "sync",
635
+ sync_type: "readed", //同步已读
636
+ sub_type: "private" | "group",
637
+ user_id?: number,
638
+ timestamp?: number, //私聊以时间戳分界
639
+ group_id?: number,
640
+ seqid?: number, //群聊以seqid分界
641
+ }
642
+ export interface SyncBlackEventData extends CommonEventData {
643
+ post_type: "sync",
644
+ sync_type: "black", //同步黑名单
645
+ blacklist: number[],
646
+ }
647
+
648
+ export type FriendNoticeEventData = FriendIncreaseEventData | FriendDecreaseEventData | FriendRecallEventData |
649
+ FriendProfileEventData | FriendPokeEventData; //5
650
+ export type GroupNoticeEventData = GroupRecallEventData | GroupSettingEventData | GroupTitleEventData |
651
+ GroupTransferEventData | GroupMuteEventData | GroupAdminEventData |
652
+ MemberIncreaseEventData | MemberDecreaseEventData | GroupPokeEventData; //9
653
+
654
+ export type SystemEventData = DeviceEventData | SliderEventData | LoginErrorEventData | QrcodeEventData |
655
+ OfflineEventData | OnlineEventData; //6(4+2)
656
+ export type RequestEventData = FriendAddEventData | GroupAddEventData | GroupInviteEventData; //3
657
+ export type MessageEventData = PrivateMessageEventData | GroupMessageEventData | DiscussMessageEventData; //3
658
+ export type NoticeEventData = FriendNoticeEventData | GroupNoticeEventData; //2
659
+ export type SyncEventData = SyncMessageEventData | SyncProfileEventData | SyncStatusEventData | SyncReadedEventData | SyncBlackEventData; //5
660
+ export type EventData = SystemEventData | RequestEventData | MessageEventData | NoticeEventData | SyncEventData; //5
661
+
662
+ ////////// group file system
663
+
664
+ export interface GfsBaseStat {
665
+ fid: string, //文件(夹)id
666
+ pid: string, //父文件夹id
667
+ name: string,
668
+ user_id: number, //创建者
669
+ create_time: number, //创建时间
670
+ }
671
+ export interface GfsFileStat extends GfsBaseStat {
672
+ size: number, //文件大小(字节)
673
+ busid: number,
674
+ md5: string,
675
+ sha1: string,
676
+ duration: number, //有效时间
677
+ download_times: number, //下载次数
678
+ }
679
+ export interface GfsDirStat extends GfsBaseStat {
680
+ file_count: number, //文件数
681
+ is_dir: true,
682
+ }
683
+ export type GfsStat = GfsFileStat | GfsDirStat;
684
+
685
+ /**
686
+ * 这里面的方法是会reject的,需要catch
687
+ * node15开始,unhandledRejection默认会升级为uncaughtException导致程序退出
688
+ */
689
+ export class Gfs {
690
+ private constructor();
691
+ /** 群号 */
692
+ readonly gid: number;
693
+ /** 查看文件属性(尽量不要对目录使用此方法) */
694
+ stat(fid: string): Promise<GfsStat>;
695
+ /** 列出文件,start从0开始,limit默认100(最大) */
696
+ ls(fid?: string, start?: number, limit?: number): Promise<GfsStat[]>;
697
+ /** ls的别名 */
698
+ dir: Gfs["ls"];
699
+ /** 创建目录 */
700
+ mkdir(name: string): Promise<GfsDirStat>;
701
+ /** 删除文件或目录(删除目标是目录的时候会删除下面的所有文件) */
702
+ rm(fid: string): Promise<void>;
703
+ /** 重命名文件或目录 */
704
+ rename(fid: string, name: string): Promise<void>;
705
+ /** 移动文件到其他目录 */
706
+ mv(fid: string, pid: string): Promise<void>;
707
+ /** 查看可用空间和文件数量 */
708
+ df(): Promise<{
709
+ total: number,
710
+ used: number,
711
+ free: number,
712
+ file_count: number,
713
+ max_file_count: number,
714
+ }>;
715
+ /** 上传文件(默认传到根目录),仅支持本地文件路径或Buffer */
716
+ upload(file: MediaFile, pid?: string, name?: string, process?: (percentage: string) => void): Promise<GfsFileStat>;
717
+ /** 获取文件的下载链接 */
718
+ download(fid: string): Promise<FileElem["data"]>;
719
+ }
720
+
721
+ //////////
722
+
723
+ export type Domain = "tenpay.com"
724
+ | "docs.qq.com"
725
+ | "office.qq.com"
726
+ | "connect.qq.com"
727
+ | "vip.qq.com"
728
+ | "mail.qq.com"
729
+ | "qzone.qq.com"
730
+ | "gamecenter.qq.com"
731
+ | "mma.qq.com"
732
+ | "game.qq.com"
733
+ | "qqweb.qq.com"
734
+ | "openmobile.qq.com"
735
+ | "qun.qq.com"
736
+ | "ti.qq.com"
737
+ | "";
738
+
739
+ export interface Sig {
740
+ srm_token: Buffer,
741
+ tgt: Buffer,
742
+ tgt_key: Buffer,
743
+ st_key: Buffer,
744
+ st_web_sig: Buffer,
745
+ skey: Buffer,
746
+ d2: Buffer,
747
+ d2key: Buffer,
748
+ sig_key: Buffer,
749
+ ticket_key: Buffer,
750
+ device_token?: Buffer,
751
+ emp_time: number,
752
+ }
753
+
754
+ export interface EventMap {
755
+ /**扫码登录收到二维码事件 */
756
+ "system.login.qrcode": (this: Client, data: QrcodeEventData) => void;
757
+ /**收到滑动验证码事件 */
758
+ "system.login.slider": (this: Client, data: SliderEventData) => void;
759
+ /**设备锁验证事件 */
760
+ "system.login.device": (this: Client, data: DeviceEventData) => void;
761
+ /**登录遇到错误事件 */
762
+ "system.login.error": (this: Client, data: LoginErrorEventData) => void;
763
+ "system.login": (this: Client, data: DeviceEventData | LoginErrorEventData | SliderEventData | QrcodeEventData) => void;
764
+ /**上线事件 */
765
+ "system.online": (this: Client, data: OnlineEventData) => void;
766
+
767
+ /**下线事件(网络原因) */
768
+ "system.offline.network": (this: Client, data: OfflineEventData) => void;
769
+ /**下线事件(被踢下线) */
770
+ "system.offline.kickoff": (this: Client, data: OfflineEventData) => void;
771
+ /**下线事件(账号被冻结) */
772
+ "system.offline.frozen": (this: Client, data: OfflineEventData) => void;
773
+ /**下线事件(未知原因) */
774
+ "system.offline.unknown": (this: Client, data: OfflineEventData) => void;
775
+ "system.offline": (this: Client, data: OfflineEventData) => void;
776
+
777
+ "system": (this: Client, data: SystemEventData) => void;
778
+
779
+ /**收到好友申请事件 */
780
+ "request.friend.add": (this: Client, data: FriendAddEventData) => void;
781
+ /**收到好友申请事件(对方已将你加为单向好友,可回添对方) */
782
+ "request.friend.single": (this: Client, data: FriendAddEventData) => void;
783
+ "request.friend": (this: Client, data: FriendAddEventData) => void;
784
+ /**收到加群申请事件 */
785
+ "request.group.add": (this: Client, data: GroupAddEventData) => void;
786
+ /**收到群邀请事件 */
787
+ "request.group.invite": (this: Client, data: GroupInviteEventData) => void
788
+ "request.group": (this: Client, data: GroupAddEventData | GroupInviteEventData) => void
789
+ /**监听以上所有request事件 */
790
+ "request": (this: Client, data: RequestEventData) => void;
791
+
792
+ /**私聊消息事件 */
793
+ "message.private.friend": (this: Client, data: PrivateMessageEventData) => void; //从双向好友
794
+ "message.private.group": (this: Client, data: PrivateMessageEventData) => void; //从群临时会话
795
+ "message.private.single": (this: Client, data: PrivateMessageEventData) => void; //从单向好友
796
+ "message.private.other": (this: Client, data: PrivateMessageEventData) => void;
797
+ "message.private.self": (this: Client, data: PrivateMessageEventData) => void; //从我的设备
798
+ "message.private": (this: Client, data: PrivateMessageEventData) => void;
799
+
800
+ /**群消息事件 */
801
+ "message.group": (this: Client, data: GroupMessageEventData) => void;
802
+ "message.group.normal": (this: Client, data: GroupMessageEventData) => void; //普通消息
803
+ "message.group.anonymous": (this: Client, data: GroupMessageEventData) => void; //匿名消息
804
+ /**讨论组消息事件 */
805
+ "message.discuss": (this: Client, data: DiscussMessageEventData) => void;
806
+ /**监听以上所有message事件 */
807
+ "message": (this: Client, data: MessageEventData) => void;
808
+
809
+ /**新增好友事件 */
810
+ "notice.friend.increase": (this: Client, data: FriendIncreaseEventData) => void;
811
+ /**好友(被)删除事件 */
812
+ "notice.friend.decrease": (this: Client, data: FriendDecreaseEventData) => void;
813
+ /**好友消息撤回事件 */
814
+ "notice.friend.recall": (this: Client, data: FriendRecallEventData) => void;
815
+ /**好友资料变更事件 */
816
+ "notice.friend.profile": (this: Client, data: FriendProfileEventData) => void;
817
+ /**好友戳一戳事件 */
818
+ "notice.friend.poke": (this: Client, data: FriendPokeEventData) => void;
819
+ /**入群・群员增加事件 */
820
+ "notice.group.increase": (this: Client, data: MemberIncreaseEventData) => void;
821
+ /**踢群・退群事件 */
822
+ "notice.group.decrease": (this: Client, data: MemberDecreaseEventData) => void;
823
+ /**群消息撤回事件 */
824
+ "notice.group.recall": (this: Client, data: GroupRecallEventData) => void;
825
+ /**管理员变更事件 */
826
+ "notice.group.admin": (this: Client, data: GroupAdminEventData) => void;
827
+ /**群禁言事件 */
828
+ "notice.group.ban": (this: Client, data: GroupMuteEventData) => void;
829
+ /**群转让事件 */
830
+ "notice.group.transfer": (this: Client, data: GroupTransferEventData) => void;
831
+ /**群头衔变更事件 */
832
+ "notice.group.title": (this: Client, data: GroupTitleEventData) => void;
833
+ /**群戳一戳事件 */
834
+ "notice.group.poke": (this: Client, data: GroupPokeEventData) => void;
835
+ /**群设置变更事件 */
836
+ "notice.group.setting": (this: Client, data: GroupSettingEventData) => void;
837
+ /**监听以上所有好友notice事件 */
838
+ "notice.friend": (this: Client, data: FriendNoticeEventData) => void;
839
+ /**监听以上所有群notice事件 */
840
+ "notice.group": (this: Client, data: GroupNoticeEventData) => void;
841
+ /**监听以上所有notice事件 */
842
+ "notice": (this: Client, data: NoticeEventData) => void;
843
+
844
+ /**同账号其他客户端发送私聊事件 */
845
+ "sync.message": (this: Client, data: SyncMessageEventData) => void;
846
+ /**个人资料修改事件 */
847
+ "sync.profile": (this: Client, data: SyncProfileEventData) => void;
848
+ /**在线状态修改事件 */
849
+ "sync.status": (this: Client, data: SyncStatusEventData) => void;
850
+ /** @deprecated 黑名单修改事件 */
851
+ "sync.black": (this: Client, data: SyncBlackEventData) => void;
852
+ /**消息已读事件 */
853
+ "sync.readed": (this: Client, data: SyncReadedEventData) => void;
854
+ "sync.readed.private": (this: Client, data: SyncReadedEventData) => void;
855
+ "sync.readed.group": (this: Client, data: SyncReadedEventData) => void;
856
+ /**监听以上所有sync事件 */
857
+ "sync": (this: Client, data: SyncEventData) => void;
858
+
859
+ /** 实验性事件: 监听所有收到的包(已解密) */
860
+ "internal.sso": (this: Client, data: { cmd: string, seq: number, payload: Buffer }) => void;
861
+ /** 实验性事件: 对方正在输入 */
862
+ "internal.input": (this: Client, data: { user_id: number, end: boolean }) => void;
863
+ }
864
+
865
+ /**
866
+ * 方法不会reject或抛出异常,使用retcode判断是否成功
867
+ * @see {Ret}
868
+ */
869
+ export class Client extends EventEmitter {
870
+
871
+ readonly uin: number;
872
+ readonly password_md5?: Buffer;
873
+ readonly nickname: string;
874
+ readonly sex: Gender;
875
+ readonly age: number;
876
+ readonly bkn: number; //csrf token
877
+ readonly cookies: {[k in Domain]: string};
878
+ readonly sig: Sig;
879
+ /** 在线状态 */
880
+ readonly online_status: number;
881
+ /** 好友列表 */
882
+ readonly fl: ReadonlyMap<number, FriendInfo>;
883
+ /** 陌生人列表 */
884
+ readonly sl: ReadonlyMap<number, StrangerInfo>;
885
+ /** 群列表 */
886
+ readonly gl: ReadonlyMap<number, GroupInfo>;
887
+ /** 群员列表缓存 */
888
+ readonly gml: ReadonlyMap<number, ReadonlyMap<number, MemberInfo>>;
889
+ /** 黑名单 */
890
+ readonly blacklist: ReadonlySet<number>;
891
+ /** 日志记录器 */
892
+ readonly logger: log4js.Logger;
893
+ /** 当前账号本地存储路径 */
894
+ readonly dir: string;
895
+ /** 配置信息(大部分参数支持热修改) */
896
+ readonly config: ConfBot;
897
+ /** 数据统计信息 */
898
+ readonly stat: Statistics;
899
+
900
+ constructor(uin: number, config?: ConfBot);
901
+
902
+ /**
903
+ * @param password 明文或md5后的密码,使用扫码登录可无需传入此参数
904
+ */
905
+ login(password?: Uint8Array | string): void;
906
+
907
+ /** 提交滑动验证码ticket */
908
+ sliderLogin(ticket: string): void;
909
+ /** 先下线再关闭连接 */
910
+ logout(): Promise<void>;
911
+ /** 直接关闭连接 */
912
+ terminate(): void;
913
+ isOnline(): boolean;
914
+
915
+ /** 发验证码给密保手机,用于发短信过设备锁 */
916
+ sendSMSCode(): void;
917
+ /** 提交收到的短信验证码 */
918
+ submitSMSCode(code: string): void;
919
+
920
+ /**
921
+ * 设置在线状态
922
+ * @param status 11我在线上 31离开 41隐身 50忙碌 60Q我吧 70请勿打扰
923
+ */
924
+ setOnlineStatus(status: number): Promise<Ret>;
925
+
926
+ /** 获取群员列表 */
927
+ getGroupMemberList(group_id: number, no_cache?: boolean): Promise<Ret<ReadonlyMap<number, MemberInfo>>>;
928
+ /** 获取群员资料 */
929
+ getGroupMemberInfo(group_id: number, user_id: number, no_cache?: boolean): Promise<Ret<MemberInfo>>;
930
+ /** 获取陌生人资料 */
931
+ getStrangerInfo(user_id: number, no_cache?: boolean): Promise<Ret<StrangerInfo>>;
932
+ /** 获取群资料(该方法一般用于刷新群资料缓存,从缓存中获取直接访问 this.gl.get(gid) 即可) */
933
+ getGroupInfo(group_id: number, no_cache?: boolean): Promise<Ret<GroupInfo>>;
934
+
935
+ /** 私聊 */
936
+ sendPrivateMsg(user_id: number, message: Sendable, auto_escape?: boolean): Promise<Ret<{ message_id: string }>>;
937
+ /** 群聊 */
938
+ sendGroupMsg(group_id: number, message: Sendable, auto_escape?: boolean): Promise<Ret<{ message_id: string }>>;
939
+ /** 群临时会话,大多数时候可以使用私聊达到同样效果 */
940
+ sendTempMsg(group_id: number, user_id: number, message: Sendable, auto_escape?: boolean): Promise<Ret<{ message_id: string }>>;
941
+ /** 讨论组 */
942
+ sendDiscussMsg(discuss_id: number, message: Sendable, auto_escape?: boolean): Promise<Ret>;
943
+ /** 撤回 */
944
+ deleteMsg(message_id: string): Promise<Ret>;
945
+ /** 置消息已读(message_id及之前的消息将全部变为已读) */
946
+ reportReaded(message_id: string): Promise<Ret>;
947
+ /** 获取一条消息(无法获取被撤回的消息) */
948
+ getMsg(message_id: string): Promise<Ret<PrivateMessageEventData | GroupMessageEventData>>;
949
+
950
+ /**
951
+ * 获取message_id往前的count条消息(包括自身)
952
+ * 无法获取被撤回的消息,因此返回的数量并不一定为count
953
+ * count默认为20,不能超过20
954
+ *
955
+ * 若要获取最新的20条消息,参考https://github.com/takayama-lily/oicq/wiki/93.%E8%A7%A3%E6%9E%90%E6%B6%88%E6%81%AFID
956
+ * 自行构造消息id,除群号外其余位补0
957
+ */
958
+ getChatHistory(message_id: string, count?: number): Promise<Ret<PrivateMessageEventData[] | GroupMessageEventData[]>>;
959
+
960
+ /**
961
+ * 获取转发消息
962
+ * resid在xml消息中,需要自行解析xml获得
963
+ * 暂不支持套娃转发解析
964
+ */
965
+ getForwardMsg(resid: string): Promise<Ret<Array<{
966
+ group_id?: number,
967
+ user_id: number,
968
+ nickname: string,
969
+ time: number,
970
+ message: MessageElem[],
971
+ raw_message: string,
972
+ }>>>;
973
+
974
+ /**
975
+ * 制作一个合并转发消息,得到的XmlElem可直接发送
976
+ * @param dm 默认(false)以群模式上传图片,设为true则以私聊模式上传图片
977
+ */
978
+ makeForwardMsg(fakes: FakeMessage | Iterable<FakeMessage>, dm?: boolean): Promise<Ret<XmlElem>>;
979
+
980
+ /** 发简易群公告 */
981
+ sendGroupNotice(group_id: number, content: string): Promise<Ret>;
982
+ /** 设置群名 */
983
+ setGroupName(group_id: number, group_name: string): Promise<Ret>;
984
+ /** 开启或关闭匿名 */
985
+ setGroupAnonymous(group_id: number, enable?: boolean): Promise<Ret>;
986
+ /** 全员禁言 */
987
+ setGroupWholeBan(group_id: number, enable?: boolean): Promise<Ret>;
988
+ /** 设置管理员 */
989
+ setGroupAdmin(group_id: number, user_id: number, enable?: boolean): Promise<Ret>;
990
+ /** 设置群头衔 */
991
+ setGroupSpecialTitle(group_id: number, user_id: number, special_title?: string, duration?: number): Promise<Ret>;
992
+ /** 设置群名片 */
993
+ setGroupCard(group_id: number, user_id: number, card?: string): Promise<Ret>;
994
+ /** 踢人(不支持批量) */
995
+ setGroupKick(group_id: number, user_id: number, reject_add_request?: boolean): Promise<Ret>;
996
+ /** 禁言 */
997
+ setGroupBan(group_id: number, user_id: number, duration?: number): Promise<Ret>;
998
+ /** 禁言匿名玩家 */
999
+ setGroupAnonymousBan(group_id: number, flag: string, duration?: number): Promise<Ret>;
1000
+ /** 退群(注意dismiss参数可能无效,如果你是群主无论如何群都会立即解散) */
1001
+ setGroupLeave(group_id: number, dismiss?: boolean): Promise<Ret>;
1002
+ /** 戳一戳(可以对好友使用) */
1003
+ sendGroupPoke(group_id: number, user_id: number): Promise<Ret>;
1004
+
1005
+ /** 处理好友请求 */
1006
+ setFriendAddRequest(flag: string, approve?: boolean, remark?: string, block?: boolean): Promise<Ret>;
1007
+ /** 处理群请求 */
1008
+ setGroupAddRequest(flag: string, approve?: boolean, reason?: string, block?: boolean): Promise<Ret>;
1009
+ /** 获取未处理的请求 */
1010
+ getSystemMsg(): Promise<Ret<Array<FriendAddEventData | GroupAddEventData | GroupInviteEventData>>>;
1011
+
1012
+ /** 该接口风控 */
1013
+ addGroup(group_id: number, comment?: string): Promise<Ret>;
1014
+ /** 添加好友,只能添加群友 */
1015
+ addFriend(group_id: number, user_id: number, comment?: string): Promise<Ret>;
1016
+ /** 删除好友 */
1017
+ deleteFriend(user_id: number, block?: boolean): Promise<Ret>;
1018
+ /** 邀请好友入群(不支持陌生人和批量) */
1019
+ inviteFriend(group_id: number, user_id: number): Promise<Ret>;
1020
+ /** 点赞(times默认1,不支持陌生人) */
1021
+ sendLike(user_id: number, times?: number): Promise<Ret>;
1022
+
1023
+ /** 设置昵称 */
1024
+ setNickname(nickname: string): Promise<Ret>;
1025
+ /** 设置性别(0未知 1男 2女) */
1026
+ setGender(gender: 0 | 1 | 2): Promise<Ret>;
1027
+ /** 设置生日(20110202的形式) */
1028
+ setBirthday(birthday: string | number): Promise<Ret>;
1029
+ /** 设置个人说明 */
1030
+ setDescription(description?: string): Promise<Ret>;
1031
+ /** 设置个人签名 */
1032
+ setSignature(signature?: string): Promise<Ret>;
1033
+ /** 设置个人头像 */
1034
+ setPortrait(file: MediaFile): Promise<Ret>; //
1035
+ /** 设置群头像 */
1036
+ setGroupPortrait(group_id: number, file: MediaFile): Promise<Ret>;
1037
+
1038
+ /**
1039
+ * @deprecated
1040
+ * 预先上传图片以备发送
1041
+ * 通常图片在发送时一并上传
1042
+ * 提前上传可用于加快发送速度,实现秒发
1043
+ */
1044
+ preloadImages(files: Iterable<MediaFile>): Promise<Ret<string[]>>;
1045
+
1046
+ /** 获取漫游表情 */
1047
+ getRoamingStamp(no_cache?: boolean): Promise<Ret<string[]>>;
1048
+
1049
+ /** 清除 image 和 record 文件夹下的缓存文件 */
1050
+ cleanCache(type?: "image" | "record"): Promise<Ret>;
1051
+
1052
+ /** 进入群文件系统 */
1053
+ acquireGfs(group_id: number): Gfs;
1054
+
1055
+ on<T extends keyof EventMap>(event: T, listener: EventMap[T]): this;
1056
+ on<S extends string | symbol>(event: S & Exclude<S, keyof EventMap>, listener: (this: Client, ...args: any[]) => void): this;
1057
+
1058
+ once<T extends keyof EventMap>(event: T, listener: EventMap[T]): this;
1059
+ once<S extends string | symbol>(event: S & Exclude<S, keyof EventMap>, listener: (this: Client, ...args: any[]) => void): this;
1060
+
1061
+ prependListener<T extends keyof EventMap>(event: T, listener: EventMap[T]): this;
1062
+ prependListener(event: string | symbol, listener: (this: Client, ...args: any[]) => void): this;
1063
+ prependOnceListener<T extends keyof EventMap>(event: T, listener: EventMap[T]): this;
1064
+ prependOnceListener(event: string | symbol, listener: (this: Client, ...args: any[]) => void): this;
1065
+
1066
+ /**
1067
+ * 重载好友列表和群列表
1068
+ * 完成之前无法调用任何api,也不会上报任何事件
1069
+ */
1070
+ reloadFriendList(): Promise<Ret>;
1071
+ reloadGroupList(): Promise<Ret>;
1072
+
1073
+ /** @deprecated 该方法已废弃,请直接访问 this.fl */
1074
+ getFriendList(): Ret<Client["fl"]>;
1075
+ /** @deprecated 该方法已废弃,请直接访问 this.sl */
1076
+ getStrangerList(): Ret<Client["sl"]>;
1077
+ /** @deprecated 该方法已废弃,请直接访问 this.gl */
1078
+ getGroupList(): Ret<Client["gl"]>;
1079
+ /** @deprecated 该方法已废弃,参考web-api.md自行获取 */
1080
+ getGroupNotice(group_id: number): Promise<Ret<any[]>>;
1081
+ /** @deprecated 该方法已废弃,参考web-api.md自行获取 */
1082
+ getLevelInfo(user_id?: number): Promise<Ret<any>>;
1083
+ /** @deprecated 该方法已废弃,请使用 this.cookies[domain] */
1084
+ getCookies(domain?: Domain): Promise<Ret<{ cookies: string }>>;
1085
+ /** @deprecated 该方法已废弃,请使用 this.bkn */
1086
+ getCsrfToken(): Promise<Ret<{ token: number }>>;
1087
+ /** @deprecated 该方法已废弃,请使用 this.stat */
1088
+ getStatus(): Ret<Status>;
1089
+ /** @deprecated */
1090
+ captchaLogin(captcha: string): void;
1091
+ /** @deprecated */
1092
+ canSendImage(): Ret;
1093
+ /** @deprecated */
1094
+ canSendRecord(): Ret;
1095
+ /** @deprecated */
1096
+ getVersionInfo(): Ret<any>;
1097
+ /** @deprecated */
1098
+ getLoginInfo(): Ret<LoginInfo>;
1099
+
1100
+ //----------以下为隐藏方法,可用于扩展协议----------\\
1101
+ /** 发送一个未加密的uni包 */
1102
+ sendUni(cmd: string, body: Uint8Array): Promise<Buffer>;
1103
+ /** 发送一个未加密的oidb包 */
1104
+ sendOidb(cmd: string, body: Uint8Array): Promise<Buffer>;
1105
+ /** 触发一个oicq标准事件 */
1106
+ em(name: string, data?: any): void;
1107
+ }
1108
+
1109
+ /** 工厂方法 */
1110
+ export function createClient(uin: number, config?: ConfBot): Client;
1111
+
1112
+ /**
1113
+ * 生成消息元素的快捷函数
1114
+ */
1115
+ export namespace segment {
1116
+ /** @deprecated 普通文本 */
1117
+ function text(text: string): TextElem;
1118
+ /** at */
1119
+ function at(qq: number | "all", text?: string, dummy?: boolean): AtElem;
1120
+ /** 经典表情 */
1121
+ function face(id: number, text?: string): FaceElem;
1122
+ /** 小表情 */
1123
+ function sface(id: number, text?: string): FaceElem;
1124
+ /** 原创表情 */
1125
+ function bface(file: string): BfaceElem;
1126
+ /** 猜拳 */
1127
+ function rps(id?: number): MfaceElem;
1128
+ /** 骰子 */
1129
+ function dice(id?: number): MfaceElem;
1130
+ /** 图片(后三个参数在下载网络图片时有效) */
1131
+ function image(file: MediaFile, cache?: boolean, timeout?: number, headers?: OutgoingHttpHeaders): ImgPttElem;
1132
+ /** 闪照 */
1133
+ function flash(file: MediaFile, cache?: boolean, timeout?: number, headers?: OutgoingHttpHeaders): ImgPttElem;
1134
+ /** 语音 */
1135
+ function record(file: MediaFile, cache?: boolean, timeout?: number, headers?: OutgoingHttpHeaders): ImgPttElem;
1136
+ /** 视频 */
1137
+ function video(file: string): VideoElem;
1138
+ /** 位置分享 */
1139
+ function location(lat: number, lng: number, address: string, id?: string): LocationElem;
1140
+ /** 音乐分享 */
1141
+ function music(type: MusicType, id: string): MusicElem;
1142
+ /** JSON消息 */
1143
+ function json(data: any): JsonElem;
1144
+ /** XML消息 */
1145
+ function xml(data: string, type?: number): XmlElem;
1146
+ /** 内容分享 */
1147
+ function share(url: string, title: string, image?: string, content?: string): ShareElem;
1148
+ /** 窗口抖动 */
1149
+ function shake(): ShakeElem;
1150
+ /** 戳一戳 */
1151
+ function poke(type: number, id?: number): PokeElem;
1152
+ /** 引用回复 */
1153
+ function reply(id: string): ReplyElem;
1154
+ /** 转发节点 */
1155
+ function node(id: string): NodeElem;
1156
+ /** 匿名 */
1157
+ function anonymous(ignore?: boolean): AnonymousElem;
1158
+ /** 只有mirai系客户端可以解析的消息 */
1159
+ function mirai(data: string): MiraiElem;
1160
+
1161
+ /** 将元素转换到CQ码字符串(CQ码字符串无法逆转换到元素,因为类型会丢失) */
1162
+ function toCqcode(elem: MessageElem): string;
1163
+ function toCqcode(elems: Iterable<MessageElem>): string;
1164
+ }
1165
+
1166
+ /**
1167
+ * 生成CQ码字符串的快捷函数
1168
+ */
1169
+ export namespace cqcode {
1170
+ /** @deprecated */
1171
+ function text(text: string): string;
1172
+ function at(qq: number | "all", text?: string, dummy?: boolean): string;
1173
+ function face(id: number, text?: string): string;
1174
+ function sface(id: number, text?: string): string;
1175
+ function bface(file: string): string;
1176
+ function rps(id?: number): string;
1177
+ function dice(id?: number): string;
1178
+ function image(file: string, cache?: boolean, timeout?: number, headers?: string): string;
1179
+ function flash(file: string, cache?: boolean, timeout?: number, headers?: string): string;
1180
+ function record(file: string, cache?: boolean, timeout?: number, headers?: string): string;
1181
+ function video(file: string): string;
1182
+ function location(lat: number, lng: number, address: string, id?: string): string;
1183
+ function music(type: MusicType, id: string): string;
1184
+ function json(data: string): string;
1185
+ function xml(data: string, type?: number): string;
1186
+ function share(url: string, title: string, image?: string, content?: string): string;
1187
+ function shake(): string;
1188
+ function poke(type: number, id?: number): string;
1189
+ function reply(id: string): string;
1190
+ function node(id: string): string;
1191
+ function anonymous(ignore?: boolean): string;
1192
+ function mirai(data: string): string;
1193
+ }
1194
+
1195
+ export namespace constants {
1196
+ const PLATFORM_ANDROID = 1;
1197
+ const PLATFORM_APAD = 2;
1198
+ const PLATFORM_WATCH = 3;
1199
+ const PLATFORM_IMAC = 4;
1200
+ const PLATFORM_IPAD = 5;
1201
+ const STATUS_ONLINE = 11;
1202
+ const STATUS_ABSENT = 31;
1203
+ const STATUS_INVISIBLE = 41;
1204
+ const STATUS_BUSY = 50;
1205
+ const STATUS_QME = 60;
1206
+ const STATUS_NODISTURB = 70;
1207
+ }
1208
+
1209
+ export interface FakeMessage {
1210
+ user_id: number,
1211
+ message: Sendable, //可转发的有效元素理论上只有[文字、表情、图片],不支持CQ码
1212
+ nickname?: string,
1213
+ time?: number, //时间戳(秒),默认:当前时间
1214
+ }