napcat-sdk 0.5.1 → 0.6.1

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.cjs CHANGED
@@ -50,7 +50,7 @@ const CONSOLE_LOGGER = {
50
50
  //#endregion
51
51
  //#region package.json
52
52
  var name$1 = "napcat-sdk";
53
- var version$1 = "0.5.1";
53
+ var version$1 = "0.6.1";
54
54
 
55
55
  //#endregion
56
56
  //#region src/segment.ts
@@ -129,14 +129,32 @@ var NapCat = class {
129
129
  /** 机器人 ID */
130
130
  #uin = 0;
131
131
  /** 机器人昵称 */
132
- #nickname = "-";
132
+ #nickname = "";
133
133
  /** 机器人状态 */
134
134
  #online = false;
135
+ /** nickname 缓存 */
136
+ #nicknameCache = /* @__PURE__ */ new Map();
137
+ /** 消息数据 */
138
+ #stat = {
139
+ start_time: Date.now(),
140
+ recv: {
141
+ group: 0,
142
+ private: 0
143
+ },
144
+ send: {
145
+ group: 0,
146
+ private: 0
147
+ }
148
+ };
135
149
  /** Cookies 缓存 */
136
150
  #cookieCache = /* @__PURE__ */ new Map();
137
151
  constructor(options) {
138
152
  this.options = options;
139
153
  }
154
+ /** 统计数据 */
155
+ get stat() {
156
+ return this.#stat;
157
+ }
140
158
  /** 配置项 */
141
159
  get #config() {
142
160
  return {
@@ -165,6 +183,8 @@ var NapCat = class {
165
183
  }
166
184
  /**
167
185
  * 机器人 QQ 号
186
+ *
187
+ * @deprecated 建议使用 `uin` 属性
168
188
  */
169
189
  get user_id() {
170
190
  return this.uin;
@@ -187,7 +207,8 @@ var NapCat = class {
187
207
  }
188
208
  /** 构建 WebSocket 连接地址 */
189
209
  #buildWsUrl() {
190
- return `${this.#config.protocol}://${this.#config.host}:${this.#config.port}?access_token=${this.#config.token}`;
210
+ const { protocol, host, port, token } = this.#config;
211
+ return `${protocol}://${host}:${port}?access_token=${token}`;
191
212
  }
192
213
  /** 包装回复消息 */
193
214
  #wrapReply(sendable, message_id, reply) {
@@ -207,7 +228,7 @@ var NapCat = class {
207
228
  }
208
229
  }
209
230
  /** 标准化可发送消息元素 */
210
- #normalizeSendable(msg) {
231
+ normalizeSendable(msg) {
211
232
  return [msg].flat(2).map((item) => {
212
233
  if (typeof item === "string") return {
213
234
  type: "text",
@@ -245,97 +266,75 @@ var NapCat = class {
245
266
  group_id,
246
267
  group_name,
247
268
  napcat: this,
248
- doSign: () => this.api("set_group_sign", { group_id }),
249
- getInfo: () => this.api("get_group_info", { group_id }),
250
- getMemberList: async () => this.api("get_group_member_list", { group_id }),
251
- getMemberInfo: (user_id) => this.api("get_group_member_info", {
252
- group_id,
253
- user_id
254
- }),
255
- setTitle: (title) => this.api("set_group_special_title", {
256
- group_id,
257
- title
258
- }),
259
- setCard: (user_id, card) => this.api("set_group_card", {
260
- group_id,
261
- user_id,
262
- card
263
- }),
264
- addEssence: (message_id) => this.api("set_essence_msg", { message_id }),
265
- delEssence: (message_id) => this.api("delete_essence_msg", { message_id }),
266
- recall: (message_id) => this.api("delete_msg", { message_id }),
267
- banMember: (user_id, duration) => this.api("set_group_ban", {
268
- group_id,
269
- user_id,
270
- duration
271
- }),
272
- sendMsg: (sendable) => this.sendGroupMsg(group_id, sendable)
269
+ sign: this.setGroupSign.bind(this, group_id),
270
+ setTitle: this.setGroupSpecialTitle.bind(this, group_id),
271
+ setCard: this.setGroupCard.bind(this, group_id),
272
+ setEssence: this.setEssenceMsg.bind(this),
273
+ delEssence: this.deleteEssenceMsg.bind(this),
274
+ getInfo: this.getGroupInfo.bind(this, group_id),
275
+ getMemberList: this.getGroupMemberList.bind(this, group_id),
276
+ getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),
277
+ recall: this.recallMsg.bind(this),
278
+ ban: this.setGroupBan.bind(this, group_id),
279
+ sendMsg: this.sendGroupMsg.bind(this, group_id)
273
280
  };
274
281
  }
275
282
  /** 构建好友对象 */
276
283
  #buildFriend(user_id, nickname = "", extraInfo = {}) {
284
+ const name$2 = nickname || this.#nicknameCache.get(user_id) || "";
285
+ this.#nicknameCache.set(user_id, name$2);
277
286
  return {
278
287
  ...extraInfo,
279
288
  user_id,
280
- nickname,
289
+ nickname: name$2,
281
290
  napcat: this,
282
- delete: (block, both) => this.api("delete_friend", {
283
- user_id,
284
- temp_block: block,
285
- temp_both_del: both
286
- }),
287
- sendMsg: (sendable) => this.sendPrivateMsg(user_id, sendable),
288
- getInfo: () => this.api("get_stranger_info", { user_id })
291
+ delete: this.deleteFriend.bind(this, user_id),
292
+ sendMsg: this.sendPrivateMsg.bind(this, user_id),
293
+ getInfo: this.getStrangerInfo.bind(this, user_id)
289
294
  };
290
295
  }
296
+ #transformOneBotMessage(message) {
297
+ return (message || []).filter((e) => e.type !== "reply").map((el) => ({
298
+ type: el.type,
299
+ ...el.data
300
+ }));
301
+ }
291
302
  /** 构建私聊消息事件 */
292
303
  #buildPrivateMessageEvent(event) {
293
304
  const quote_id = event.message.find((el) => el.type === "reply")?.data?.id || null;
305
+ if (event.sender.nickname) this.#nicknameCache.set(event.sender.user_id, event.sender.nickname);
306
+ const target = event.target_id ? {
307
+ user_id: event.target_id,
308
+ nickname: this.#nicknameCache.get(event.target_id) || ""
309
+ } : {
310
+ user_id: event.sender.user_id,
311
+ nickname: event.sender.nickname
312
+ };
294
313
  return {
295
314
  ...event,
296
315
  quote_id,
297
- getQuoteMessage: async () => {
298
- if (!quote_id) return null;
299
- const event$1 = await this.api("get_msg", { message_id: quote_id });
300
- return this.#buildPrivateMessageEvent(event$1);
301
- },
302
- message: (event.message || []).filter((e) => e.type !== "reply").map((el) => ({
303
- type: el.type,
304
- ...el.data
305
- })),
306
- friend: this.#buildFriend(event.user_id, event.sender?.nickname || ""),
307
- reply: (sendable, reply = false) => this.sendPrivateMsg(event.user_id, this.#wrapReply(sendable, event.message_id, reply))
316
+ getQuoteMessage: () => this.getMsg(quote_id),
317
+ message: this.#transformOneBotMessage(event.message),
318
+ friend: this.#buildFriend(target.user_id, target.nickname),
319
+ reply: (sendable, reply = false) => this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply))
308
320
  };
