napcat-sdk 0.5.0 → 0.6.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/dist/index.mjs CHANGED
@@ -21,7 +21,7 @@ const CONSOLE_LOGGER = {
21
21
  //#endregion
22
22
  //#region package.json
23
23
  var name$1 = "napcat-sdk";
24
- var version$1 = "0.5.0";
24
+ var version$1 = "0.6.0";
25
25
 
26
26
  //#endregion
27
27
  //#region src/segment.ts
@@ -100,14 +100,32 @@ var NapCat = class {
100
100
  /** 机器人 ID */
101
101
  #uin = 0;
102
102
  /** 机器人昵称 */
103
- #nickname = "-";
103
+ #nickname = "";
104
104
  /** 机器人状态 */
105
105
  #online = false;
106
+ /** nickname 缓存 */
107
+ #nicknameCache = /* @__PURE__ */ new Map();
108
+ /** 消息数据 */
109
+ #stat = {
110
+ start_time: Date.now(),
111
+ recv: {
112
+ group: 0,
113
+ private: 0
114
+ },
115
+ send: {
116
+ group: 0,
117
+ private: 0
118
+ }
119
+ };
106
120
  /** Cookies 缓存 */
107
121
  #cookieCache = /* @__PURE__ */ new Map();
108
122
  constructor(options) {
109
123
  this.options = options;
110
124
  }
125
+ /** 统计数据 */
126
+ get stat() {
127
+ return this.#stat;
128
+ }
111
129
  /** 配置项 */
112
130
  get #config() {
113
131
  return {
@@ -136,6 +154,8 @@ var NapCat = class {
136
154
  }
137
155
  /**
138
156
  * 机器人 QQ 号
157
+ *
158
+ * @deprecated 建议使用 `uin` 属性
139
159
  */
140
160
  get user_id() {
141
161
  return this.uin;
@@ -158,7 +178,8 @@ var NapCat = class {
158
178
  }
159
179
  /** 构建 WebSocket 连接地址 */
160
180
  #buildWsUrl() {
161
- return `${this.#config.protocol}://${this.#config.host}:${this.#config.port}?access_token=${this.#config.token}`;
181
+ const { protocol, host, port, token } = this.#config;
182
+ return `${protocol}://${host}:${port}?access_token=${token}`;
162
183
  }
163
184
  /** 包装回复消息 */
164
185
  #wrapReply(sendable, message_id, reply) {
@@ -178,7 +199,7 @@ var NapCat = class {
178
199
  }
179
200
  }
180
201
  /** 标准化可发送消息元素 */
181
- #normalizeSendable(msg) {
202
+ normalizeSendable(msg) {
182
203
  return [msg].flat(2).map((item) => {
183
204
  if (typeof item === "string") return {
184
205
  type: "text",
@@ -216,97 +237,75 @@ var NapCat = class {
216
237
  group_id,
217
238
  group_name,
218
239
  napcat: this,
219
- doSign: () => this.api("set_group_sign", { group_id }),
220
- getInfo: () => this.api("get_group_info", { group_id }),
221
- getMemberList: async () => this.api("get_group_member_list", { group_id }),
222
- getMemberInfo: (user_id) => this.api("get_group_member_info", {
223
- group_id,
224
- user_id
225
- }),
226
- setTitle: (title) => this.api("set_group_special_title", {
227
- group_id,
228
- title
229
- }),
230
- setCard: (user_id, card) => this.api("set_group_card", {
231
- group_id,
232
- user_id,
233
- card
234
- }),
235
- addEssence: (message_id) => this.api("set_essence_msg", { message_id }),
236
- delEssence: (message_id) => this.api("delete_essence_msg", { message_id }),
237
- recall: (message_id) => this.api("delete_msg", { message_id }),
238
- banMember: (user_id, duration) => this.api("set_group_ban", {
239
- group_id,
240
- user_id,
241
- duration
242
- }),
243
- sendMsg: (sendable) => this.sendGroupMsg(group_id, sendable)
240
+ sign: this.setGroupSign.bind(this, group_id),
241
+ setTitle: this.setGroupSpecialTitle.bind(this, group_id),
242
+ setCard: this.setGroupCard.bind(this, group_id),
243
+ setEssence: this.setEssenceMsg.bind(this),
244
+ delEssence: this.deleteEssenceMsg.bind(this),
245
+ getInfo: this.getGroupInfo.bind(this, group_id),
246
+ getMemberList: this.getGroupMemberList.bind(this, group_id),
247
+ getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),
248
+ recall: this.recallMsg.bind(this),
249
+ ban: this.setGroupBan.bind(this, group_id),
250
+ sendMsg: this.sendGroupMsg.bind(this, group_id)
244
251
  };
245
252
  }
246
253
  /** 构建好友对象 */
247
254
  #buildFriend(user_id, nickname = "", extraInfo = {}) {
255
+ const name$2 = nickname || this.#nicknameCache.get(user_id) || "";
256
+ this.#nicknameCache.set(user_id, name$2);
248
257
  return {
249
258
  ...extraInfo,
250
259
  user_id,
251
- nickname,
260
+ nickname: name$2,
252
261
  napcat: this,
253
- delete: (block, both) => this.api("delete_friend", {
254
- user_id,
255
- temp_block: block,
256
- temp_both_del: both
257
- }),
258
- sendMsg: (sendable) => this.sendPrivateMsg(user_id, sendable),
259
- getInfo: () => this.api("get_stranger_info", { user_id })
262
+ delete: this.deleteFriend.bind(this, user_id),
263
+ sendMsg: this.sendPrivateMsg.bind(this, user_id),
264
+ getInfo: this.getStrangerInfo.bind(this, user_id)
260
265
  };
261
266
  }
267
+ #transformOneBotMessage(message) {
268
+ return (message || []).filter((e) => e.type !== "reply").map((el) => ({
269
+ type: el.type,
270
+ ...el.data
271
+ }));
272
+ }
262
273
  /** 构建私聊消息事件 */
263
274
  #buildPrivateMessageEvent(event) {
264
275
  const quote_id = event.message.find((el) => el.type === "reply")?.data?.id || null;
276
+ if (event.sender.nickname) this.#nicknameCache.set(event.sender.user_id, event.sender.nickname);
277
+ const target = event.target_id ? {
278
+ user_id: event.target_id,
279
+ nickname: this.#nicknameCache.get(event.target_id) || ""
280
+ } : {
281
+ user_id: event.sender.user_id,
282
+ nickname: event.sender.nickname
283
+ };
265
284
  return {
266
285
  ...event,
267
286
  quote_id,
268
- getQuoteMessage: async () => {
269
- if (!quote_id) return null;
270
- const event$1 = await this.api("get_msg", { message_id: quote_id });
271
- return this.#buildPrivateMessageEvent(event$1);
272
- },
273
- message: (event.message || []).filter((e) => e.type !== "reply").map((el) => ({
274
- type: el.type,
275
- ...el.data
276
- })),
277
- friend: this.#buildFriend(event.user_id, event.sender?.nickname || ""),
278
- reply: (sendable, reply = false) => this.sendPrivateMsg(event.user_id, this.#wrapReply(sendable, event.message_id, reply))
287
+ getQuoteMessage: () => this.getMsg(quote_id),
288
+ message: this.#transformOneBotMessage(event.message),
289
+ friend: this.#buildFriend(target.user_id, target.nickname),
290
+ reply: (sendable, reply = false) => this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply))
279
291
  };
