napcat-sdk 0.4.2 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -50,7 +50,7 @@ const CONSOLE_LOGGER = {
50
50
  //#endregion
51
51
  //#region package.json
52
52
  var name$1 = "napcat-sdk";
53
- var version$1 = "0.4.2";
53
+ var version$1 = "0.5.1";
54
54
 
55
55
  //#endregion
56
56
  //#region src/segment.ts
@@ -340,7 +340,7 @@ var NapCat = class {
340
340
  };
341
341
  }
342
342
  /** 绑定内部事件处理器 */
343
- #bindInternalEvents(data) {
343
+ async #bindInternalEvents(data) {
344
344
  if (data.echo) {
345
345
  this.#echoEvent.emit(`echo#${data.echo}`, data);
346
346
  return;
@@ -355,15 +355,18 @@ var NapCat = class {
355
355
  this.logger.debug("recv meta_event_type:", data.meta_event_type);
356
356
  if (data.sub_type) {
357
357
  if (data.sub_type === "connect") {
358
- this.#uin = data.self_id;
358
+ const { app_name, app_version, protocol_version } = await this.getVersionInfo();
359
+ const { nickname, user_id } = await this.getLoginInfo();
359
360
  this.#online = true;
360
- this.getLoginInfo().then((info) => {
361
- this.#nickname = info.nickname;
362
- this.#event.emit("napcat.connected", {
363
- user_id: this.#uin,
364
- nickname: this.#nickname,
365
- ts: data.time * 1e3
366
- });
361
+ this.#uin = user_id;
362
+ this.#nickname = nickname;
363
+ this.#event.emit("napcat.connected", {
364
+ user_id: this.#uin,
365
+ nickname: this.#nickname,
366
+ app_name,
367
+ app_version,
368
+ protocol_version,
369
+ ts: data.time * 1e3
367
370
  });
368
371
  }
369
372
  this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data);
@@ -648,7 +651,7 @@ var NapCat = class {
648
651
  }
649
652
  })();
650
653
  if (!data) {
651
- this.logger.warn(`received non-json message: ${event.data}`);
654
+ this.logger.debug(`received non-json message: ${event.data}`);
652
655
  return;
653
656
  }
654
657
  this.#event.emit("ws.message", data);
@@ -656,12 +659,12 @@ var NapCat = class {
656
659
  };
657
660
  ws.onclose = () => {
658
661
  this.#online = false;
659
- this.logger.info("closed");
662
+ this.logger.debug("NapCat disconnected");
660
663
  this.#event.emit("ws.close");
661
664
  };
662
665
  ws.onerror = (error) => {
663
666
  this.#online = false;
664
- this.logger.error(`error: ${error}`);
667
+ this.logger.debug(`NapCat error: ${error}`);
665
668
  this.#event.emit("ws.error", error);
666
669
  reject(error);
667
670
  };