309
321
  }
310
322
  /** 构建群消息事件对象 */
311
323
  #buildGroupMessageEvent(event) {
312
324
  const quote_id = event.message.find((el) => el.type === "reply")?.data?.id || null;
325
+ if (event.sender.nickname) this.#nicknameCache.set(event.sender.user_id, event.sender.nickname);
313
326
  return {
314
327
  ...event,
315
328
  quote_id,
316
- getQuoteMessage: async () => {
317
- if (!quote_id) return null;
318
- const event$1 = await this.api("get_msg", { message_id: quote_id });
319
- return this.#buildGroupMessageEvent(event$1);
320
- },
321
- message: (event.message || []).filter((e) => e.type !== "reply").map((el) => ({
322
- type: el.type,
323
- ...el.data
324
- })),
325
- group: this.#buildGroup(event.group_id, event.group?.group_name || ""),
326
- recall: () => this.api("delete_msg", { message_id: event.message_id }),
327
- addReaction: (id) => this.api("set_msg_emoji_like", {
328
- message_id: event.message_id,
329
- emoji_id: id,
330
- set: true
331
- }),
332
- delReaction: (id) => this.api("set_msg_emoji_like", {
333
- message_id: event.message_id,
334
- emoji_id: id,
335
- set: false
336
- }),
337
- addEssence: () => this.api("set_essence_msg", { message_id: event.message_id }),
338
- delEssence: () => this.api("delete_essence_msg", { message_id: event.message_id }),
329
+ getQuoteMessage: () => this.getMsg(quote_id),
330
+ getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),
331
+ message: this.#transformOneBotMessage(event.message),
332
+ group: this.#buildGroup(event.group_id, event.group_name || ""),
333
+ recall: this.recallMsg.bind(this, event.message_id),
334
+ addReaction: this.addReaction.bind(this, event.message_id),
335
+ delReaction: this.delReaction.bind(this, event.message_id),
336
+ setEssence: this.setEssenceMsg.bind(this, event.message_id),
337
+ delEssence: this.deleteEssenceMsg.bind(this, event.message_id),
339
338
  reply: (sendable, reply = false) => this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply))