280
292
  }
281
293
  /** 构建群消息事件对象 */
282
294
  #buildGroupMessageEvent(event) {
283
295
  const quote_id = event.message.find((el) => el.type === "reply")?.data?.id || null;
296
+ if (event.sender.nickname) this.#nicknameCache.set(event.sender.user_id, event.sender.nickname);
284
297
  return {
285
298
  ...event,
286
299
  quote_id,
287
- getQuoteMessage: async () => {
288
- if (!quote_id) return null;
289
- const event$1 = await this.api("get_msg", { message_id: quote_id });
290
- return this.#buildGroupMessageEvent(event$1);
291
- },
292
- message: (event.message || []).filter((e) => e.type !== "reply").map((el) => ({
293
- type: el.type,
294
- ...el.data
295
- })),
296
- group: this.#buildGroup(event.group_id, event.group?.group_name || ""),
297
- recall: () => this.api("delete_msg", { message_id: event.message_id }),
298
- addReaction: (id) => this.api("set_msg_emoji_like", {
299
- message_id: event.message_id,
300
- emoji_id: id,
301
- set: true
302
- }),
303
- delReaction: (id) => this.api("set_msg_emoji_like", {
304
- message_id: event.message_id,
305
- emoji_id: id,
306
- set: false
307
- }),
308
- addEssence: () => this.api("set_essence_msg", { message_id: event.message_id }),
309
- delEssence: () => this.api("delete_essence_msg", { message_id: event.message_id }),
300
+ getQuoteMessage: () => this.getMsg(quote_id),
301
+ getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),
302
+ message: this.#transformOneBotMessage(event.message),
303
+ group: this.#buildGroup(event.group_id, event.group_name || ""),
304
+ recall: this.recallMsg.bind(this, event.message_id),
305
+ addReaction: this.addReaction.bind(this, event.message_id),
306
+ delReaction: this.delReaction.bind(this, event.message_id),
307
+ setEssence: this.setEssenceMsg.bind(this, event.message_id),
308
+ delEssence: this.deleteEssenceMsg.bind(this, event.message_id),
310
309
  reply: (sendable, reply = false) => this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply))