@@ -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<MiokiOptions>>","options: MiokiOptions","#config","#ws","#uin","#nickname","crypto","#echoEvent","quote_id: string | null","event","#buildPrivateMessageEvent","#buildFriend","#wrapReply","#buildGroupMessageEvent","#buildGroup","#event","#online","err: any","#ensureWsConnection","#echoId","#waitForAction","#normalizeSendable","#cookieCache","#buildWsUrl","#bindInternalEvents","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.4.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 GroupMessageEvent,\n GroupWithInfo,\n MiokiOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<MiokiOptions>> = {\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 /** 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: MiokiOptions) {}\n\n /** 配置项 */\n get #config(): Required<MiokiOptions> {\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 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 return `${this.#config.protocol}://${this.#config.host}:${this.#config.port}?access_token=${this.#config.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 doSign: () => this.api('set_group_sign', { group_id }),\n getInfo: () => this.api('get_group_info', { group_id }),\n getMemberList: async () => this.api('get_group_member_list', { group_id }),\n getMemberInfo: (user_id: number) => this.api('get_group_member_info', { group_id, user_id }),\n setTitle: (title: string) => this.api('set_group_special_title', { group_id, title }),\n setCard: (user_id: number, card: string) => this.api('set_group_card', { group_id, user_id, card }),\n addEssence: (message_id: string) => this.api('set_essence_msg', { message_id }),\n delEssence: (message_id: string) => this.api('delete_essence_msg', { message_id }),\n recall: (message_id: number) => this.api('delete_msg', { message_id }),\n banMember: (user_id: number, duration: number) => this.api('set_group_ban', { group_id, user_id, duration }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendGroupMsg(group_id, sendable),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n return {\n ...extraInfo,\n user_id,\n nickname,\n napcat: this,\n delete: (block?: boolean, both?: boolean) =>\n this.api('delete_friend', { user_id, temp_block: block, temp_both_del: both }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendPrivateMsg(user_id, sendable),\n getInfo: () => this.api('get_stranger_info', { user_id }),\n }\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 return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<PrivateMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<PrivateMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildPrivateMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n friend: this.#buildFriend(event.user_id, event.sender?.nickname || ''),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(event.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 return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<GroupMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<GroupMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildGroupMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n group: this.#buildGroup(event.group_id, event.group?.group_name || ''),\n recall: () => this.api<any>('delete_msg', { message_id: event.message_id }),\n addReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: true }),\n delReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: false }),\n addEssence: () => this.api('set_essence_msg', { message_id: event.message_id }),\n delEssence: () => this.api('delete_essence_msg', { message_id: 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 #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 this.#uin = data.self_id\n this.#online = true\n\n this.getLoginInfo().then((info) => {\n this.#nickname = info.nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n ts: data.time * 1000,\n })\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 data = this.#buildPrivateMessageEvent(data)\n } else {\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n switch (data.message_type) {\n case 'private': {\n this.logger.trace(`received private message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[P] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(data.message)}`,\n )\n\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n\n break\n }\n\n case 'group': {\n this.logger.trace(`received group message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[G:${data.group_name}:${data.group_id}] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(\n data.message,\n )}`,\n )\n\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n\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 this.logger.trace(`received message_sent: ${JSON.stringify(data)}`)\n this.#event.emit('message_sent', data)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\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 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 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.warn(`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.info('closed')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.error(`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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iCAAiC;QAElD,MAAK,OAAO,KAAK,0CAA0C;;;;;;;AAWjE,MAAMsB,2BAAsF;CAC1F,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACD,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACD,OAAO;EACL,aAAa;EACb,UAAU;EACX;CACF;;;;;AAMD,MAAMC,0BAAqF;CACzF,YAAY;EACV,aAAa;EACb,UAAU;EACX;CACD,eAAe;EACb,aAAa;EACb,UAAU;EACX;CACD,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACD,eAAe;EACb,aAAa;EACb,UAAU;EACX;CACD,aAAa;EACX,aAAa;EACb,UAAU;EACX;CACD,WAAW;EACT,aAAa;EACb,UAAU;EACX;CACD,YAAY;EACV,aAAa;EACb,UAAU;EACX;CACD,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACD,gBAAgB;EACd,aAAa;EACb,UAAU;EACX;CACD,gBAAgB;EACd,aAAa;EACb,UAAU;EACX;CACD,sBAAsB;EACpB,aAAa;EACb,UAAU;EACX;CACD,SAAS;EACP,aAAa;EACb,UAAU;EACX;CACD,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACF"}
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<MiokiOptions>>","options: MiokiOptions","#config","#ws","#uin","#nickname","crypto","#echoEvent","quote_id: string | null","event","#buildPrivateMessageEvent","#buildFriend","#wrapReply","#buildGroupMessageEvent","#buildGroup","#bindInternalEvents","#event","#online","err: any","#ensureWsConnection","#echoId","#waitForAction","#normalizeSendable","#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.5.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 GroupMessageEvent,\n GroupWithInfo,\n MiokiOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<MiokiOptions>> = {\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 /** 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: MiokiOptions) {}\n\n /** 配置项 */\n get #config(): Required<MiokiOptions> {\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 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 return `${this.#config.protocol}://${this.#config.host}:${this.#config.port}?access_token=${this.#config.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 doSign: () => this.api('set_group_sign', { group_id }),\n getInfo: () => this.api('get_group_info', { group_id }),\n getMemberList: async () => this.api('get_group_member_list', { group_id }),\n getMemberInfo: (user_id: number) => this.api('get_group_member_info', { group_id, user_id }),\n setTitle: (title: string) => this.api('set_group_special_title', { group_id, title }),\n setCard: (user_id: number, card: string) => this.api('set_group_card', { group_id, user_id, card }),\n addEssence: (message_id: string) => this.api('set_essence_msg', { message_id }),\n delEssence: (message_id: string) => this.api('delete_essence_msg', { message_id }),\n recall: (message_id: number) => this.api('delete_msg', { message_id }),\n banMember: (user_id: number, duration: number) => this.api('set_group_ban', { group_id, user_id, duration }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendGroupMsg(group_id, sendable),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n return {\n ...extraInfo,\n user_id,\n nickname,\n napcat: this,\n delete: (block?: boolean, both?: boolean) =>\n this.api('delete_friend', { user_id, temp_block: block, temp_both_del: both }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendPrivateMsg(user_id, sendable),\n getInfo: () => this.api('get_stranger_info', { user_id }),\n }\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 return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<PrivateMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<PrivateMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildPrivateMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n friend: this.#buildFriend(event.user_id, event.sender?.nickname || ''),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(event.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 return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<GroupMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<GroupMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildGroupMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n group: this.#buildGroup(event.group_id, event.group?.group_name || ''),\n recall: () => this.api<any>('delete_msg', { message_id: event.message_id }),\n addReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: true }),\n delReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: false }),\n addEssence: () => this.api('set_essence_msg', { message_id: event.message_id }),\n delEssence: () => this.api('delete_essence_msg', { message_id: 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 ts: 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 data = this.#buildPrivateMessageEvent(data)\n } else {\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n switch (data.message_type) {\n case 'private': {\n this.logger.trace(`received private message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[P] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(data.message)}`,\n )\n\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n\n break\n }\n\n case 'group': {\n this.logger.trace(`received group message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[G:${data.group_name}:${data.group_id}] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(\n data.message,\n )}`,\n )\n\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n\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 this.logger.trace(`received message_sent: ${JSON.stringify(data)}`)\n this.#event.emit('message_sent', data)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\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 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 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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"}
package/dist/index.d.cts CHANGED
@@ -36,6 +36,9 @@ interface EventMap extends OneBotEventMap {
36
36
  "napcat.connected": {
37
37
  user_id: number;
38
38
  nickname: string;
39
+ app_name: string;
40
+ app_version: string;
41
+ protocol_version: string;
39
42
  ts: number;
40
43
  };
41
44
  }