340
339
  };
341
340
  }
@@ -366,41 +365,60 @@ var NapCat = class {
366
365
  app_name,
367
366
  app_version,
368
367
  protocol_version,
369
- ts: data.time * 1e3
368
+ timestamp: data.time * 1e3
370
369
  });
371
370
  }
372
371
  this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data);
373
372
  }
374
373
  }
375
374
  break;
376
- case "message":
377
- if (data.message_type === "private") data = this.#buildPrivateMessageEvent(data);
378
- else data = this.#buildGroupMessageEvent(data);
375
+ case "message": {
376
+ if (data.message_type === "private") {
377
+ this.#stat.recv.private++;
378
+ data = this.#buildPrivateMessageEvent(data);
379
+ } else {
380
+ this.#stat.recv.group++;
381
+ data = this.#buildGroupMessageEvent(data);
382
+ }
379
383
  this.#event.emit("message", data);
384
+ const msg = this.stringifyMessage(data.message);
385
+ const group = data.group ? `${data.group_name}(${data.group_id})` : "";
386
+ const sender = `${data.sender.nickname}(${data.sender.user_id})`;
380
387
  switch (data.message_type) {
381
388
  case "private":
382
- this.logger.trace(`received private message: ${JSON.stringify(data)}`);
383
- this.logger.info(`[P] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(data.message)}`);
384
389
  this.#event.emit("message.private", data);
385
390
  this.#event.emit(`message.private.${data.sub_type}`, data);
391
+ this.logger.trace(`received private message: ${JSON.stringify(data)}`);
392
+ this.logger.info(`[私:${sender}] ${msg}`);
386
393
  break;
387
394
  case "group":
388
- this.logger.trace(`received group message: ${JSON.stringify(data)}`);
389
- this.logger.info(`[G:${data.group_name}:${data.group_id}] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(data.message)}`);
390
395
  this.#event.emit("message.group", data);
391
396
  this.#event.emit(`message.group.${data.sub_type}`, data);
397
+ this.logger.trace(`received group message: ${JSON.stringify(data)}`);
398
+ this.logger.info(`[群:${group}] ${sender}: ${msg}`);
392
399
  break;
393
400
  default:
394
401
  this.logger.debug(`received unknown message type: ${JSON.stringify(data)}`);
395
402
  break;
396
403
  }
397
404
  break;
405
+ }
398
406
  case "message_sent":
399
- this.logger.trace(`received message_sent: ${JSON.stringify(data)}`);
407
+ if (data.message_type === "private") {
408
+ this.#stat.send.private++;
409
+ data = this.#buildPrivateMessageEvent(data);
410
+ } else {
411
+ this.#stat.send.group++;
412
+ data = this.#buildGroupMessageEvent(data);
413
+ }
400
414
  this.#event.emit("message_sent", data);
415
+ this.logger.trace(`received message_sent: ${JSON.stringify(data)}`);
401
416
  if (data.message_type) {
402
417
  this.#event.emit(`message_sent.${data.message_type}`, data);
403
418
  if (data.sub_type) this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data);
419
+ const msg = this.stringifyMessage(data.message);
420
+ if (data.message_type === "group" && data.group_id) this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`);
421
+ else this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`);
404
422
  }
405
423
  break;