311
310
  };
312
311
  }
@@ -337,41 +336,60 @@ var NapCat = class {
337
336
  app_name,
338
337
  app_version,
339
338
  protocol_version,
340
- ts: data.time * 1e3
339
+ timestamp: data.time * 1e3
341
340
  });
342
341
  }
343
342
  this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data);
344
343
  }
345
344
  }
346
345
  break;
347
- case "message":
348
- if (data.message_type === "private") data = this.#buildPrivateMessageEvent(data);
349
- else data = this.#buildGroupMessageEvent(data);
346
+ case "message": {
347
+ if (data.message_type === "private") {
348
+ this.#stat.recv.private++;
349
+ data = this.#buildPrivateMessageEvent(data);
350
+ } else {
351
+ this.#stat.recv.group++;
352
+ data = this.#buildGroupMessageEvent(data);
353
+ }
350
354
  this.#event.emit("message", data);
355
+ const msg = this.stringifyMessage(data.message);
356
+ const group = data.group ? `${data.group_name}(${data.group_id})` : "";
357
+ const sender = `${data.sender.nickname}(${data.sender.user_id})`;
351
358
  switch (data.message_type) {
352
359
  case "private":
353
- this.logger.trace(`received private message: ${JSON.stringify(data)}`);
354
- this.logger.info(`[P] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(data.message)}`);
355
360
  this.#event.emit("message.private", data);
356
361
  this.#event.emit(`message.private.${data.sub_type}`, data);
362
+ this.logger.trace(`received private message: ${JSON.stringify(data)}`);
363
+ this.logger.info(`[私:${sender}] ${msg}`);
357
364
  break;
358
365
  case "group":
359
- this.logger.trace(`received group message: ${JSON.stringify(data)}`);
360
- this.logger.info(`[G:${data.group_name}:${data.group_id}] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(data.message)}`);
361
366
  this.#event.emit("message.group", data);
362
367
  this.#event.emit(`message.group.${data.sub_type}`, data);
368
+ this.logger.trace(`received group message: ${JSON.stringify(data)}`);
369
+ this.logger.info(`[群:${group}] ${sender}: ${msg}`);
363
370
  break;
364
371
  default:
365
372
  this.logger.debug(`received unknown message type: ${JSON.stringify(data)}`);
366
373
  break;
367
374
  }
368
375
  break;
376
+ }
369
377
  case "message_sent":
370
- this.logger.trace(`received message_sent: ${JSON.stringify(data)}`);
378
+ if (data.message_type === "private") {
379
+ this.#stat.send.private++;
380
+ data = this.#buildPrivateMessageEvent(data);
381
+ } else {
382
+ this.#stat.send.group++;
383
+ data = this.#buildGroupMessageEvent(data);
384
+ }
371
385
  this.#event.emit("message_sent", data);
386
+ this.logger.trace(`received message_sent: ${JSON.stringify(data)}`);
372
387
  if (data.message_type) {
373
388
  this.#event.emit(`message_sent.${data.message_type}`, data);
374
389
  if (data.sub_type) this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data);
390
+ const msg = this.stringifyMessage(data.message);
391
+ if (data.message_type === "group" && data.group_id) this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`);
392
+ else this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`);
375
393
  }
376
394
  break;