package/dist/index.d.mts CHANGED
@@ -36,6 +36,9 @@ interface EventMap extends OneBotEventMap {
36
36
  "napcat.connected": {
37
37
  user_id: number;
38
38
  nickname: string;
39
+ app_name: string;
40
+ app_version: string;
41
+ protocol_version: string;
39
42
  ts: number;
40
43
  };
41
44
  }
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.4.2";
24
+ var version$1 = "0.5.1";
25
25
 
26
26
  //#endregion
27
27
  //#region src/segment.ts
@@ -311,7 +311,7 @@ var NapCat = class {
311
311
  };
312
312
  }
313
313
  /** 绑定内部事件处理器 */
314
- #bindInternalEvents(data) {
314
+ async #bindInternalEvents(data) {
315
315
  if (data.echo) {
316
316
  this.#echoEvent.emit(`echo#${data.echo}`, data);
317
317
  return;
@@ -326,15 +326,18 @@ var NapCat = class {
326
326
  this.logger.debug("recv meta_event_type:", data.meta_event_type);
327
327
  if (data.sub_type) {
328
328
  if (data.sub_type === "connect") {
329
- this.#uin = data.self_id;
329
+ const { app_name, app_version, protocol_version } = await this.getVersionInfo();
330
+ const { nickname, user_id } = await this.getLoginInfo();
330
331
  this.#online = true;
331
- this.getLoginInfo().then((info) => {
332
- this.#nickname = info.nickname;
333
- this.#event.emit("napcat.connected", {
334
- user_id: this.#uin,
335
- nickname: this.#nickname,
336
- ts: data.time * 1e3
337
- });
332
+ this.#uin = user_id;
333
+ this.#nickname = nickname;
334
+ this.#event.emit("napcat.connected", {
335
+ user_id: this.#uin,
336
+ nickname: this.#nickname,
337
+ app_name,
338
+ app_version,
339
+ protocol_version,
340
+ ts: data.time * 1e3
338
341
  });
339
342
  }
340
343
  this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data);
@@ -619,7 +622,7 @@ var NapCat = class {
619
622
  }
620
623
  })();