406
424
  case "notice": {
@@ -548,12 +566,85 @@ var NapCat = class {
548
566
  return this.#waitForAction(echo);
549
567
  }
550
568
  /**
569
+ * 获取好友列表
570
+ */
571
+ async getFriendList() {
572
+ return (await this.api("get_friend_list")).map((f) => this.#buildFriend(f.user_id, f.nickname, f));
573
+ }
574
+ /**
575
+ * 获取群列表
576
+ */
577
+ async getGroupList() {
578
+ return (await this.api("get_group_list")).map((g) => this.#buildGroup(g.group_id, g.group_name, g));
579
+ }
580
+ /**
581
+ * 添加消息回应
582
+ */
583
+ addReaction(message_id, id) {
584
+ return this.api("set_msg_emoji_like", {
585
+ message_id,
586
+ emoji_id: id,
587
+ set: true
588
+ });
589
+ }
590
+ /**
591
+ * 删除消息回应
592
+ */
593
+ delReaction(message_id, id) {
594
+ return this.api("set_msg_emoji_like", {
595
+ message_id,
596
+ emoji_id: id,
597
+ set: false
598
+ });
599
+ }
600
+ /**
601
+ * 获取消息
602
+ */
603
+ async getMsg(message_id) {
604
+ if (!message_id) return null;
605
+ const msg = await this.api("get_msg", { message_id });
606
+ if (msg.message_type === "private") return this.#buildPrivateMessageEvent(msg);
607
+ else return this.#buildGroupMessageEvent(msg);
608
+ }
609
+ /**
610
+ * 删除好友
611
+ */
612
+ deleteFriend(user_id, block = false, both = false) {
613
+ return this.api("delete_friend", {
614
+ user_id,
615
+ temp_block: block,
616
+ temp_both_del: both
617
+ });
618
+ }
619
+ /**
620
+ * 设置群成员禁言
621
+ */
622
+ setGroupBan(group_id, user_id, duration) {
623
+ return this.api("set_group_ban", {
624
+ group_id,
625
+ user_id,
626
+ duration
627
+ });
628
+ }
629
+ /**
630
+ * 撤回消息
631
+ */
632
+ recallMsg(message_id) {
633
+ return this.api("delete_msg", { message_id });
634
+ }
635
+ /**
636
+ * 获取陌生人信息
637
+ */
638
+ getStrangerInfo(user_id) {
639
+ return this.api("get_stranger_info", { user_id });
640
+ }
641
+ /**
551
642
  * 发送私聊消息
552
643
  */
553
644
  sendPrivateMsg(user_id, sendable) {
554
645
  return this.api("send_private_msg", {
555
646
  user_id,
556
- message: this.#normalizeSendable(sendable)
647
+ message: this.normalizeSendable(sendable)
557
648
  });
558
649
  }
559
650
  /**
@@ -562,7 +653,66 @@ var NapCat = class {
562
653
  sendGroupMsg(group_id, sendable) {
563
654
  return this.api("send_group_msg", {
564
655
  group_id,
565
- message: this.#normalizeSendable(sendable)
656
+ message: this.normalizeSendable(sendable)
657
+ });
658
+ }
659
+ /**
660
+ * 获取群信息
661
+ */
662
+ getGroupInfo(group_id) {
663
+ return this.api("get_group_info", { group_id });
664
+ }
665
+ /**
666
+ * 群签到
667
+ */
668
+ setGroupSign(group_id) {
669
+ return this.api("set_group_sign", { group_id });
670
+ }
671
+ /**
672
+ * 设置群精华消息
673
+ */
674
+ setEssenceMsg(message_id) {
675
+ return this.api("set_essence_msg", { message_id });
676
+ }
677
+ /**
678
+ * 删除群精华消息
679
+ */
680
+ deleteEssenceMsg(message_id) {
681
+ return this.api("delete_essence_msg", { message_id });
682
+ }
683
+ /**
684
+ * 设置群成员名片
685
+ */
686
+ setGroupCard(group_id, user_id, card) {
687
+ return this.api("set_group_card", {
688
+ group_id,
689
+ user_id,
690
+ card
691
+ });
692
+ }
693
+ /**
694
+ * 设置群成员专属头衔
695
+ */
696
+ setGroupSpecialTitle(group_id, user_id, title) {
697
+ return this.api("set_group_special_title", {
698
+ group_id,
699
+ user_id,
700
+ title
701
+ });
702
+ }
703
+ /**
704
+ * 获取群成员列表
705
+ */
706
+ getGroupMemberList(group_id) {
707
+ return this.api("get_group_member_list", { group_id });
708
+ }
709
+ /**
710
+ * 获取群成员信息
711
+ */
712
+ getGroupMemberInfo(group_id, user_id) {
713
+ return this.api("get_group_member_info", {
714
+ group_id,
715
+ user_id
566
716
  });
567
717
  }
568
718
  /**