377
395
  case "notice": {
@@ -519,12 +537,85 @@ var NapCat = class {
519
537
  return this.#waitForAction(echo);
520
538
  }
521
539
  /**
540
+ * 获取好友列表
541
+ */
542
+ async getFriendList() {
543
+ return (await this.api("get_friend_list")).map((f) => this.#buildFriend(f.user_id, f.nickname, f));
544
+ }
545
+ /**
546
+ * 获取群列表
547
+ */
548
+ async getGroupList() {
549
+ return (await this.api("get_group_list")).map((g) => this.#buildGroup(g.group_id, g.group_name, g));
550
+ }
551
+ /**
552
+ * 添加消息回应
553
+ */
554
+ addReaction(message_id, id) {
555
+ return this.api("set_msg_emoji_like", {
556
+ message_id,
557
+ emoji_id: id,
558
+ set: true
559
+ });
560
+ }
561
+ /**
562
+ * 删除消息回应
563
+ */
564
+ delReaction(message_id, id) {
565
+ return this.api("set_msg_emoji_like", {
566
+ message_id,
567
+ emoji_id: id,
568
+ set: false
569
+ });
570
+ }
571
+ /**
572
+ * 获取消息
573
+ */
574
+ async getMsg(message_id) {
575
+ if (!message_id) return null;
576
+ const msg = await this.api("get_msg", { message_id });
577
+ if (msg.message_type === "private") return this.#buildPrivateMessageEvent(msg);
578
+ else return this.#buildGroupMessageEvent(msg);
579
+ }
580
+ /**
581
+ * 删除好友
582
+ */
583
+ deleteFriend(user_id, block = false, both = false) {
584
+ return this.api("delete_friend", {
585
+ user_id,
586
+ temp_block: block,
587
+ temp_both_del: both
588
+ });
589
+ }
590
+ /**
591
+ * 设置群成员禁言
592
+ */
593
+ setGroupBan(group_id, user_id, duration) {
594
+ return this.api("set_group_ban", {
595
+ group_id,
596
+ user_id,
597
+ duration
598
+ });
599
+ }
600
+ /**
601
+ * 撤回消息
602
+ */
603
+ recallMsg(message_id) {
604
+ return this.api("delete_msg", { message_id });
605
+ }
606
+ /**
607
+ * 获取陌生人信息
608
+ */
609
+ getStrangerInfo(user_id) {
610
+ return this.api("get_stranger_info", { user_id });
611
+ }
612
+ /**
522
613
  * 发送私聊消息
523
614
  */
524
615
  sendPrivateMsg(user_id, sendable) {
525
616
  return this.api("send_private_msg", {
526
617
  user_id,
527
- message: this.#normalizeSendable(sendable)
618
+ message: this.normalizeSendable(sendable)
528
619
  });
529
620
  }
530
621
  /**
@@ -533,7 +624,66 @@ var NapCat = class {
533
624
  sendGroupMsg(group_id, sendable) {
534
625
  return this.api("send_group_msg", {
535
626
  group_id,
536
- message: this.#normalizeSendable(sendable)
627
+ message: this.normalizeSendable(sendable)
628
+ });
629
+ }
630
+ /**
631
+ * 获取群信息
632
+ */
633
+ getGroupInfo(group_id) {
634
+ return this.api("get_group_info", { group_id });
635
+ }
636
+ /**
637
+ * 群签到
638
+ */
639
+ setGroupSign(group_id) {
640
+ return this.api("set_group_sign", { group_id });
641
+ }
642
+ /**
643
+ * 设置群精华消息
644
+ */
645
+ setEssenceMsg(message_id) {
646
+ return this.api("set_essence_msg", { message_id });
647
+ }
648
+ /**
649
+ * 删除群精华消息
650
+ */
651
+ deleteEssenceMsg(message_id) {
652
+ return this.api("delete_essence_msg", { message_id });
653
+ }
654
+ /**
655
+ * 设置群成员名片
656
+ */
657
+ setGroupCard(group_id, user_id, card) {
658
+ return this.api("set_group_card", {
659
+ group_id,
660
+ user_id,
661
+ card
662
+ });
663
+ }
664
+ /**
665
+ * 设置群成员专属头衔
666
+ */
667
+ setGroupSpecialTitle(group_id, user_id, title) {
668
+ return this.api("set_group_special_title", {
669
+ group_id,
670
+ user_id,
671
+ title
672
+ });
673
+ }
674
+ /**
675
+ * 获取群成员列表
676
+ */
677
+ getGroupMemberList(group_id) {
678
+ return this.api("get_group_member_list", { group_id });
679
+ }
680
+ /**
681
+ * 获取群成员信息
682
+ */
683
+ getGroupMemberInfo(group_id, user_id) {
684
+ return this.api("get_group_member_info", {
685
+ group_id,
686
+ user_id
537
687
  });
538
688
  }
539
689
  /**