napcat-sdk 0.6.1 → 0.6.2

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.6.1";
53
+ var version$1 = "0.6.2";
54
54
 
55
55
  //#endregion
56
56
  //#region src/segment.ts
@@ -168,8 +168,8 @@ var NapCat = class {
168
168
  /** WebSocket 实例 */
169
169
  get ws() {
170
170
  if (!this.#ws) {
171
- this.logger.error("WebSocket is not connected.");
172
- throw new Error("WebSocket is not connected.");
171
+ this.logger.error("WebSocket 未连接。");
172
+ throw new Error("WebSocket 未连接。");
173
173
  }
174
174
  return this.#ws;
175
175
  }
@@ -219,12 +219,12 @@ var NapCat = class {
219
219
  /** 确保 WebSocket 已连接 */
220
220
  #ensureWsConnection(ws) {
221
221
  if (!ws) {
222
- this.logger.error("WebSocket is not connected.");
223
- throw new Error("WebSocket is not connected.");
222
+ this.logger.error("WebSocket 未连接。");
223
+ throw new Error("WebSocket 未连接。");
224
224
  }
225
225
  if (ws.readyState !== WebSocket.OPEN) {
226
- this.logger.error("WebSocket is not open.");
227
- throw new Error("WebSocket is not open.");
226
+ this.logger.error("WebSocket 未打开。");
227
+ throw new Error("WebSocket 未打开。");
228
228
  }
229
229
  }
230
230
  /** 标准化可发送消息元素 */
@@ -253,8 +253,8 @@ var NapCat = class {
253
253
  if (!data || data.echo !== echoId) return;
254
254
  this.#echoEvent.off(eventName, handle);
255
255
  if (data.retcode === 0) resolve(data.data);
256
- else if (data.retcode === 1200) reject("API Error: 发送失败,请先添加对方为好友");
257
- else reject(`API Error: ${data.message}`);
256
+ else if (data.retcode === 1200) reject("API 错误:发送失败,请先添加对方为好友");
257
+ else reject(`API 错误:${data.message}`);
258
258
  };
259
259
  this.#echoEvent.on(eventName, handle);
260
260
  });