621
624
  if (!data) {
622
- this.logger.warn(`received non-json message: ${event.data}`);
625
+ this.logger.debug(`received non-json message: ${event.data}`);
623
626
  return;
624
627
  }
625
628
  this.#event.emit("ws.message", data);
@@ -627,12 +630,12 @@ var NapCat = class {
627
630
  };
628
631
  ws.onclose = () => {
629
632
  this.#online = false;
630
- this.logger.info("closed");
633
+ this.logger.debug("NapCat disconnected");
631
634
  this.#event.emit("ws.close");
632
635
  };
633
636
  ws.onerror = (error) => {
634
637
  this.#online = false;
635
- this.logger.error(`error: ${error}`);
638
+ this.logger.debug(`NapCat error: ${error}`);
636
639
  this.#event.emit("ws.error", error);
637
640
  reject(error);
638
641
  };
@@ -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<MiokiOptions>>","options: MiokiOptions","#config","#ws","#uin","#nickname","#echoEvent","quote_id: string | null","event","#buildPrivateMessageEvent","#buildFriend","#wrapReply","#buildGroupMessageEvent","#buildGroup","#event","#online","err: any","#ensureWsConnection","#echoId","#waitForAction","#normalizeSendable","#cookieCache","#buildWsUrl","#bindInternalEvents","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.4.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 GroupMessageEvent,\n GroupWithInfo,\n MiokiOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<MiokiOptions>> = {\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 /** 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: MiokiOptions) {}\n\n /** 配置项 */\n get #config(): Required<MiokiOptions> {\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 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 return `${this.#config.protocol}://${this.#config.host}:${this.#config.port}?access_token=${this.#config.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 doSign: () => this.api('set_group_sign', { group_id }),\n getInfo: () => this.api('get_group_info', { group_id }),\n getMemberList: async () => this.api('get_group_member_list', { group_id }),\n getMemberInfo: (user_id: number) => this.api('get_group_member_info', { group_id, user_id }),\n setTitle: (title: string) => this.api('set_group_special_title', { group_id, title }),\n setCard: (user_id: number, card: string) => this.api('set_group_card', { group_id, user_id, card }),\n addEssence: (message_id: string) => this.api('set_essence_msg', { message_id }),\n delEssence: (message_id: string) => this.api('delete_essence_msg', { message_id }),\n recall: (message_id: number) => this.api('delete_msg', { message_id }),\n banMember: (user_id: number, duration: number) => this.api('set_group_ban', { group_id, user_id, duration }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendGroupMsg(group_id, sendable),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n return {\n ...extraInfo,\n user_id,\n nickname,\n napcat: this,\n delete: (block?: boolean, both?: boolean) =>\n this.api('delete_friend', { user_id, temp_block: block, temp_both_del: both }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendPrivateMsg(user_id, sendable),\n getInfo: () => this.api('get_stranger_info', { user_id }),\n }\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 return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<PrivateMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<PrivateMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildPrivateMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n friend: this.#buildFriend(event.user_id, event.sender?.nickname || ''),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(event.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 return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<GroupMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<GroupMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildGroupMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n group: this.#buildGroup(event.group_id, event.group?.group_name || ''),\n recall: () => this.api<any>('delete_msg', { message_id: event.message_id }),\n addReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: true }),\n delReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: false }),\n addEssence: () => this.api('set_essence_msg', { message_id: event.message_id }),\n delEssence: () => this.api('delete_essence_msg', { message_id: 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 #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 this.#uin = data.self_id\n this.#online = true\n\n this.getLoginInfo().then((info) => {\n this.#nickname = info.nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n ts: data.time * 1000,\n })\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 data = this.#buildPrivateMessageEvent(data)\n } else {\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n switch (data.message_type) {\n case 'private': {\n this.logger.trace(`received private message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[P] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(data.message)}`,\n )\n\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n\n break\n }\n\n case 'group': {\n this.logger.trace(`received group message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[G:${data.group_name}:${data.group_id}] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(\n data.message,\n )}`,\n )\n\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n\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 this.logger.trace(`received message_sent: ${JSON.stringify(data)}`)\n this.#event.emit('message_sent', data)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\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 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 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.warn(`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.info('closed')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.error(`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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AK,0CAA0C;;;;;;;AAWjE,MAAMqB,2BAAsF;CAC1F,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACD,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACD,OAAO;EACL,aAAa;EACb,UAAU;EACX;CACF;;;;;AAMD,MAAMC,0BAAqF;CACzF,YAAY;EACV,aAAa;EACb,UAAU;EACX;CACD,eAAe;EACb,aAAa;EACb,UAAU;EACX;CACD,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACD,eAAe;EACb,aAAa;EACb,UAAU;EACX;CACD,aAAa;EACX,aAAa;EACb,UAAU;EACX;CACD,WAAW;EACT,aAAa;EACb,UAAU;EACX;CACD,YAAY;EACV,aAAa;EACb,UAAU;EACX;CACD,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACD,gBAAgB;EACd,aAAa;EACb,UAAU;EACX;CACD,gBAAgB;EACd,aAAa;EACb,UAAU;EACX;CACD,sBAAsB;EACpB,aAAa;EACb,UAAU;EACX;CACD,SAAS;EACP,aAAa;EACb,UAAU;EACX;CACD,cAAc;EACZ,aAAa;EACb,UAAU;EACX;CACF"}
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<MiokiOptions>>","options: MiokiOptions","#config","#ws","#uin","#nickname","#echoEvent","quote_id: string | null","event","#buildPrivateMessageEvent","#buildFriend","#wrapReply","#buildGroupMessageEvent","#buildGroup","#bindInternalEvents","#event","#online","err: any","#ensureWsConnection","#echoId","#waitForAction","#normalizeSendable","#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.5.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 GroupMessageEvent,\n GroupWithInfo,\n MiokiOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<MiokiOptions>> = {\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 /** 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: MiokiOptions) {}\n\n /** 配置项 */\n get #config(): Required<MiokiOptions> {\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 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 return `${this.#config.protocol}://${this.#config.host}:${this.#config.port}?access_token=${this.#config.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 doSign: () => this.api('set_group_sign', { group_id }),\n getInfo: () => this.api('get_group_info', { group_id }),\n getMemberList: async () => this.api('get_group_member_list', { group_id }),\n getMemberInfo: (user_id: number) => this.api('get_group_member_info', { group_id, user_id }),\n setTitle: (title: string) => this.api('set_group_special_title', { group_id, title }),\n setCard: (user_id: number, card: string) => this.api('set_group_card', { group_id, user_id, card }),\n addEssence: (message_id: string) => this.api('set_essence_msg', { message_id }),\n delEssence: (message_id: string) => this.api('delete_essence_msg', { message_id }),\n recall: (message_id: number) => this.api('delete_msg', { message_id }),\n banMember: (user_id: number, duration: number) => this.api('set_group_ban', { group_id, user_id, duration }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendGroupMsg(group_id, sendable),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n return {\n ...extraInfo,\n user_id,\n nickname,\n napcat: this,\n delete: (block?: boolean, both?: boolean) =>\n this.api('delete_friend', { user_id, temp_block: block, temp_both_del: both }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendPrivateMsg(user_id, sendable),\n getInfo: () => this.api('get_stranger_info', { user_id }),\n }\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 return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<PrivateMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<PrivateMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildPrivateMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n friend: this.#buildFriend(event.user_id, event.sender?.nickname || ''),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(event.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 return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<GroupMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<GroupMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildGroupMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n group: this.#buildGroup(event.group_id, event.group?.group_name || ''),\n recall: () => this.api<any>('delete_msg', { message_id: event.message_id }),\n addReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: true }),\n delReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: false }),\n addEssence: () => this.api('set_essence_msg', { message_id: event.message_id }),\n delEssence: () => this.api('delete_essence_msg', { message_id: 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 ts: 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 data = this.#buildPrivateMessageEvent(data)\n } else {\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n switch (data.message_type) {\n case 'private': {\n this.logger.trace(`received private message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[P] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(data.message)}`,\n )\n\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n\n break\n }\n\n case 'group': {\n this.logger.trace(`received group message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[G:${data.group_name}:${data.group_id}] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(\n data.message,\n )}`,\n )\n\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n\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 this.logger.trace(`received message_sent: ${JSON.stringify(data)}`)\n this.#event.emit('message_sent', data)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\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 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 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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "napcat-sdk",
3
3
  "type": "module",
4
- "version": "0.4.2",
4
+ "version": "0.5.1",
5
5
  "description": "A simple SDK for NapCat OneBot v11.",
6
6
  "keywords": [
7
7
  "napcat",