@@ -347,11 +347,11 @@ var NapCat = class {
347
347
  if (data.post_type) {
348
348
  switch (data.post_type) {
349
349
  case "meta_event":
350
- this.logger.trace(`received meta_event: ${JSON.stringify(data)}`);
350
+ this.logger.trace(`收到 meta_event:${JSON.stringify(data)}`);
351
351
  this.#event.emit("meta_event", data);
352
352
  if (data.meta_event_type) {
353
353
  this.#event.emit(`meta_event.${data.meta_event_type}`, data);
354
- this.logger.debug("recv meta_event_type:", data.meta_event_type);
354
+ this.logger.debug("收到 meta_event_type", data.meta_event_type);
355
355
  if (data.sub_type) {
356
356
  if (data.sub_type === "connect") {
357
357
  const { app_name, app_version, protocol_version } = await this.getVersionInfo();
@@ -388,17 +388,17 @@ var NapCat = class {
388
388
  case "private":
389
389
  this.#event.emit("message.private", data);
390
390
  this.#event.emit(`message.private.${data.sub_type}`, data);
391
- this.logger.trace(`received private message: ${JSON.stringify(data)}`);
391
+ this.logger.trace(`收到私聊消息:${JSON.stringify(data)}`);
392
392
  this.logger.info(`[私:${sender}] ${msg}`);
393
393
  break;
394
394
  case "group":
395
395
  this.#event.emit("message.group", data);
396
396
  this.#event.emit(`message.group.${data.sub_type}`, data);
397
- this.logger.trace(`received group message: ${JSON.stringify(data)}`);
397
+ this.logger.trace(`收到群消息:${JSON.stringify(data)}`);
398
398
  this.logger.info(`[群:${group}] ${sender}: ${msg}`);
399
399
  break;
400
400
  default:
401
- this.logger.debug(`received unknown message type: ${JSON.stringify(data)}`);
401
+ this.logger.debug(`收到未知消息类型:${JSON.stringify(data)}`);
402
402
  break;
403
403
  }
404
404
  break;
@@ -412,7 +412,7 @@ var NapCat = class {
412
412
  data = this.#buildGroupMessageEvent(data);
413
413
  }
414
414
  this.#event.emit("message_sent", data);
415
- this.logger.trace(`received message_sent: ${JSON.stringify(data)}`);
415
+ this.logger.trace(`收到 message_sent:${JSON.stringify(data)}`);
416
416
  if (data.message_type) {
417
417
  this.#event.emit(`message_sent.${data.message_type}`, data);
418
418
  if (data.sub_type) this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data);
@@ -422,9 +422,9 @@ var NapCat = class {
422
422
  }
423
423
  break;
424
424
  case "notice": {
425
- this.logger.trace(`received notice: ${JSON.stringify(data)}`);
425
+ this.logger.trace(`收到通知:${JSON.stringify(data)}`);
426
426
  if (!data.notice_type) {
427
- this.logger.debug(`received unknown notice type: ${JSON.stringify(data)}`);
427
+ this.logger.debug(`收到未知通知类型:${JSON.stringify(data)}`);
428
428
  break;
429
429
  }
430
430
  const isNotify = data.notice_type === "notify";
@@ -448,7 +448,7 @@ var NapCat = class {
448
448
  break;
449
449
  }
450
450
  case "request":
451
- this.logger.trace(`received request: ${JSON.stringify(data)}`);
451
+ this.logger.trace(`收到请求:${JSON.stringify(data)}`);
452
452
  if (data.request_type === "friend") {
453
453
  data.reject = (reason) => this.api("set_friend_add_request", {
454
454
  flag: data.flag,
@@ -478,7 +478,7 @@ var NapCat = class {
478
478
  }
479
479
  break;
480
480
  default:
481
- this.logger.debug(`received: ${JSON.stringify(data)}`);
481
+ this.logger.debug(`收到:${JSON.stringify(data)}`);
482
482
  this.#event.emit(data.post_type, data);
483
483
  return;
484
484
  }
@@ -508,7 +508,7 @@ var NapCat = class {
508
508
  const groupInfo = await this.api("get_group_info", { group_id });
509
509
  return this.#buildGroup(group_id, groupInfo.group_name, groupInfo);
510
510
  } catch (err) {
511
- this.logger.warn(`Error to pickGroup ${group_id}: ${err?.message || err}`);
511
+ this.logger.warn(`获取群 ${group_id} 信息失败:${err?.message || err}`);
512
512
  return null;
513
513
  }
514
514
  }
@@ -518,7 +518,7 @@ var NapCat = class {
518
518
  const friendInfo = await this.api("get_stranger_info", { user_id });
519
519
  return this.#buildFriend(user_id, friendInfo.nickname, friendInfo);
520
520
  } catch (err) {
521
- this.logger.warn(`Error to pickFriend ${user_id}: ${err?.message || err}`);
521
+ this.logger.warn(`获取好友 ${user_id} 信息失败:${err?.message || err}`);
522
522
  return null;
523
523
  }
524
524
  }
@@ -530,7 +530,7 @@ var NapCat = class {
530
530
  handler(event);
531
531
  this.#event.off(type, onceHandler);
532
532
  };
533
- this.logger.debug(`registering once: ${String(type)}`);
533
+ this.logger.debug(`注册一次性监听器:${String(type)}`);
534
534
  this.#event.on(type, onceHandler);
535
535
  }
536
536
  /**
@@ -541,14 +541,14 @@ var NapCat = class {
541
541
  * 如果需要移除监听器,请调用 `off` 方法
542
542
  */
543
543
  on(type, handler) {
544
- this.logger.debug(`registering: ${String(type)}`);
544
+ this.logger.debug(`注册监听器:${String(type)}`);
545
545
  this.#event.on(type, handler);
546
546
  }
547
547
  /**
548
548
  * 移除事件监听器
549
549
  */
550
550
  off(type, handler) {
551
- this.logger.debug(`unregistering: ${String(type)}`);
551
+ this.logger.debug(`移除监听器:${String(type)}`);
552
552
  this.#event.off(type, handler);
553
553
  }
554
554
  /**
@@ -556,7 +556,7 @@ var NapCat = class {
556
556
  */
557
557
  api(action, params = {}) {
558
558
  this.#ensureWsConnection(this.#ws);
559
- this.logger.debug(`calling api action: ${action} with params: ${JSON.stringify(params)}`);
559
+ this.logger.debug(`调用 API:${action},参数:${JSON.stringify(params)}`);
560
560
  const echo = this.#echoId();
561
561
  this.#ws.send(JSON.stringify({
562
562
  echo,
@@ -789,7 +789,7 @@ var NapCat = class {
789
789
  /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */
790
790
  async run() {
791
791
  const { logger: _, token: __, ...config } = this.#config;
792
- this.logger.debug(`run with config: ${JSON.stringify(config)}`);
792
+ this.logger.debug(`启动配置:${JSON.stringify(config)}`);
793
793
  return new Promise((resolve, reject) => {
794
794
  const ws = new WebSocket(this.#buildWsUrl());
795
795
  ws.onmessage = (event) => {
@@ -801,7 +801,7 @@ var NapCat = class {
801
801
  }
802
802
  })();
803
803
  if (!data) {
804
- this.logger.debug(`received non-json message: ${event.data}`);
804
+ this.logger.debug(`收到非 JSON 消息:${event.data}`);
805
805
  return;
806
806
  }
807
807
  this.#event.emit("ws.message", data);
@@ -809,32 +809,32 @@ var NapCat = class {
809
809
  };
810
810
  ws.onclose = () => {
811
811
  this.#online = false;
812
- this.logger.debug("NapCat disconnected");
812
+ this.logger.debug("NapCat 已断开连接");
813
813
  this.#event.emit("ws.close");
814
814
  };
815
815
  ws.onerror = (error) => {
816
816
  this.#online = false;
817
- this.logger.debug(`NapCat error: ${error}`);
817
+ this.logger.debug(`NapCat 发生错误:${error}`);
818
818
  this.#event.emit("ws.error", error);
819
819
  reject(error);
820
820
  };
821
821
  ws.onopen = () => {
822
- this.logger.debug("NapCat connected");
822
+ this.logger.debug("NapCat 已连接");
823
823
  this.#event.emit("ws.open");
824
824
  resolve();
825
825
  };
826
826
  this.#ws = ws;
827
- this.logger.trace(`WebSocket instance created.`);
827
+ this.logger.trace(`WebSocket 实例已创建。`);
828
828
  });
829
829
  }
830
830
  /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */
831
831
  close() {
832
832
  if (this.#ws) {
833
- this.logger.info("destroying NapCat SDK instance...");
833
+ this.logger.info("正在销毁 NapCat SDK 实例...");
834
834
  this.#ws.close();
835
835
  this.#ws = null;
836
- this.logger.info("NapCat SDK instance destroyed.");
837
- } else this.logger.warn("NapCat SDK instance is not initialized.");
836
+ this.logger.info("NapCat SDK 实例已销毁。");
837
+ } else this.logger.warn("NapCat SDK 实例未初始化。");
838
838
  }
839
839
  };
840
840
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","name: string","pkg.name","version: string","pkg.version","DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>>","options: NapcatOptions","#stat","#config","#ws","#uin","#nickname","crypto","#echoEvent","name","#nicknameCache","quote_id: string | null","#transformOneBotMessage","#buildFriend","#wrapReply","#buildGroup","#bindInternalEvents","#event","#online","#buildPrivateMessageEvent","#buildGroupMessageEvent","err: any","#ensureWsConnection","#echoId","#waitForAction","#cookieCache","#buildWsUrl","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nexport const noop = (): void => {}\n\nexport const ABSTRACT_LOGGER: Logger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n error: console.error.bind(console, '[ERROR]'),\n warn: console.warn.bind(console, '[WARN]'),\n info: console.info.bind(console, '[INFO]'),\n debug: console.debug.bind(console, '[DEBUG]'),\n trace: console.trace.bind(console, '[TRACE]'),\n}\n","{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.6.1\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMemberInfo,\n GroupMessageEvent,\n GroupWithInfo,\n NapcatOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n Stat,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = ''\n /** 机器人状态 */\n #online: boolean = false\n /** nickname 缓存 */\n #nicknameCache = new Map<number, string>()\n /** 消息数据 */\n #stat: Stat = {\n start_time: Date.now(),\n recv: { group: 0, private: 0 },\n send: { group: 0, private: 0 },\n }\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: NapcatOptions) {}\n\n /** 统计数据 */\n get stat(): Stat {\n return this.#stat\n }\n\n /** 配置项 */\n get #config(): Required<NapcatOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket is not connected.')\n throw new Error('WebSocket is not connected.')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n *\n * @deprecated 建议使用 `uin` 属性\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n const { protocol, host, port, token } = this.#config\n return `${protocol}://${host}:${port}?access_token=${token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket is not connected.')\n throw new Error('WebSocket is not connected.')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket is not open.')\n throw new Error('WebSocket is not open.')\n }\n }\n\n /** 标准化可发送消息元素 */\n normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API Error: 发送失败,请先添加对方为好友')\n } else {\n reject(`API Error: ${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n sign: this.setGroupSign.bind(this, group_id),\n setTitle: this.setGroupSpecialTitle.bind(this, group_id),\n setCard: this.setGroupCard.bind(this, group_id),\n setEssence: this.setEssenceMsg.bind(this),\n delEssence: this.deleteEssenceMsg.bind(this),\n getInfo: this.getGroupInfo.bind(this, group_id),\n getMemberList: this.getGroupMemberList.bind(this, group_id),\n getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),\n recall: this.recallMsg.bind(this),\n ban: this.setGroupBan.bind(this, group_id),\n sendMsg: this.sendGroupMsg.bind(this, group_id),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n const name = nickname || this.#nicknameCache.get(user_id) || ''\n this.#nicknameCache.set(user_id, name)\n\n return {\n ...extraInfo,\n user_id,\n nickname: name,\n napcat: this,\n delete: this.deleteFriend.bind(this, user_id),\n sendMsg: this.sendPrivateMsg.bind(this, user_id),\n getInfo: this.getStrangerInfo.bind(this, user_id),\n }\n }\n\n #transformOneBotMessage(message: any[]): RecvElement[] {\n return (message || []).filter((e) => e.type !== 'reply').map((el: any) => ({ type: el.type, ...el.data }))\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n const target = event.target_id\n ? { user_id: event.target_id, nickname: this.#nicknameCache.get(event.target_id) || '' }\n : { user_id: event.sender.user_id, nickname: event.sender.nickname }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<PrivateMessageEvent | null>,\n message: this.#transformOneBotMessage(event.message),\n friend: this.#buildFriend(target.user_id, target.nickname),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<GroupMessageEvent | null>,\n getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),\n message: this.#transformOneBotMessage(event.message),\n group: this.#buildGroup(event.group_id, event.group_name || ''),\n recall: this.recallMsg.bind(this, event.message_id),\n addReaction: this.addReaction.bind(this, event.message_id),\n delReaction: this.delReaction.bind(this, event.message_id),\n setEssence: this.setEssenceMsg.bind(this, event.message_id),\n delEssence: this.deleteEssenceMsg.bind(this, event.message_id),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`received meta_event: ${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('recv meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n timestamp: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n this.#stat.recv.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.recv.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n const msg = this.stringifyMessage(data.message)\n\n const group = data.group ? `${data.group_name}(${data.group_id})` : ''\n const sender = `${data.sender.nickname}(${data.sender.user_id})`\n\n switch (data.message_type) {\n case 'private': {\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n this.logger.trace(`received private message: ${JSON.stringify(data)}`)\n this.logger.info(`[私:${sender}] ${msg}`)\n break\n }\n\n case 'group': {\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n this.logger.trace(`received group message: ${JSON.stringify(data)}`)\n this.logger.info(`[群:${group}] ${sender}: ${msg}`)\n break\n }\n\n default: {\n this.logger.debug(`received unknown message type: ${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n if (data.message_type === 'private') {\n this.#stat.send.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.send.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message_sent', data)\n this.logger.trace(`received message_sent: ${JSON.stringify(data)}`)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n\n const msg = this.stringifyMessage(data.message)\n\n if (data.message_type === 'group' && data.group_id) {\n this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`)\n } else {\n this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`received notice: ${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`received unknown notice type: ${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`received request: ${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`received: ${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`Error to pickGroup ${group_id}: ${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`Error to pickFriend ${user_id}: ${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`registering once: ${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`registering: ${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`unregistering: ${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`calling api action: ${action} with params: ${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 获取好友列表\n */\n async getFriendList(): Promise<(Friend & Record<string, any>)[]> {\n const friends = await this.api<Friend[]>('get_friend_list')\n return friends.map((f) => this.#buildFriend(f.user_id, f.nickname, f))\n }\n\n /**\n * 获取群列表\n */\n async getGroupList(): Promise<(Group & Record<string, any>)[]> {\n const groups = await this.api<Group[]>('get_group_list')\n return groups.map((g) => this.#buildGroup(g.group_id, g.group_name, g))\n }\n\n /**\n * 添加消息回应\n */\n addReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: true })\n }\n\n /**\n * 删除消息回应\n */\n delReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: false })\n }\n\n /**\n * 获取消息\n */\n async getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null> {\n if (!message_id) {\n return null\n }\n\n const msg = await this.api<any>('get_msg', { message_id })\n\n if (msg.message_type === 'private') {\n return this.#buildPrivateMessageEvent(msg)\n } else {\n return this.#buildGroupMessageEvent(msg)\n }\n }\n\n /**\n * 删除好友\n */\n deleteFriend(user_id: number, block: boolean = false, both: boolean = false): Promise<void> {\n return this.api<void>('delete_friend', {\n user_id,\n temp_block: block,\n temp_both_del: both,\n })\n }\n\n /**\n * 设置群成员禁言\n */\n setGroupBan(group_id: number, user_id: number, duration: number): Promise<void> {\n return this.api<void>('set_group_ban', { group_id, user_id, duration })\n }\n\n /**\n * 撤回消息\n */\n recallMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_msg', { message_id })\n }\n\n /**\n * 获取陌生人信息\n */\n getStrangerInfo(user_id: number): Promise<any> {\n return this.api<any>('get_stranger_info', { user_id })\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 获取群信息\n */\n getGroupInfo(group_id: number): Promise<any> {\n return this.api<any>('get_group_info', { group_id })\n }\n\n /**\n * 群签到\n */\n setGroupSign(group_id: number): Promise<any> {\n return this.api<void>('set_group_sign', { group_id })\n }\n\n /**\n * 设置群精华消息\n */\n setEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('set_essence_msg', { message_id })\n }\n\n /**\n * 删除群精华消息\n */\n deleteEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_essence_msg', { message_id })\n }\n\n /**\n * 设置群成员名片\n */\n setGroupCard(group_id: number, user_id: number, card: string): Promise<void> {\n return this.api<void>('set_group_card', { group_id, user_id, card })\n }\n\n /**\n * 设置群成员专属头衔\n */\n setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void> {\n return this.api<void>('set_group_special_title', { group_id, user_id, title })\n }\n\n /**\n * 获取群成员列表\n */\n getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]> {\n return this.api<GroupMemberInfo[]>('get_group_member_list', { group_id })\n }\n\n /**\n * 获取群成员信息\n */\n getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo> {\n return this.api<GroupMemberInfo>('get_group_member_info', { group_id, user_id })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`run with config: ${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`received non-json message: ${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat disconnected')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat error: ${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat connected')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket instance created.`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('destroying NapCat SDK instance...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK instance destroyed.')\n } else {\n this.logger.warn('NapCat SDK instance is not initialized.')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","name: string","pkg.name","version: string","pkg.version","DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>>","options: NapcatOptions","#stat","#config","#ws","#uin","#nickname","crypto","#echoEvent","name","#nicknameCache","quote_id: string | null","#transformOneBotMessage","#buildFriend","#wrapReply","#buildGroup","#bindInternalEvents","#event","#online","#buildPrivateMessageEvent","#buildGroupMessageEvent","err: any","#ensureWsConnection","#echoId","#waitForAction","#cookieCache","#buildWsUrl","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nexport const noop = (): void => {}\n\nexport const ABSTRACT_LOGGER: Logger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n error: console.error.bind(console, '[ERROR]'),\n warn: console.warn.bind(console, '[WARN]'),\n info: console.info.bind(console, '[INFO]'),\n debug: console.debug.bind(console, '[DEBUG]'),\n trace: console.trace.bind(console, '[TRACE]'),\n}\n","{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.6.2\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMemberInfo,\n GroupMessageEvent,\n GroupWithInfo,\n NapcatOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n Stat,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = ''\n /** 机器人状态 */\n #online: boolean = false\n /** nickname 缓存 */\n #nicknameCache = new Map<number, string>()\n /** 消息数据 */\n #stat: Stat = {\n start_time: Date.now(),\n recv: { group: 0, private: 0 },\n send: { group: 0, private: 0 },\n }\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: NapcatOptions) {}\n\n /** 统计数据 */\n get stat(): Stat {\n return this.#stat\n }\n\n /** 配置项 */\n get #config(): Required<NapcatOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n *\n * @deprecated 建议使用 `uin` 属性\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n const { protocol, host, port, token } = this.#config\n return `${protocol}://${host}:${port}?access_token=${token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket 未打开。')\n throw new Error('WebSocket 未打开。')\n }\n }\n\n /** 标准化可发送消息元素 */\n normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API 错误:发送失败,请先添加对方为好友')\n } else {\n reject(`API 错误:${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n sign: this.setGroupSign.bind(this, group_id),\n setTitle: this.setGroupSpecialTitle.bind(this, group_id),\n setCard: this.setGroupCard.bind(this, group_id),\n setEssence: this.setEssenceMsg.bind(this),\n delEssence: this.deleteEssenceMsg.bind(this),\n getInfo: this.getGroupInfo.bind(this, group_id),\n getMemberList: this.getGroupMemberList.bind(this, group_id),\n getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),\n recall: this.recallMsg.bind(this),\n ban: this.setGroupBan.bind(this, group_id),\n sendMsg: this.sendGroupMsg.bind(this, group_id),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n const name = nickname || this.#nicknameCache.get(user_id) || ''\n this.#nicknameCache.set(user_id, name)\n\n return {\n ...extraInfo,\n user_id,\n nickname: name,\n napcat: this,\n delete: this.deleteFriend.bind(this, user_id),\n sendMsg: this.sendPrivateMsg.bind(this, user_id),\n getInfo: this.getStrangerInfo.bind(this, user_id),\n }\n }\n\n #transformOneBotMessage(message: any[]): RecvElement[] {\n return (message || []).filter((e) => e.type !== 'reply').map((el: any) => ({ type: el.type, ...el.data }))\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n const target = event.target_id\n ? { user_id: event.target_id, nickname: this.#nicknameCache.get(event.target_id) || '' }\n : { user_id: event.sender.user_id, nickname: event.sender.nickname }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<PrivateMessageEvent | null>,\n message: this.#transformOneBotMessage(event.message),\n friend: this.#buildFriend(target.user_id, target.nickname),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<GroupMessageEvent | null>,\n getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),\n message: this.#transformOneBotMessage(event.message),\n group: this.#buildGroup(event.group_id, event.group_name || ''),\n recall: this.recallMsg.bind(this, event.message_id),\n addReaction: this.addReaction.bind(this, event.message_id),\n delReaction: this.delReaction.bind(this, event.message_id),\n setEssence: this.setEssenceMsg.bind(this, event.message_id),\n delEssence: this.deleteEssenceMsg.bind(this, event.message_id),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`收到 meta_event:${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('收到 meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n timestamp: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n this.#stat.recv.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.recv.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n const msg = this.stringifyMessage(data.message)\n\n const group = data.group ? `${data.group_name}(${data.group_id})` : ''\n const sender = `${data.sender.nickname}(${data.sender.user_id})`\n\n switch (data.message_type) {\n case 'private': {\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n this.logger.trace(`收到私聊消息:${JSON.stringify(data)}`)\n this.logger.info(`[私:${sender}] ${msg}`)\n break\n }\n\n case 'group': {\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n this.logger.trace(`收到群消息:${JSON.stringify(data)}`)\n this.logger.info(`[群:${group}] ${sender}: ${msg}`)\n break\n }\n\n default: {\n this.logger.debug(`收到未知消息类型:${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n if (data.message_type === 'private') {\n this.#stat.send.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.send.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message_sent', data)\n this.logger.trace(`收到 message_sent:${JSON.stringify(data)}`)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n\n const msg = this.stringifyMessage(data.message)\n\n if (data.message_type === 'group' && data.group_id) {\n this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`)\n } else {\n this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`收到通知:${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`收到未知通知类型:${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`收到请求:${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`收到:${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`获取群 ${group_id} 信息失败:${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`获取好友 ${user_id} 信息失败:${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`注册一次性监听器:${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`注册监听器:${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`移除监听器:${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`调用 API:${action},参数:${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 获取好友列表\n */\n async getFriendList(): Promise<(Friend & Record<string, any>)[]> {\n const friends = await this.api<Friend[]>('get_friend_list')\n return friends.map((f) => this.#buildFriend(f.user_id, f.nickname, f))\n }\n\n /**\n * 获取群列表\n */\n async getGroupList(): Promise<(Group & Record<string, any>)[]> {\n const groups = await this.api<Group[]>('get_group_list')\n return groups.map((g) => this.#buildGroup(g.group_id, g.group_name, g))\n }\n\n /**\n * 添加消息回应\n */\n addReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: true })\n }\n\n /**\n * 删除消息回应\n */\n delReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: false })\n }\n\n /**\n * 获取消息\n */\n async getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null> {\n if (!message_id) {\n return null\n }\n\n const msg = await this.api<any>('get_msg', { message_id })\n\n if (msg.message_type === 'private') {\n return this.#buildPrivateMessageEvent(msg)\n } else {\n return this.#buildGroupMessageEvent(msg)\n }\n }\n\n /**\n * 删除好友\n */\n deleteFriend(user_id: number, block: boolean = false, both: boolean = false): Promise<void> {\n return this.api<void>('delete_friend', {\n user_id,\n temp_block: block,\n temp_both_del: both,\n })\n }\n\n /**\n * 设置群成员禁言\n */\n setGroupBan(group_id: number, user_id: number, duration: number): Promise<void> {\n return this.api<void>('set_group_ban', { group_id, user_id, duration })\n }\n\n /**\n * 撤回消息\n */\n recallMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_msg', { message_id })\n }\n\n /**\n * 获取陌生人信息\n */\n getStrangerInfo(user_id: number): Promise<any> {\n return this.api<any>('get_stranger_info', { user_id })\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 获取群信息\n */\n getGroupInfo(group_id: number): Promise<any> {\n return this.api<any>('get_group_info', { group_id })\n }\n\n /**\n * 群签到\n */\n setGroupSign(group_id: number): Promise<any> {\n return this.api<void>('set_group_sign', { group_id })\n }\n\n /**\n * 设置群精华消息\n */\n setEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('set_essence_msg', { message_id })\n }\n\n /**\n * 删除群精华消息\n */\n deleteEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_essence_msg', { message_id })\n }\n\n /**\n * 设置群成员名片\n */\n setGroupCard(group_id: number, user_id: number, card: string): Promise<void> {\n return this.api<void>('set_group_card', { group_id, user_id, card })\n }\n\n /**\n * 设置群成员专属头衔\n */\n setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void> {\n return this.api<void>('set_group_special_title', { group_id, user_id, title })\n }\n\n /**\n * 获取群成员列表\n */\n getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]> {\n return this.api<GroupMemberInfo[]>('get_group_member_list', { group_id })\n }\n\n /**\n * 获取群成员信息\n */\n getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo> {\n return this.api<GroupMemberInfo>('get_group_member_info', { group_id, user_id })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除 Cookie 缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`启动配置:${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`收到非 JSON 消息:${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat 已断开连接')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat 发生错误:${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat 已连接')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket 实例已创建。`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('正在销毁 NapCat SDK 实例...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK 实例已销毁。')\n } else {\n this.logger.warn('NapCat SDK 实例未初始化。')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":"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"}
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.6.1";
24
+ var version$1 = "0.6.2";
25
25
 
26
26
  //#endregion
27
27
  //#region src/segment.ts
@@ -139,8 +139,8 @@ var NapCat = class {
139
139
  /** WebSocket 实例 */
140
140
  get ws() {
141
141
  if (!this.#ws) {
142
- this.logger.error("WebSocket is not connected.");
143
- throw new Error("WebSocket is not connected.");
142
+ this.logger.error("WebSocket 未连接。");
143
+ throw new Error("WebSocket 未连接。");
144
144
  }
145
145
  return this.#ws;
146
146
  }
@@ -190,12 +190,12 @@ var NapCat = class {
190
190
  /** 确保 WebSocket 已连接 */
191
191
  #ensureWsConnection(ws) {
192
192
  if (!ws) {
193
- this.logger.error("WebSocket is not connected.");
194
- throw new Error("WebSocket is not connected.");
193
+ this.logger.error("WebSocket 未连接。");
194
+ throw new Error("WebSocket 未连接。");
195
195
  }
196
196
  if (ws.readyState !== WebSocket.OPEN) {
197
- this.logger.error("WebSocket is not open.");
198
- throw new Error("WebSocket is not open.");
197
+ this.logger.error("WebSocket 未打开。");
198
+ throw new Error("WebSocket 未打开。");
199
199
  }
200
200
  }
201
201
  /** 标准化可发送消息元素 */
@@ -224,8 +224,8 @@ var NapCat = class {
224
224
  if (!data || data.echo !== echoId) return;
225
225
  this.#echoEvent.off(eventName, handle);
226
226
  if (data.retcode === 0) resolve(data.data);
227
- else if (data.retcode === 1200) reject("API Error: 发送失败,请先添加对方为好友");
228
- else reject(`API Error: ${data.message}`);
227
+ else if (data.retcode === 1200) reject("API 错误:发送失败,请先添加对方为好友");
228
+ else reject(`API 错误:${data.message}`);
229
229
  };
230
230
  this.#echoEvent.on(eventName, handle);
231
231
  });
@@ -318,11 +318,11 @@ var NapCat = class {
318
318
  if (data.post_type) {
319
319
  switch (data.post_type) {
320
320
  case "meta_event":
321
- this.logger.trace(`received meta_event: ${JSON.stringify(data)}`);
321
+ this.logger.trace(`收到 meta_event:${JSON.stringify(data)}`);
322
322
  this.#event.emit("meta_event", data);
323
323
  if (data.meta_event_type) {
324
324
  this.#event.emit(`meta_event.${data.meta_event_type}`, data);
325
- this.logger.debug("recv meta_event_type:", data.meta_event_type);
325
+ this.logger.debug("收到 meta_event_type", data.meta_event_type);
326
326
  if (data.sub_type) {
327
327
  if (data.sub_type === "connect") {
328
328
  const { app_name, app_version, protocol_version } = await this.getVersionInfo();
@@ -359,17 +359,17 @@ var NapCat = class {
359
359
  case "private":
360
360
  this.#event.emit("message.private", data);
361
361
  this.#event.emit(`message.private.${data.sub_type}`, data);
362
- this.logger.trace(`received private message: ${JSON.stringify(data)}`);
362
+ this.logger.trace(`收到私聊消息:${JSON.stringify(data)}`);
363
363
  this.logger.info(`[私:${sender}] ${msg}`);
364
364
  break;
365
365
  case "group":
366
366
  this.#event.emit("message.group", data);
367
367
  this.#event.emit(`message.group.${data.sub_type}`, data);
368
- this.logger.trace(`received group message: ${JSON.stringify(data)}`);
368
+ this.logger.trace(`收到群消息:${JSON.stringify(data)}`);
369
369
  this.logger.info(`[群:${group}] ${sender}: ${msg}`);
370
370
  break;
371
371
  default:
372
- this.logger.debug(`received unknown message type: ${JSON.stringify(data)}`);
372
+ this.logger.debug(`收到未知消息类型:${JSON.stringify(data)}`);
373
373
  break;
374
374
  }
375
375
  break;
@@ -383,7 +383,7 @@ var NapCat = class {
383
383
  data = this.#buildGroupMessageEvent(data);
384
384
  }
385
385
  this.#event.emit("message_sent", data);
386
- this.logger.trace(`received message_sent: ${JSON.stringify(data)}`);
386
+ this.logger.trace(`收到 message_sent:${JSON.stringify(data)}`);
387
387
  if (data.message_type) {
388
388
  this.#event.emit(`message_sent.${data.message_type}`, data);
389
389
  if (data.sub_type) this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data);
@@ -393,9 +393,9 @@ var NapCat = class {
393
393
  }
394
394
  break;
395
395
  case "notice": {
396
- this.logger.trace(`received notice: ${JSON.stringify(data)}`);
396
+ this.logger.trace(`收到通知:${JSON.stringify(data)}`);
397
397
  if (!data.notice_type) {
398
- this.logger.debug(`received unknown notice type: ${JSON.stringify(data)}`);
398
+ this.logger.debug(`收到未知通知类型:${JSON.stringify(data)}`);
399
399
  break;
400
400
  }
401
401
  const isNotify = data.notice_type === "notify";
@@ -419,7 +419,7 @@ var NapCat = class {
419
419
  break;
420
420
  }
421
421
  case "request":
422
- this.logger.trace(`received request: ${JSON.stringify(data)}`);
422
+ this.logger.trace(`收到请求:${JSON.stringify(data)}`);
423
423
  if (data.request_type === "friend") {
424
424
  data.reject = (reason) => this.api("set_friend_add_request", {
425
425
  flag: data.flag,
@@ -449,7 +449,7 @@ var NapCat = class {
449
449
  }
450
450
  break;
451
451
  default:
452
- this.logger.debug(`received: ${JSON.stringify(data)}`);
452
+ this.logger.debug(`收到:${JSON.stringify(data)}`);
453
453
  this.#event.emit(data.post_type, data);
454
454
  return;
455
455
  }
@@ -479,7 +479,7 @@ var NapCat = class {
479
479
  const groupInfo = await this.api("get_group_info", { group_id });
480
480
  return this.#buildGroup(group_id, groupInfo.group_name, groupInfo);
481
481
  } catch (err) {
482
- this.logger.warn(`Error to pickGroup ${group_id}: ${err?.message || err}`);
482
+ this.logger.warn(`获取群 ${group_id} 信息失败:${err?.message || err}`);
483
483
  return null;
484
484
  }
485
485
  }
@@ -489,7 +489,7 @@ var NapCat = class {
489
489
  const friendInfo = await this.api("get_stranger_info", { user_id });
490
490
  return this.#buildFriend(user_id, friendInfo.nickname, friendInfo);
491
491
  } catch (err) {
492
- this.logger.warn(`Error to pickFriend ${user_id}: ${err?.message || err}`);
492
+ this.logger.warn(`获取好友 ${user_id} 信息失败:${err?.message || err}`);
493
493
  return null;
494
494
  }
495
495
  }
@@ -501,7 +501,7 @@ var NapCat = class {
501
501
  handler(event);
502
502
  this.#event.off(type, onceHandler);
503
503
  };
504
- this.logger.debug(`registering once: ${String(type)}`);
504
+ this.logger.debug(`注册一次性监听器:${String(type)}`);
505
505
  this.#event.on(type, onceHandler);
506
506
  }
507
507
  /**
@@ -512,14 +512,14 @@ var NapCat = class {
512
512
  * 如果需要移除监听器,请调用 `off` 方法
513
513
  */
514
514
  on(type, handler) {
515
- this.logger.debug(`registering: ${String(type)}`);
515
+ this.logger.debug(`注册监听器:${String(type)}`);
516
516
  this.#event.on(type, handler);
517
517
  }
518
518
  /**
519
519
  * 移除事件监听器
520
520
  */
521
521
  off(type, handler) {
522
- this.logger.debug(`unregistering: ${String(type)}`);
522
+ this.logger.debug(`移除监听器:${String(type)}`);
523
523
  this.#event.off(type, handler);
524
524
  }
525
525
  /**
@@ -527,7 +527,7 @@ var NapCat = class {
527
527
  */
528
528
  api(action, params = {}) {
529
529
  this.#ensureWsConnection(this.#ws);
530
- this.logger.debug(`calling api action: ${action} with params: ${JSON.stringify(params)}`);
530
+ this.logger.debug(`调用 API:${action},参数:${JSON.stringify(params)}`);
531
531
  const echo = this.#echoId();
532
532
  this.#ws.send(JSON.stringify({
533
533
  echo,
@@ -760,7 +760,7 @@ var NapCat = class {
760
760
  /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */
761
761
  async run() {
762
762
  const { logger: _, token: __, ...config } = this.#config;
763
- this.logger.debug(`run with config: ${JSON.stringify(config)}`);
763
+ this.logger.debug(`启动配置:${JSON.stringify(config)}`);
764
764
  return new Promise((resolve, reject) => {
765
765
  const ws = new WebSocket(this.#buildWsUrl());
766
766
  ws.onmessage = (event) => {
@@ -772,7 +772,7 @@ var NapCat = class {
772
772
  }
773
773
  })();
774
774
  if (!data) {
775
- this.logger.debug(`received non-json message: ${event.data}`);
775
+ this.logger.debug(`收到非 JSON 消息:${event.data}`);
776
776
  return;
777
777
  }
778
778
  this.#event.emit("ws.message", data);
@@ -780,32 +780,32 @@ var NapCat = class {
780
780
  };
781
781
  ws.onclose = () => {
782
782
  this.#online = false;
783
- this.logger.debug("NapCat disconnected");
783
+ this.logger.debug("NapCat 已断开连接");
784
784
  this.#event.emit("ws.close");
785
785
  };
786
786
  ws.onerror = (error) => {
787
787
  this.#online = false;
788
- this.logger.debug(`NapCat error: ${error}`);
788
+ this.logger.debug(`NapCat 发生错误:${error}`);
789
789
  this.#event.emit("ws.error", error);
790
790
  reject(error);
791
791
  };
792
792
  ws.onopen = () => {
793
- this.logger.debug("NapCat connected");
793
+ this.logger.debug("NapCat 已连接");
794
794
  this.#event.emit("ws.open");
795
795
  resolve();
796
796
  };
797
797
  this.#ws = ws;
798
- this.logger.trace(`WebSocket instance created.`);
798
+ this.logger.trace(`WebSocket 实例已创建。`);
799
799
  });
800
800
  }
801
801
  /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */
802
802
  close() {
803
803
  if (this.#ws) {
804
- this.logger.info("destroying NapCat SDK instance...");
804
+ this.logger.info("正在销毁 NapCat SDK 实例...");
805
805
  this.#ws.close();
806
806
  this.#ws = null;
807
- this.logger.info("NapCat SDK instance destroyed.");
808
- } else this.logger.warn("NapCat SDK instance is not initialized.");
807
+ this.logger.info("NapCat SDK 实例已销毁。");
808
+ } else this.logger.warn("NapCat SDK 实例未初始化。");
809
809
  }
810
810
  };
811
811
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","name: string","pkg.name","version: string","pkg.version","DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>>","options: NapcatOptions","#stat","#config","#ws","#uin","#nickname","#echoEvent","name","#nicknameCache","quote_id: string | null","#transformOneBotMessage","#buildFriend","#wrapReply","#buildGroup","#bindInternalEvents","#event","#online","#buildPrivateMessageEvent","#buildGroupMessageEvent","err: any","#ensureWsConnection","#echoId","#waitForAction","#cookieCache","#buildWsUrl","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nexport const noop = (): void => {}\n\nexport const ABSTRACT_LOGGER: Logger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n error: console.error.bind(console, '[ERROR]'),\n warn: console.warn.bind(console, '[WARN]'),\n info: console.info.bind(console, '[INFO]'),\n debug: console.debug.bind(console, '[DEBUG]'),\n trace: console.trace.bind(console, '[TRACE]'),\n}\n","{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.6.1\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMemberInfo,\n GroupMessageEvent,\n GroupWithInfo,\n NapcatOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n Stat,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = ''\n /** 机器人状态 */\n #online: boolean = false\n /** nickname 缓存 */\n #nicknameCache = new Map<number, string>()\n /** 消息数据 */\n #stat: Stat = {\n start_time: Date.now(),\n recv: { group: 0, private: 0 },\n send: { group: 0, private: 0 },\n }\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: NapcatOptions) {}\n\n /** 统计数据 */\n get stat(): Stat {\n return this.#stat\n }\n\n /** 配置项 */\n get #config(): Required<NapcatOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket is not connected.')\n throw new Error('WebSocket is not connected.')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n *\n * @deprecated 建议使用 `uin` 属性\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n const { protocol, host, port, token } = this.#config\n return `${protocol}://${host}:${port}?access_token=${token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket is not connected.')\n throw new Error('WebSocket is not connected.')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket is not open.')\n throw new Error('WebSocket is not open.')\n }\n }\n\n /** 标准化可发送消息元素 */\n normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API Error: 发送失败,请先添加对方为好友')\n } else {\n reject(`API Error: ${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n sign: this.setGroupSign.bind(this, group_id),\n setTitle: this.setGroupSpecialTitle.bind(this, group_id),\n setCard: this.setGroupCard.bind(this, group_id),\n setEssence: this.setEssenceMsg.bind(this),\n delEssence: this.deleteEssenceMsg.bind(this),\n getInfo: this.getGroupInfo.bind(this, group_id),\n getMemberList: this.getGroupMemberList.bind(this, group_id),\n getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),\n recall: this.recallMsg.bind(this),\n ban: this.setGroupBan.bind(this, group_id),\n sendMsg: this.sendGroupMsg.bind(this, group_id),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n const name = nickname || this.#nicknameCache.get(user_id) || ''\n this.#nicknameCache.set(user_id, name)\n\n return {\n ...extraInfo,\n user_id,\n nickname: name,\n napcat: this,\n delete: this.deleteFriend.bind(this, user_id),\n sendMsg: this.sendPrivateMsg.bind(this, user_id),\n getInfo: this.getStrangerInfo.bind(this, user_id),\n }\n }\n\n #transformOneBotMessage(message: any[]): RecvElement[] {\n return (message || []).filter((e) => e.type !== 'reply').map((el: any) => ({ type: el.type, ...el.data }))\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n const target = event.target_id\n ? { user_id: event.target_id, nickname: this.#nicknameCache.get(event.target_id) || '' }\n : { user_id: event.sender.user_id, nickname: event.sender.nickname }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<PrivateMessageEvent | null>,\n message: this.#transformOneBotMessage(event.message),\n friend: this.#buildFriend(target.user_id, target.nickname),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<GroupMessageEvent | null>,\n getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),\n message: this.#transformOneBotMessage(event.message),\n group: this.#buildGroup(event.group_id, event.group_name || ''),\n recall: this.recallMsg.bind(this, event.message_id),\n addReaction: this.addReaction.bind(this, event.message_id),\n delReaction: this.delReaction.bind(this, event.message_id),\n setEssence: this.setEssenceMsg.bind(this, event.message_id),\n delEssence: this.deleteEssenceMsg.bind(this, event.message_id),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`received meta_event: ${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('recv meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n timestamp: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n this.#stat.recv.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.recv.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n const msg = this.stringifyMessage(data.message)\n\n const group = data.group ? `${data.group_name}(${data.group_id})` : ''\n const sender = `${data.sender.nickname}(${data.sender.user_id})`\n\n switch (data.message_type) {\n case 'private': {\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n this.logger.trace(`received private message: ${JSON.stringify(data)}`)\n this.logger.info(`[私:${sender}] ${msg}`)\n break\n }\n\n case 'group': {\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n this.logger.trace(`received group message: ${JSON.stringify(data)}`)\n this.logger.info(`[群:${group}] ${sender}: ${msg}`)\n break\n }\n\n default: {\n this.logger.debug(`received unknown message type: ${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n if (data.message_type === 'private') {\n this.#stat.send.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.send.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message_sent', data)\n this.logger.trace(`received message_sent: ${JSON.stringify(data)}`)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n\n const msg = this.stringifyMessage(data.message)\n\n if (data.message_type === 'group' && data.group_id) {\n this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`)\n } else {\n this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`received notice: ${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`received unknown notice type: ${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`received request: ${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`received: ${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`Error to pickGroup ${group_id}: ${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`Error to pickFriend ${user_id}: ${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`registering once: ${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`registering: ${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`unregistering: ${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`calling api action: ${action} with params: ${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 获取好友列表\n */\n async getFriendList(): Promise<(Friend & Record<string, any>)[]> {\n const friends = await this.api<Friend[]>('get_friend_list')\n return friends.map((f) => this.#buildFriend(f.user_id, f.nickname, f))\n }\n\n /**\n * 获取群列表\n */\n async getGroupList(): Promise<(Group & Record<string, any>)[]> {\n const groups = await this.api<Group[]>('get_group_list')\n return groups.map((g) => this.#buildGroup(g.group_id, g.group_name, g))\n }\n\n /**\n * 添加消息回应\n */\n addReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: true })\n }\n\n /**\n * 删除消息回应\n */\n delReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: false })\n }\n\n /**\n * 获取消息\n */\n async getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null> {\n if (!message_id) {\n return null\n }\n\n const msg = await this.api<any>('get_msg', { message_id })\n\n if (msg.message_type === 'private') {\n return this.#buildPrivateMessageEvent(msg)\n } else {\n return this.#buildGroupMessageEvent(msg)\n }\n }\n\n /**\n * 删除好友\n */\n deleteFriend(user_id: number, block: boolean = false, both: boolean = false): Promise<void> {\n return this.api<void>('delete_friend', {\n user_id,\n temp_block: block,\n temp_both_del: both,\n })\n }\n\n /**\n * 设置群成员禁言\n */\n setGroupBan(group_id: number, user_id: number, duration: number): Promise<void> {\n return this.api<void>('set_group_ban', { group_id, user_id, duration })\n }\n\n /**\n * 撤回消息\n */\n recallMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_msg', { message_id })\n }\n\n /**\n * 获取陌生人信息\n */\n getStrangerInfo(user_id: number): Promise<any> {\n return this.api<any>('get_stranger_info', { user_id })\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 获取群信息\n */\n getGroupInfo(group_id: number): Promise<any> {\n return this.api<any>('get_group_info', { group_id })\n }\n\n /**\n * 群签到\n */\n setGroupSign(group_id: number): Promise<any> {\n return this.api<void>('set_group_sign', { group_id })\n }\n\n /**\n * 设置群精华消息\n */\n setEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('set_essence_msg', { message_id })\n }\n\n /**\n * 删除群精华消息\n */\n deleteEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_essence_msg', { message_id })\n }\n\n /**\n * 设置群成员名片\n */\n setGroupCard(group_id: number, user_id: number, card: string): Promise<void> {\n return this.api<void>('set_group_card', { group_id, user_id, card })\n }\n\n /**\n * 设置群成员专属头衔\n */\n setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void> {\n return this.api<void>('set_group_special_title', { group_id, user_id, title })\n }\n\n /**\n * 获取群成员列表\n */\n getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]> {\n return this.api<GroupMemberInfo[]>('get_group_member_list', { group_id })\n }\n\n /**\n * 获取群成员信息\n */\n getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo> {\n return this.api<GroupMemberInfo>('get_group_member_info', { group_id, user_id })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`run with config: ${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`received non-json message: ${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat disconnected')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat error: ${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat connected')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket instance created.`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('destroying NapCat SDK instance...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK instance destroyed.')\n } else {\n this.logger.warn('NapCat SDK instance is not initialized.')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","name: string","pkg.name","version: string","pkg.version","DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>>","options: NapcatOptions","#stat","#config","#ws","#uin","#nickname","#echoEvent","name","#nicknameCache","quote_id: string | null","#transformOneBotMessage","#buildFriend","#wrapReply","#buildGroup","#bindInternalEvents","#event","#online","#buildPrivateMessageEvent","#buildGroupMessageEvent","err: any","#ensureWsConnection","#echoId","#waitForAction","#cookieCache","#buildWsUrl","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nexport const noop = (): void => {}\n\nexport const ABSTRACT_LOGGER: Logger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n error: console.error.bind(console, '[ERROR]'),\n warn: console.warn.bind(console, '[WARN]'),\n info: console.info.bind(console, '[INFO]'),\n debug: console.debug.bind(console, '[DEBUG]'),\n trace: console.trace.bind(console, '[TRACE]'),\n}\n","{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.6.2\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMemberInfo,\n GroupMessageEvent,\n GroupWithInfo,\n NapcatOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n Stat,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = ''\n /** 机器人状态 */\n #online: boolean = false\n /** nickname 缓存 */\n #nicknameCache = new Map<number, string>()\n /** 消息数据 */\n #stat: Stat = {\n start_time: Date.now(),\n recv: { group: 0, private: 0 },\n send: { group: 0, private: 0 },\n }\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: NapcatOptions) {}\n\n /** 统计数据 */\n get stat(): Stat {\n return this.#stat\n }\n\n /** 配置项 */\n get #config(): Required<NapcatOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n *\n * @deprecated 建议使用 `uin` 属性\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n const { protocol, host, port, token } = this.#config\n return `${protocol}://${host}:${port}?access_token=${token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket 未打开。')\n throw new Error('WebSocket 未打开。')\n }\n }\n\n /** 标准化可发送消息元素 */\n normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API 错误:发送失败,请先添加对方为好友')\n } else {\n reject(`API 错误:${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n sign: this.setGroupSign.bind(this, group_id),\n setTitle: this.setGroupSpecialTitle.bind(this, group_id),\n setCard: this.setGroupCard.bind(this, group_id),\n setEssence: this.setEssenceMsg.bind(this),\n delEssence: this.deleteEssenceMsg.bind(this),\n getInfo: this.getGroupInfo.bind(this, group_id),\n getMemberList: this.getGroupMemberList.bind(this, group_id),\n getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),\n recall: this.recallMsg.bind(this),\n ban: this.setGroupBan.bind(this, group_id),\n sendMsg: this.sendGroupMsg.bind(this, group_id),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n const name = nickname || this.#nicknameCache.get(user_id) || ''\n this.#nicknameCache.set(user_id, name)\n\n return {\n ...extraInfo,\n user_id,\n nickname: name,\n napcat: this,\n delete: this.deleteFriend.bind(this, user_id),\n sendMsg: this.sendPrivateMsg.bind(this, user_id),\n getInfo: this.getStrangerInfo.bind(this, user_id),\n }\n }\n\n #transformOneBotMessage(message: any[]): RecvElement[] {\n return (message || []).filter((e) => e.type !== 'reply').map((el: any) => ({ type: el.type, ...el.data }))\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n const target = event.target_id\n ? { user_id: event.target_id, nickname: this.#nicknameCache.get(event.target_id) || '' }\n : { user_id: event.sender.user_id, nickname: event.sender.nickname }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<PrivateMessageEvent | null>,\n message: this.#transformOneBotMessage(event.message),\n friend: this.#buildFriend(target.user_id, target.nickname),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<GroupMessageEvent | null>,\n getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),\n message: this.#transformOneBotMessage(event.message),\n group: this.#buildGroup(event.group_id, event.group_name || ''),\n recall: this.recallMsg.bind(this, event.message_id),\n addReaction: this.addReaction.bind(this, event.message_id),\n delReaction: this.delReaction.bind(this, event.message_id),\n setEssence: this.setEssenceMsg.bind(this, event.message_id),\n delEssence: this.deleteEssenceMsg.bind(this, event.message_id),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`收到 meta_event:${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('收到 meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n timestamp: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n this.#stat.recv.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.recv.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n const msg = this.stringifyMessage(data.message)\n\n const group = data.group ? `${data.group_name}(${data.group_id})` : ''\n const sender = `${data.sender.nickname}(${data.sender.user_id})`\n\n switch (data.message_type) {\n case 'private': {\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n this.logger.trace(`收到私聊消息:${JSON.stringify(data)}`)\n this.logger.info(`[私:${sender}] ${msg}`)\n break\n }\n\n case 'group': {\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n this.logger.trace(`收到群消息:${JSON.stringify(data)}`)\n this.logger.info(`[群:${group}] ${sender}: ${msg}`)\n break\n }\n\n default: {\n this.logger.debug(`收到未知消息类型:${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n if (data.message_type === 'private') {\n this.#stat.send.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.send.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message_sent', data)\n this.logger.trace(`收到 message_sent:${JSON.stringify(data)}`)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n\n const msg = this.stringifyMessage(data.message)\n\n if (data.message_type === 'group' && data.group_id) {\n this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`)\n } else {\n this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`收到通知:${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`收到未知通知类型:${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`收到请求:${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`收到:${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`获取群 ${group_id} 信息失败:${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`获取好友 ${user_id} 信息失败:${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`注册一次性监听器:${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`注册监听器:${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`移除监听器:${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`调用 API:${action},参数:${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 获取好友列表\n */\n async getFriendList(): Promise<(Friend & Record<string, any>)[]> {\n const friends = await this.api<Friend[]>('get_friend_list')\n return friends.map((f) => this.#buildFriend(f.user_id, f.nickname, f))\n }\n\n /**\n * 获取群列表\n */\n async getGroupList(): Promise<(Group & Record<string, any>)[]> {\n const groups = await this.api<Group[]>('get_group_list')\n return groups.map((g) => this.#buildGroup(g.group_id, g.group_name, g))\n }\n\n /**\n * 添加消息回应\n */\n addReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: true })\n }\n\n /**\n * 删除消息回应\n */\n delReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: false })\n }\n\n /**\n * 获取消息\n */\n async getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null> {\n if (!message_id) {\n return null\n }\n\n const msg = await this.api<any>('get_msg', { message_id })\n\n if (msg.message_type === 'private') {\n return this.#buildPrivateMessageEvent(msg)\n } else {\n return this.#buildGroupMessageEvent(msg)\n }\n }\n\n /**\n * 删除好友\n */\n deleteFriend(user_id: number, block: boolean = false, both: boolean = false): Promise<void> {\n return this.api<void>('delete_friend', {\n user_id,\n temp_block: block,\n temp_both_del: both,\n })\n }\n\n /**\n * 设置群成员禁言\n */\n setGroupBan(group_id: number, user_id: number, duration: number): Promise<void> {\n return this.api<void>('set_group_ban', { group_id, user_id, duration })\n }\n\n /**\n * 撤回消息\n */\n recallMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_msg', { message_id })\n }\n\n /**\n * 获取陌生人信息\n */\n getStrangerInfo(user_id: number): Promise<any> {\n return this.api<any>('get_stranger_info', { user_id })\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 获取群信息\n */\n getGroupInfo(group_id: number): Promise<any> {\n return this.api<any>('get_group_info', { group_id })\n }\n\n /**\n * 群签到\n */\n setGroupSign(group_id: number): Promise<any> {\n return this.api<void>('set_group_sign', { group_id })\n }\n\n /**\n * 设置群精华消息\n */\n setEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('set_essence_msg', { message_id })\n }\n\n /**\n * 删除群精华消息\n */\n deleteEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_essence_msg', { message_id })\n }\n\n /**\n * 设置群成员名片\n */\n setGroupCard(group_id: number, user_id: number, card: string): Promise<void> {\n return this.api<void>('set_group_card', { group_id, user_id, card })\n }\n\n /**\n * 设置群成员专属头衔\n */\n setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void> {\n return this.api<void>('set_group_special_title', { group_id, user_id, title })\n }\n\n /**\n * 获取群成员列表\n */\n getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]> {\n return this.api<GroupMemberInfo[]>('get_group_member_list', { group_id })\n }\n\n /**\n * 获取群成员信息\n */\n getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo> {\n return this.api<GroupMemberInfo>('get_group_member_info', { group_id, user_id })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除 Cookie 缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`启动配置:${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`收到非 JSON 消息:${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat 已断开连接')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat 发生错误:${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat 已连接')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket 实例已创建。`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('正在销毁 NapCat SDK 实例...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK 实例已销毁。')\n } else {\n this.logger.warn('NapCat SDK 实例未初始化。')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "napcat-sdk",
3
3
  "type": "module",
4
- "version": "0.6.1",
4
+ "version": "0.6.2",
5
5
  "description": "A simple SDK for NapCat OneBot v11.",
6
6
  "keywords": [
7
7
  "napcat",
package/readme.md CHANGED
@@ -1,69 +1,69 @@
1
1
  # NapCat SDK for TypeScript
2
2
 
3
- > More details see [GitHub](https://github.com/vikiboss/mioki)
3
+ > 更多详情请查看 [GitHub](https://github.com/vikiboss/mioki)
4
4
 
5
- ## Getting Started
5
+ ### 快速开始
6
6
 
7
- The NapCat SDK for TypeScript allows developers to easily integrate NapCat's functionalities into their TypeScript applications. This SDK provides a set of tools and utilities to interact with NapCat services seamlessly.
7
+ NapCat SDK for TypeScript 允许开发者轻松地将 NapCat 的功能集成到他们的 TypeScript 应用中。该 SDK 提供了一套工具和实用程序,可以无缝地与 NapCat 服务进行交互。
8
8
 
9
- ## Installation
9
+ ### 安装
10
10
 
11
- You can install the NapCat SDK via npm. Run the following command in your terminal:
11
+ 你可以通过 npm 安装 NapCat SDK。在终端中运行以下命令:
12
12
 
13
13
  ```bash
14
14
  pnpm install napcat-sdk
15
15
  ```
16
16
 
17
- ## Quick Start
17
+ ### 快速开始
18
18
 
19
- To connect to NapCat, you need to create an instance of the NapCat client. Here's a simple example:
19
+ 要连接到 NapCat,你需要创建一个 NapCat 客户端实例。这是一个简单的示例:
20
20
 
21
21
  ```typescript
22
22
  import { NapCat, segment } from 'napcat-sdk'
23
23
 
24
- // 1. Create a new NapCat client instance
24
+ // 1. 创建一个新的 NapCat 客户端实例
25
25
  const napcat = new NapCat({
26
- // protocol: 'ws', // Optional: specify the protocol (default is 'ws')
27
- // host: 'localhost', // Optional: specify a custom host
28
- // port: 3333, // Optional: specify a custom port
29
- token: 'here-your-auth-token', // Required: your authentication token
26
+ // protocol: 'ws', // 可选:指定协议(默认为 'ws'
27
+ // host: 'localhost', // 可选:指定自定义主机
28
+ // port: 3333, // 可选:指定自定义端口
29
+ token: 'here-your-auth-token', // 必填:你的认证令牌
30
30
  })
31
31
 
32
- // 2. Subscribe to events
32
+ // 2. 订阅事件
33
33
  napcat.on('message', (event) => {
34
- // replay is a method to send a message quickly, optional with reply mark
35
- event.reply('Hello from NapCat SDK!', true) // true is for reply mark
34
+ // reply 是一个快速发送消息的方法,可选带回复标记
35
+ event.reply('Hello from NapCat SDK!', true) // true 表示带回复标记
36
36
 
37
- // you can call all the NapCat api through `napcat.api()` method
37
+ // 你可以通过 `napcat.api()` 方法调用所有 NapCat API
38
38
  const { value } = await napcat.api<{ value: unknown }>('awesome-function')
39
39
  })
40
40
 
41
- // you can also listen to specific message sub-types
41
+ // 你也可以监听特定的消息子类型
42
42
  napcat.on('message.group', async (event) => {
43
- // some methods of a message event are available
44
- await event.addEssence(event.message_id)
43
+ // 消息事件提供了一些可用的方法
44
+ await event.setEssence(event.message_id)
45
45
  await event.recall()
46
46
 
47
- // You can also interact with group instance to do some operations
47
+ // 你也可以与群实例交互来执行一些操作
48
48
  await event.group.setTitle(114514, 'Special Title')
49
49
 
50
- // message to send is allowed to be an array of segments
50
+ // 要发送的消息可以是消息段数组
51
51
  await event.reply(['Hi! ', napcat.segment.face(66)])
52
52
 
53
- // or just use napcat to send messages
53
+ // 或者直接使用 napcat 发送消息
54
54
  await napcat.sendGroupMsg(event.group_id, 'Hello Group!')
55
55
  })
56
56
 
57
- // and more events...
57
+ // 更多事件...
58
58
  napcat.on('notice', (event) => {})
59
59
  napcat.on('notice.group', (event) => {})
60
60
  napcat.on('request', (event) => {})
61
61
  napcat.on('request.group.invite', (event) => {
62
- // approve the group invite request, or event.reject() to reject
62
+ // 同意群邀请请求,或使用 event.reject() 拒绝
63
63
  event.approve()
64
64
  })
65
65
 
66
- // close the connection when needed
66
+ // 需要时关闭连接
67
67
  napcat.close()
68
68
  ```
69
69