napcat-sdk 0.6.2 → 0.6.4
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 +10 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.mjs +10 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -50,7 +50,7 @@ const CONSOLE_LOGGER = {
|
|
|
50
50
|
//#endregion
|
|
51
51
|
//#region package.json
|
|
52
52
|
var name$1 = "napcat-sdk";
|
|
53
|
-
var version$1 = "0.6.
|
|
53
|
+
var version$1 = "0.6.4";
|
|
54
54
|
|
|
55
55
|
//#endregion
|
|
56
56
|
//#region src/segment.ts
|
|
@@ -566,6 +566,15 @@ var NapCat = class {
|
|
|
566
566
|
return this.#waitForAction(echo);
|
|
567
567
|
}
|
|
568
568
|
/**
|
|
569
|
+
* 给好友名片点赞
|
|
570
|
+
*/
|
|
571
|
+
sendLike(user_id, times = 1) {
|
|
572
|
+
return this.api("send_like", {
|
|
573
|
+
user_id,
|
|
574
|
+
times
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
569
578
|
* 获取好友列表
|
|
570
579
|
*/
|
|
571
580
|
async getFriendList() {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","name: string","pkg.name","version: string","pkg.version","DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>>","options: NapcatOptions","#stat","#config","#ws","#uin","#nickname","crypto","#echoEvent","name","#nicknameCache","quote_id: string | null","#transformOneBotMessage","#buildFriend","#wrapReply","#buildGroup","#bindInternalEvents","#event","#online","#buildPrivateMessageEvent","#buildGroupMessageEvent","err: any","#ensureWsConnection","#echoId","#waitForAction","#cookieCache","#buildWsUrl","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nexport const noop = (): void => {}\n\nexport const ABSTRACT_LOGGER: Logger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n error: console.error.bind(console, '[ERROR]'),\n warn: console.warn.bind(console, '[WARN]'),\n info: console.info.bind(console, '[INFO]'),\n debug: console.debug.bind(console, '[DEBUG]'),\n trace: console.trace.bind(console, '[TRACE]'),\n}\n","{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.6.2\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMemberInfo,\n GroupMessageEvent,\n GroupWithInfo,\n NapcatOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n Stat,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = ''\n /** 机器人状态 */\n #online: boolean = false\n /** nickname 缓存 */\n #nicknameCache = new Map<number, string>()\n /** 消息数据 */\n #stat: Stat = {\n start_time: Date.now(),\n recv: { group: 0, private: 0 },\n send: { group: 0, private: 0 },\n }\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: NapcatOptions) {}\n\n /** 统计数据 */\n get stat(): Stat {\n return this.#stat\n }\n\n /** 配置项 */\n get #config(): Required<NapcatOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n *\n * @deprecated 建议使用 `uin` 属性\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n const { protocol, host, port, token } = this.#config\n return `${protocol}://${host}:${port}?access_token=${token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket 未打开。')\n throw new Error('WebSocket 未打开。')\n }\n }\n\n /** 标准化可发送消息元素 */\n normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API 错误:发送失败,请先添加对方为好友')\n } else {\n reject(`API 错误:${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n sign: this.setGroupSign.bind(this, group_id),\n setTitle: this.setGroupSpecialTitle.bind(this, group_id),\n setCard: this.setGroupCard.bind(this, group_id),\n setEssence: this.setEssenceMsg.bind(this),\n delEssence: this.deleteEssenceMsg.bind(this),\n getInfo: this.getGroupInfo.bind(this, group_id),\n getMemberList: this.getGroupMemberList.bind(this, group_id),\n getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),\n recall: this.recallMsg.bind(this),\n ban: this.setGroupBan.bind(this, group_id),\n sendMsg: this.sendGroupMsg.bind(this, group_id),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n const name = nickname || this.#nicknameCache.get(user_id) || ''\n this.#nicknameCache.set(user_id, name)\n\n return {\n ...extraInfo,\n user_id,\n nickname: name,\n napcat: this,\n delete: this.deleteFriend.bind(this, user_id),\n sendMsg: this.sendPrivateMsg.bind(this, user_id),\n getInfo: this.getStrangerInfo.bind(this, user_id),\n }\n }\n\n #transformOneBotMessage(message: any[]): RecvElement[] {\n return (message || []).filter((e) => e.type !== 'reply').map((el: any) => ({ type: el.type, ...el.data }))\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n const target = event.target_id\n ? { user_id: event.target_id, nickname: this.#nicknameCache.get(event.target_id) || '' }\n : { user_id: event.sender.user_id, nickname: event.sender.nickname }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<PrivateMessageEvent | null>,\n message: this.#transformOneBotMessage(event.message),\n friend: this.#buildFriend(target.user_id, target.nickname),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<GroupMessageEvent | null>,\n getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),\n message: this.#transformOneBotMessage(event.message),\n group: this.#buildGroup(event.group_id, event.group_name || ''),\n recall: this.recallMsg.bind(this, event.message_id),\n addReaction: this.addReaction.bind(this, event.message_id),\n delReaction: this.delReaction.bind(this, event.message_id),\n setEssence: this.setEssenceMsg.bind(this, event.message_id),\n delEssence: this.deleteEssenceMsg.bind(this, event.message_id),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`收到 meta_event:${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('收到 meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n timestamp: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n this.#stat.recv.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.recv.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n const msg = this.stringifyMessage(data.message)\n\n const group = data.group ? `${data.group_name}(${data.group_id})` : ''\n const sender = `${data.sender.nickname}(${data.sender.user_id})`\n\n switch (data.message_type) {\n case 'private': {\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n this.logger.trace(`收到私聊消息:${JSON.stringify(data)}`)\n this.logger.info(`[私:${sender}] ${msg}`)\n break\n }\n\n case 'group': {\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n this.logger.trace(`收到群消息:${JSON.stringify(data)}`)\n this.logger.info(`[群:${group}] ${sender}: ${msg}`)\n break\n }\n\n default: {\n this.logger.debug(`收到未知消息类型:${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n if (data.message_type === 'private') {\n this.#stat.send.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.send.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message_sent', data)\n this.logger.trace(`收到 message_sent:${JSON.stringify(data)}`)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n\n const msg = this.stringifyMessage(data.message)\n\n if (data.message_type === 'group' && data.group_id) {\n this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`)\n } else {\n this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`收到通知:${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`收到未知通知类型:${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`收到请求:${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`收到:${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`获取群 ${group_id} 信息失败:${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`获取好友 ${user_id} 信息失败:${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`注册一次性监听器:${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`注册监听器:${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`移除监听器:${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`调用 API:${action},参数:${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 获取好友列表\n */\n async getFriendList(): Promise<(Friend & Record<string, any>)[]> {\n const friends = await this.api<Friend[]>('get_friend_list')\n return friends.map((f) => this.#buildFriend(f.user_id, f.nickname, f))\n }\n\n /**\n * 获取群列表\n */\n async getGroupList(): Promise<(Group & Record<string, any>)[]> {\n const groups = await this.api<Group[]>('get_group_list')\n return groups.map((g) => this.#buildGroup(g.group_id, g.group_name, g))\n }\n\n /**\n * 添加消息回应\n */\n addReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: true })\n }\n\n /**\n * 删除消息回应\n */\n delReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: false })\n }\n\n /**\n * 获取消息\n */\n async getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null> {\n if (!message_id) {\n return null\n }\n\n const msg = await this.api<any>('get_msg', { message_id })\n\n if (msg.message_type === 'private') {\n return this.#buildPrivateMessageEvent(msg)\n } else {\n return this.#buildGroupMessageEvent(msg)\n }\n }\n\n /**\n * 删除好友\n */\n deleteFriend(user_id: number, block: boolean = false, both: boolean = false): Promise<void> {\n return this.api<void>('delete_friend', {\n user_id,\n temp_block: block,\n temp_both_del: both,\n })\n }\n\n /**\n * 设置群成员禁言\n */\n setGroupBan(group_id: number, user_id: number, duration: number): Promise<void> {\n return this.api<void>('set_group_ban', { group_id, user_id, duration })\n }\n\n /**\n * 撤回消息\n */\n recallMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_msg', { message_id })\n }\n\n /**\n * 获取陌生人信息\n */\n getStrangerInfo(user_id: number): Promise<any> {\n return this.api<any>('get_stranger_info', { user_id })\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 获取群信息\n */\n getGroupInfo(group_id: number): Promise<any> {\n return this.api<any>('get_group_info', { group_id })\n }\n\n /**\n * 群签到\n */\n setGroupSign(group_id: number): Promise<any> {\n return this.api<void>('set_group_sign', { group_id })\n }\n\n /**\n * 设置群精华消息\n */\n setEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('set_essence_msg', { message_id })\n }\n\n /**\n * 删除群精华消息\n */\n deleteEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_essence_msg', { message_id })\n }\n\n /**\n * 设置群成员名片\n */\n setGroupCard(group_id: number, user_id: number, card: string): Promise<void> {\n return this.api<void>('set_group_card', { group_id, user_id, card })\n }\n\n /**\n * 设置群成员专属头衔\n */\n setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void> {\n return this.api<void>('set_group_special_title', { group_id, user_id, title })\n }\n\n /**\n * 获取群成员列表\n */\n getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]> {\n return this.api<GroupMemberInfo[]>('get_group_member_list', { group_id })\n }\n\n /**\n * 获取群成员信息\n */\n getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo> {\n return this.api<GroupMemberInfo>('get_group_member_info', { group_id, user_id })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除 Cookie 缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`启动配置:${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`收到非 JSON 消息:${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat 已断开连接')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat 发生错误:${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat 已连接')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket 实例已创建。`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('正在销毁 NapCat SDK 实例...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK 实例已销毁。')\n } else {\n this.logger.warn('NapCat SDK 实例未初始化。')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","name: string","pkg.name","version: string","pkg.version","DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>>","options: NapcatOptions","#stat","#config","#ws","#uin","#nickname","crypto","#echoEvent","name","#nicknameCache","quote_id: string | null","#transformOneBotMessage","#buildFriend","#wrapReply","#buildGroup","#bindInternalEvents","#event","#online","#buildPrivateMessageEvent","#buildGroupMessageEvent","err: any","#ensureWsConnection","#echoId","#waitForAction","#cookieCache","#buildWsUrl","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nexport const noop = (): void => {}\n\nexport const ABSTRACT_LOGGER: Logger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n error: console.error.bind(console, '[ERROR]'),\n warn: console.warn.bind(console, '[WARN]'),\n info: console.info.bind(console, '[INFO]'),\n debug: console.debug.bind(console, '[DEBUG]'),\n trace: console.trace.bind(console, '[TRACE]'),\n}\n","{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.6.4\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMemberInfo,\n GroupMessageEvent,\n GroupWithInfo,\n NapcatOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n Stat,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = ''\n /** 机器人状态 */\n #online: boolean = false\n /** nickname 缓存 */\n #nicknameCache = new Map<number, string>()\n /** 消息数据 */\n #stat: Stat = {\n start_time: Date.now(),\n recv: { group: 0, private: 0 },\n send: { group: 0, private: 0 },\n }\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: NapcatOptions) {}\n\n /** 统计数据 */\n get stat(): Stat {\n return this.#stat\n }\n\n /** 配置项 */\n get #config(): Required<NapcatOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n *\n * @deprecated 建议使用 `uin` 属性\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n const { protocol, host, port, token } = this.#config\n return `${protocol}://${host}:${port}?access_token=${token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket 未打开。')\n throw new Error('WebSocket 未打开。')\n }\n }\n\n /** 标准化可发送消息元素 */\n normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API 错误:发送失败,请先添加对方为好友')\n } else {\n reject(`API 错误:${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n sign: this.setGroupSign.bind(this, group_id),\n setTitle: this.setGroupSpecialTitle.bind(this, group_id),\n setCard: this.setGroupCard.bind(this, group_id),\n setEssence: this.setEssenceMsg.bind(this),\n delEssence: this.deleteEssenceMsg.bind(this),\n getInfo: this.getGroupInfo.bind(this, group_id),\n getMemberList: this.getGroupMemberList.bind(this, group_id),\n getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),\n recall: this.recallMsg.bind(this),\n ban: this.setGroupBan.bind(this, group_id),\n sendMsg: this.sendGroupMsg.bind(this, group_id),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n const name = nickname || this.#nicknameCache.get(user_id) || ''\n this.#nicknameCache.set(user_id, name)\n\n return {\n ...extraInfo,\n user_id,\n nickname: name,\n napcat: this,\n delete: this.deleteFriend.bind(this, user_id),\n sendMsg: this.sendPrivateMsg.bind(this, user_id),\n getInfo: this.getStrangerInfo.bind(this, user_id),\n }\n }\n\n #transformOneBotMessage(message: any[]): RecvElement[] {\n return (message || []).filter((e) => e.type !== 'reply').map((el: any) => ({ type: el.type, ...el.data }))\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n const target = event.target_id\n ? { user_id: event.target_id, nickname: this.#nicknameCache.get(event.target_id) || '' }\n : { user_id: event.sender.user_id, nickname: event.sender.nickname }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<PrivateMessageEvent | null>,\n message: this.#transformOneBotMessage(event.message),\n friend: this.#buildFriend(target.user_id, target.nickname),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<GroupMessageEvent | null>,\n getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),\n message: this.#transformOneBotMessage(event.message),\n group: this.#buildGroup(event.group_id, event.group_name || ''),\n recall: this.recallMsg.bind(this, event.message_id),\n addReaction: this.addReaction.bind(this, event.message_id),\n delReaction: this.delReaction.bind(this, event.message_id),\n setEssence: this.setEssenceMsg.bind(this, event.message_id),\n delEssence: this.deleteEssenceMsg.bind(this, event.message_id),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`收到 meta_event:${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('收到 meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n timestamp: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n this.#stat.recv.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.recv.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n const msg = this.stringifyMessage(data.message)\n\n const group = data.group ? `${data.group_name}(${data.group_id})` : ''\n const sender = `${data.sender.nickname}(${data.sender.user_id})`\n\n switch (data.message_type) {\n case 'private': {\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n this.logger.trace(`收到私聊消息:${JSON.stringify(data)}`)\n this.logger.info(`[私:${sender}] ${msg}`)\n break\n }\n\n case 'group': {\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n this.logger.trace(`收到群消息:${JSON.stringify(data)}`)\n this.logger.info(`[群:${group}] ${sender}: ${msg}`)\n break\n }\n\n default: {\n this.logger.debug(`收到未知消息类型:${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n if (data.message_type === 'private') {\n this.#stat.send.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.send.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message_sent', data)\n this.logger.trace(`收到 message_sent:${JSON.stringify(data)}`)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n\n const msg = this.stringifyMessage(data.message)\n\n if (data.message_type === 'group' && data.group_id) {\n this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`)\n } else {\n this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`收到通知:${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`收到未知通知类型:${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`收到请求:${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`收到:${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`获取群 ${group_id} 信息失败:${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`获取好友 ${user_id} 信息失败:${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`注册一次性监听器:${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`注册监听器:${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`移除监听器:${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`调用 API:${action},参数:${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 给好友名片点赞\n */\n sendLike(user_id: number, times: number = 1): Promise<void> {\n return this.api<void>('send_like', { user_id, times })\n }\n\n /**\n * 获取好友列表\n */\n async getFriendList(): Promise<(Friend & Record<string, any>)[]> {\n const friends = await this.api<Friend[]>('get_friend_list')\n return friends.map((f) => this.#buildFriend(f.user_id, f.nickname, f))\n }\n\n /**\n * 获取群列表\n */\n async getGroupList(): Promise<(Group & Record<string, any>)[]> {\n const groups = await this.api<Group[]>('get_group_list')\n return groups.map((g) => this.#buildGroup(g.group_id, g.group_name, g))\n }\n\n /**\n * 添加消息回应\n */\n addReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: true })\n }\n\n /**\n * 删除消息回应\n */\n delReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: false })\n }\n\n /**\n * 获取消息\n */\n async getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null> {\n if (!message_id) {\n return null\n }\n\n const msg = await this.api<any>('get_msg', { message_id })\n\n if (msg.message_type === 'private') {\n return this.#buildPrivateMessageEvent(msg)\n } else {\n return this.#buildGroupMessageEvent(msg)\n }\n }\n\n /**\n * 删除好友\n */\n deleteFriend(user_id: number, block: boolean = false, both: boolean = false): Promise<void> {\n return this.api<void>('delete_friend', {\n user_id,\n temp_block: block,\n temp_both_del: both,\n })\n }\n\n /**\n * 设置群成员禁言\n */\n setGroupBan(group_id: number, user_id: number, duration: number): Promise<void> {\n return this.api<void>('set_group_ban', { group_id, user_id, duration })\n }\n\n /**\n * 撤回消息\n */\n recallMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_msg', { message_id })\n }\n\n /**\n * 获取陌生人信息\n */\n getStrangerInfo(user_id: number): Promise<any> {\n return this.api<any>('get_stranger_info', { user_id })\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 获取群信息\n */\n getGroupInfo(group_id: number): Promise<any> {\n return this.api<any>('get_group_info', { group_id })\n }\n\n /**\n * 群签到\n */\n setGroupSign(group_id: number): Promise<any> {\n return this.api<void>('set_group_sign', { group_id })\n }\n\n /**\n * 设置群精华消息\n */\n setEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('set_essence_msg', { message_id })\n }\n\n /**\n * 删除群精华消息\n */\n deleteEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_essence_msg', { message_id })\n }\n\n /**\n * 设置群成员名片\n */\n setGroupCard(group_id: number, user_id: number, card: string): Promise<void> {\n return this.api<void>('set_group_card', { group_id, user_id, card })\n }\n\n /**\n * 设置群成员专属头衔\n */\n setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void> {\n return this.api<void>('set_group_special_title', { group_id, user_id, title })\n }\n\n /**\n * 获取群成员列表\n */\n getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]> {\n return this.api<GroupMemberInfo[]>('get_group_member_list', { group_id })\n }\n\n /**\n * 获取群成员信息\n */\n getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo> {\n return this.api<GroupMemberInfo>('get_group_member_info', { group_id, user_id })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除 Cookie 缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`启动配置:${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`收到非 JSON 消息:${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat 已断开连接')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat 发生错误:${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat 已连接')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket 实例已创建。`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('正在销毁 NapCat SDK 实例...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK 实例已销毁。')\n } else {\n this.logger.warn('NapCat SDK 实例未初始化。')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAa,aAAmB;AAEhC,MAAaA,kBAA0B;CACrC,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;CACR;AAED,MAAaC,iBAAyB;CACpC,OAAO,QAAQ,MAAM,KAAK,SAAS,UAAU;CAC7C,MAAM,QAAQ,KAAK,KAAK,SAAS,SAAS;CAC1C,MAAM,QAAQ,KAAK,KAAK,SAAS,SAAS;CAC1C,OAAO,QAAQ,MAAM,KAAK,SAAS,UAAU;CAC7C,OAAO,QAAQ,MAAM,KAAK,SAAS,UAAU;CAC9C;;;;aCnBS;gBAEG;;;;ACDb,SAAS,cAAgD,MAAS,MAAsB;AACtF,QAAO;EAAE;EAAM,GAAG;EAAM;;;;;AAM1B,MAAa,UAAU;CAErB,OAAO,SAA8B,cAAc,QAAQ,EAAE,MAAM,CAAC;CAEpE,KAAK,OAA2C,cAAc,MAAM,EAAE,IAAI,CAAC;CAE3E,OAAO,OAA4B,cAAc,QAAQ,EAAE,IAAI,CAAC;CAEhE,QAAQ,OAA4B,cAAc,SAAS,EAAE,IAAI,CAAC;CAElE,QAAQ,MAAc,YACpB,cAAc,SAAS;EAAE;EAAM,GAAG;EAAS,CAAC;CAE9C,SAAS,MAAc,YACrB,cAAc,UAAU;EAAE;EAAM,GAAG;EAAS,CAAC;CAE/C,QAAQ,MAAc,YACpB,cAAc,SAAS;EAAE;EAAM,GAAG;EAAS,CAAC;CAE9C,QAAQ,YACN,cAAc,SAAS,EAAE,GAAG,SAAS,CAAC;CAExC,QAAQ,OAA4B,cAAc,SAAS,EAAE,IAAI,CAAC;CAElE,UAAU,MAAsB,OAA4B,cAAc,WAAW;EAAE;EAAI,UAAU;EAAM,CAAC;CAE5G,YAAyB,cAAc,QAAQ,EAAE,CAAC;CAElD,QAAQ,UAAoD,OAC1D,cAAc,SAAS;EAAE;EAAU;EAAI,CAAC;CAE1C,cACE,OACA,OACA,KACA,YACgB,cAAc,SAAS;EAAE,UAAU;EAAU;EAAK;EAAO;EAAO,GAAG;EAAS,CAAC;CAE/F,OAAO,YAAsE,cAAc,QAAQ,EAAE,GAAG,SAAS,CAAC;CAElH,UAAU,OAA4B,cAAc,WAAW,EAAE,IAAI,CAAC;CAEtE,OAAO,SAA8B,cAAc,QAAQ,EAAE,MAAM,CAAC;CAEpE,OAAO,MAAc,YACnB,cAAc,QAAQ;EAAE;EAAM,GAAG;EAAS,CAAC;CAE7C,gBAA6B,cAAc,YAAY,EAAE,CAAC;CAE1D,gBAA6B,cAAc,YAAY,EAAE,CAAC;CAC3D;;;;ACjCD,MAAaC,OAAeC;AAC5B,MAAaC,UAAkBC;AAE/B,MAAMC,yBAAiE;CACrE,UAAU;CACV,MAAM;CACN,MAAM;CACN,QAAQ;CACT;AAED,IAAa,SAAb,MAAoB;;CAElB,MAAwB;;CAExB,4BAAqE;;CAErE,gCAAqD;;CAErD,OAAe;;CAEf,YAAoB;;CAEpB,UAAmB;;CAEnB,iCAAiB,IAAI,KAAqB;;CAE1C,QAAc;EACZ,YAAY,KAAK,KAAK;EACtB,MAAM;GAAE,OAAO;GAAG,SAAS;GAAG;EAC9B,MAAM;GAAE,OAAO;GAAG,SAAS;GAAG;EAC/B;;CAED,+BAAe,IAAI,KAWhB;CAEH,YAAY,AAAiBC,SAAwB;EAAxB;;;CAG7B,IAAI,OAAa;AACf,SAAO,MAAKC;;;CAId,KAAIC,SAAmC;AACrC,SAAO;GACL,UAAU,KAAK,QAAQ,YAAY,uBAAuB;GAC1D,MAAM,KAAK,QAAQ,QAAQ,uBAAuB;GAClD,MAAM,KAAK,QAAQ,QAAQ,uBAAuB;GAClD,QAAQ,KAAK,QAAQ,UAAU,uBAAuB;GACtD,OAAO,KAAK,QAAQ;GACrB;;;CAIH,IAAI,KAAgB;AAClB,MAAI,CAAC,MAAKC,IAAK;AACb,QAAK,OAAO,MAAM,iBAAiB;AACnC,SAAM,IAAI,MAAM,iBAAiB;;AAGnC,SAAO,MAAKA;;;CAId,IAAI,SAAiB;AACnB,SAAO,MAAKD,OAAQ;;;CAItB,IAAI,UAA0B;AAC5B,SAAO;;;;;;;CAQT,IAAI,UAAkB;AACpB,SAAO,KAAK;;;;;CAMd,IAAI,MAAc;AAChB,SAAO,MAAKE;;;;;CAMd,IAAI,WAAmB;AACrB,SAAO,MAAKC;;;CAId,UAAU;AACR,SAAOC,oBAAO,YAAY,GAAG,CAAC,SAAS,MAAM;;;CAI/C,cAAsB;EACpB,MAAM,EAAE,UAAU,MAAM,MAAM,UAAU,MAAKJ;AAC7C,SAAO,GAAG,SAAS,KAAK,KAAK,GAAG,KAAK,gBAAgB;;;CAIvD,WAAW,UAAiC,YAAqB,OAA6B;EAC5F,MAAM,eAAe,OAAO,aAAa,WAAW,CAAC,SAAS,GAAG,CAAC,SAAS,CAAC,MAAM;AAElF,MAAI,SAAS,WACX,QAAO,CAAC,QAAQ,MAAM,OAAO,WAAW,CAAC,EAAE,GAAG,aAAa;AAG7D,SAAO;;;CAIT,oBAAoB,IAA+C;AACjE,MAAI,CAAC,IAAI;AACP,QAAK,OAAO,MAAM,iBAAiB;AACnC,SAAM,IAAI,MAAM,iBAAiB;;AAGnC,MAAI,GAAG,eAAe,UAAU,MAAM;AACpC,QAAK,OAAO,MAAM,iBAAiB;AACnC,SAAM,IAAI,MAAM,iBAAiB;;;;CAKrC,kBAAkB,KAAuD;AACvE,SAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,SAAS;AACjC,OAAI,OAAO,SAAS,SAClB,QAAO;IAAE,MAAM;IAAQ,MAAM,EAAE,MAAM,MAAM;IAAE;AAE/C,OAAI,KAAK,SAAS,KAChB,QAAO;IAAE,MAAM;IAAM,MAAM,EAAE,IAAI,OAAO,KAAK,GAAG,EAAE;IAAE;GAEtD,MAAM,EAAE,MAAM,GAAG,SAAS;AAC1B,UAAO;IAAE;IAAM;IAAM;IACrB;;;CAIJ,eAA8B,QAAgB;EAC5C,MAAM,YAAY,QAAQ;AAE1B,SAAO,IAAI,SAAY,SAAS,WAAW;GACzC,MAAM,UAAU,SAAc;AAC5B,QAAI,CAAC,QAAQ,KAAK,SAAS,OAAQ;AAEnC,UAAKK,UAAW,IAAI,WAAW,OAAO;AAEtC,QAAI,KAAK,YAAY,EACnB,SAAQ,KAAK,KAAU;aACd,KAAK,YAAY,KAC1B,QAAO,wBAAwB;QAE/B,QAAO,UAAU,KAAK,UAAU;;AAIpC,SAAKA,UAAW,GAAG,WAAW,OAAO;IACrC;;;CAIJ,YAA8B,UAAkB,aAAqB,IAAI,YAAe,EAAE,EAAkB;AAC1G,SAAO;GACL,GAAG;GACH;GACA;GACA,QAAQ;GACR,MAAM,KAAK,aAAa,KAAK,MAAM,SAAS;GAC5C,UAAU,KAAK,qBAAqB,KAAK,MAAM,SAAS;GACxD,SAAS,KAAK,aAAa,KAAK,MAAM,SAAS;GAC/C,YAAY,KAAK,cAAc,KAAK,KAAK;GACzC,YAAY,KAAK,iBAAiB,KAAK,KAAK;GAC5C,SAAS,KAAK,aAAa,KAAK,MAAM,SAAS;GAC/C,eAAe,KAAK,mBAAmB,KAAK,MAAM,SAAS;GAC3D,eAAe,KAAK,mBAAmB,KAAK,MAAM,SAAS;GAC3D,QAAQ,KAAK,UAAU,KAAK,KAAK;GACjC,KAAK,KAAK,YAAY,KAAK,MAAM,SAAS;GAC1C,SAAS,KAAK,aAAa,KAAK,MAAM,SAAS;GAChD;;;CAIH,aAA+B,SAAiB,WAAmB,IAAI,YAAe,EAAE,EAAmB;EACzG,MAAMC,SAAO,YAAY,MAAKC,cAAe,IAAI,QAAQ,IAAI;AAC7D,QAAKA,cAAe,IAAI,SAASD,OAAK;AAEtC,SAAO;GACL,GAAG;GACH;GACA,UAAUA;GACV,QAAQ;GACR,QAAQ,KAAK,aAAa,KAAK,MAAM,QAAQ;GAC7C,SAAS,KAAK,eAAe,KAAK,MAAM,QAAQ;GAChD,SAAS,KAAK,gBAAgB,KAAK,MAAM,QAAQ;GAClD;;CAGH,wBAAwB,SAA+B;AACrD,UAAQ,WAAW,EAAE,EAAE,QAAQ,MAAM,EAAE,SAAS,QAAQ,CAAC,KAAK,QAAa;GAAE,MAAM,GAAG;GAAM,GAAG,GAAG;GAAM,EAAE;;;CAI5G,0BAA0B,OAAuF;EAC/G,MAAME,WAA0B,MAAM,QAAQ,MAAM,OAAY,GAAG,SAAS,QAAQ,EAAE,MAAM,MAAM;AAElG,MAAI,MAAM,OAAO,SACf,OAAKD,cAAe,IAAI,MAAM,OAAO,SAAS,MAAM,OAAO,SAAS;EAGtE,MAAM,SAAS,MAAM,YACjB;GAAE,SAAS,MAAM;GAAW,UAAU,MAAKA,cAAe,IAAI,MAAM,UAAU,IAAI;GAAI,GACtF;GAAE,SAAS,MAAM,OAAO;GAAS,UAAU,MAAM,OAAO;GAAU;AAEtE,SAAO;GACL,GAAG;GACH;GACA,uBAAuB,KAAK,OAAO,SAAS;GAC5C,SAAS,MAAKE,uBAAwB,MAAM,QAAQ;GACpD,QAAQ,MAAKC,YAAa,OAAO,SAAS,OAAO,SAAS;GAC1D,QAAQ,UAAiC,QAAQ,UAC/C,KAAK,eAAe,OAAO,SAAS,MAAKC,UAAW,UAAU,MAAM,YAAY,MAAM,CAAC;GAC1F;;;CAIH,wBAAwB,OAAmF;EACzG,MAAMH,WAA0B,MAAM,QAAQ,MAAM,OAAY,GAAG,SAAS,QAAQ,EAAE,MAAM,MAAM;AAElG,MAAI,MAAM,OAAO,SACf,OAAKD,cAAe,IAAI,MAAM,OAAO,SAAS,MAAM,OAAO,SAAS;AAGtE,SAAO;GACL,GAAG;GACH;GACA,uBAAuB,KAAK,OAAO,SAAS;GAC5C,qBAAqB,KAAK,mBAAmB,KAAK,MAAM,MAAM,UAAU,MAAM,OAAO,QAAQ;GAC7F,SAAS,MAAKE,uBAAwB,MAAM,QAAQ;GACpD,OAAO,MAAKG,WAAY,MAAM,UAAU,MAAM,cAAc,GAAG;GAC/D,QAAQ,KAAK,UAAU,KAAK,MAAM,MAAM,WAAW;GACnD,aAAa,KAAK,YAAY,KAAK,MAAM,MAAM,WAAW;GAC1D,aAAa,KAAK,YAAY,KAAK,MAAM,MAAM,WAAW;GAC1D,YAAY,KAAK,cAAc,KAAK,MAAM,MAAM,WAAW;GAC3D,YAAY,KAAK,iBAAiB,KAAK,MAAM,MAAM,WAAW;GAC9D,QAAQ,UAAiC,QAAQ,UAC/C,KAAK,aAAa,MAAM,UAAU,MAAKD,UAAW,UAAU,MAAM,YAAY,MAAM,CAAC;GACxF;;;CAIH,OAAME,mBAAoB,MAAW;AACnC,MAAI,KAAK,MAAM;AACb,SAAKR,UAAW,KAAK,QAAQ,KAAK,QAAQ,KAAK;AAC/C;;AAGF,MAAI,KAAK,WAAW;AAClB,WAAQ,KAAK,WAAb;IACE,KAAK;AACH,UAAK,OAAO,MAAM,iBAAiB,KAAK,UAAU,KAAK,GAAG;AAE1D,WAAKS,MAAO,KAAK,cAAc,KAAK;AAEpC,SAAI,KAAK,iBAAiB;AACxB,YAAKA,MAAO,KAAK,cAAc,KAAK,mBAAmB,KAAK;AAE5D,WAAK,OAAO,MAAM,uBAAuB,KAAK,gBAAgB;AAE9D,UAAI,KAAK,UAAU;AACjB,WAAI,KAAK,aAAa,WAAW;QAC/B,MAAM,EAAE,UAAU,aAAa,qBAAqB,MAAM,KAAK,gBAAgB;QAC/E,MAAM,EAAE,UAAU,YAAY,MAAM,KAAK,cAAc;AAEvD,cAAKC,SAAU;AACf,cAAKb,MAAO;AACZ,cAAKC,WAAY;AAEjB,cAAKW,MAAO,KAAK,oBAAoB;SACnC,SAAS,MAAKZ;SACd,UAAU,MAAKC;SACf;SACA;SACA;SACA,WAAW,KAAK,OAAO;SACxB,CAAC;;AAGJ,aAAKW,MAAO,KAAK,cAAc,KAAK,gBAAgB,GAAG,KAAK,YAAY,KAAK;;;AAIjF;IAGF,KAAK,WAAW;AACd,SAAI,KAAK,iBAAiB,WAAW;AACnC,YAAKf,KAAM,KAAK;AAChB,aAAO,MAAKiB,yBAA0B,KAAK;YACtC;AACL,YAAKjB,KAAM,KAAK;AAChB,aAAO,MAAKkB,uBAAwB,KAAK;;AAG3C,WAAKH,MAAO,KAAK,WAAW,KAAK;KAEjC,MAAM,MAAM,KAAK,iBAAiB,KAAK,QAAQ;KAE/C,MAAM,QAAQ,KAAK,QAAQ,GAAG,KAAK,WAAW,GAAG,KAAK,SAAS,KAAK;KACpE,MAAM,SAAS,GAAG,KAAK,OAAO,SAAS,GAAG,KAAK,OAAO,QAAQ;AAE9D,aAAQ,KAAK,cAAb;MACE,KAAK;AACH,aAAKA,MAAO,KAAK,mBAAmB,KAAK;AACzC,aAAKA,MAAO,KAAK,mBAAmB,KAAK,YAAY,KAAK;AAC1D,YAAK,OAAO,MAAM,UAAU,KAAK,UAAU,KAAK,GAAG;AACnD,YAAK,OAAO,KAAK,MAAM,OAAO,IAAI,MAAM;AACxC;MAGF,KAAK;AACH,aAAKA,MAAO,KAAK,iBAAiB,KAAK;AACvC,aAAKA,MAAO,KAAK,iBAAiB,KAAK,YAAY,KAAK;AACxD,YAAK,OAAO,MAAM,SAAS,KAAK,UAAU,KAAK,GAAG;AAClD,YAAK,OAAO,KAAK,MAAM,MAAM,IAAI,OAAO,IAAI,MAAM;AAClD;MAGF;AACE,YAAK,OAAO,MAAM,YAAY,KAAK,UAAU,KAAK,GAAG;AAErD;;AAIJ;;IAGF,KAAK;AACH,SAAI,KAAK,iBAAiB,WAAW;AACnC,YAAKf,KAAM,KAAK;AAChB,aAAO,MAAKiB,yBAA0B,KAAK;YACtC;AACL,YAAKjB,KAAM,KAAK;AAChB,aAAO,MAAKkB,uBAAwB,KAAK;;AAG3C,WAAKH,MAAO,KAAK,gBAAgB,KAAK;AACtC,UAAK,OAAO,MAAM,mBAAmB,KAAK,UAAU,KAAK,GAAG;AAE5D,SAAI,KAAK,cAAc;AACrB,YAAKA,MAAO,KAAK,gBAAgB,KAAK,gBAAgB,KAAK;AAE3D,UAAI,KAAK,SACP,OAAKA,MAAO,KAAK,gBAAgB,KAAK,aAAa,GAAG,KAAK,YAAY,KAAK;MAG9E,MAAM,MAAM,KAAK,iBAAiB,KAAK,QAAQ;AAE/C,UAAI,KAAK,iBAAiB,WAAW,KAAK,SACxC,MAAK,OAAO,KAAK,UAAU,KAAK,WAAW,GAAG,KAAK,SAAS,KAAK,MAAM;UAEvE,MAAK,OAAO,KAAK,UAAU,KAAK,OAAO,SAAS,GAAG,KAAK,OAAO,QAAQ,KAAK,MAAM;;AAItF;IAGF,KAAK,UAAU;AACb,UAAK,OAAO,MAAM,QAAQ,KAAK,UAAU,KAAK,GAAG;AAEjD,SAAI,CAAC,KAAK,aAAa;AACrB,WAAK,OAAO,MAAM,YAAY,KAAK,UAAU,KAAK,GAAG;AACrD;;KAGF,MAAM,WAAW,KAAK,gBAAgB;KACtC,MAAM,SAAS,KAAK,aAAa;KACjC,MAAM,UAAU,CAAC,CAAC,KAAK;KAEvB,MAAM,EAAE,aAAa,aAAa,WAC9B,SACE;MAAE,aAAa,UAAU,UAAU;MAAU,UAAU;MAAQ,GAC/D,yBAAyB,KAAK,aAAa,EAAE,GAC/C,wBAAwB,KAAK,gBAAgB,EAAE;AAEnD,UAAK,uBAAuB,KAAK;AACjC,UAAK,cAAc,eAAe,KAAK;AAEvC,SAAI,KAAK,YAAY,KAAK,aAAa,SACrC,MAAK,cAAc,KAAK;AAG1B,UAAK,WAAW,YAAY,KAAK;AAEjC,SAAI,QACF,MAAK,QAAQ,MAAKF,WAAY,KAAK,UAAU,KAAK,cAAc,GAAG;SAEnE,MAAK,SAAS,MAAKF,YAAa,KAAK,SAAS,KAAK,YAAY,GAAG;AAGpE,WAAKI,MAAO,KAAK,UAAU,KAAK;AAEhC,SAAI,aAAa;AACf,YAAKA,MAAO,KAAK,UAAU,eAAe,KAAK;AAC/C,UAAI,SACF,OAAKA,MAAO,KAAK,UAAU,YAAY,GAAG,YAAY,KAAK;;AAI/D;;IAGF,KAAK;AACH,UAAK,OAAO,MAAM,QAAQ,KAAK,UAAU,KAAK,GAAG;AAEjD,SAAI,KAAK,iBAAiB,UAAU;AAClC,WAAK,UAAU,WACb,KAAK,IAAI,0BAA0B;OAAE,MAAM,KAAK;OAAM,SAAS;OAAO;OAAQ,CAAC;AACjF,WAAK,gBAAgB,KAAK,IAAI,0BAA0B;OAAE,MAAM,KAAK;OAAM,SAAS;OAAM,CAAC;;AAG7F,SAAI,KAAK,iBAAiB,SAAS;AACjC,WAAK,UAAU,WACb,KAAK,IAAI,yBAAyB;OAAE,MAAM,KAAK;OAAM,SAAS;OAAO;OAAQ,CAAC;AAChF,WAAK,gBAAgB,KAAK,IAAI,yBAAyB;OAAE,MAAM,KAAK;OAAM,SAAS;OAAM,CAAC;;AAG5F,WAAKA,MAAO,KAAK,WAAW,KAAK;AAEjC,SAAI,KAAK,cAAc;AACrB,YAAKA,MAAO,KAAK,WAAW,KAAK,gBAAgB,KAAK;AACtD,UAAI,KAAK,SACP,OAAKA,MAAO,KAAK,WAAW,KAAK,aAAa,GAAG,KAAK,YAAY,KAAK;;AAI3E;IAGF;AACE,UAAK,OAAO,MAAM,MAAM,KAAK,UAAU,KAAK,GAAG;AAC/C,WAAKA,MAAO,KAAK,KAAK,WAAW,KAAK;AACtC;;AAIJ;;;CAIJ,iBAAiB,SAAgC;AAC/C,SAAO,QACJ,KAAK,OAAO;AACX,WAAQ,GAAG,MAAX;IACE,KAAK,OACH,QAAO,GAAG;IACZ,KAAK,KACH,QAAO,OAAO,GAAG,GAAG;IACtB,KAAK,OACH,QAAO,SAAS,GAAG,GAAG;IACxB,KAAK,QACH,QAAO,UAAU,GAAG,KAAK,GAAG,GAAG,IAAI;IACrC,KAAK,OACH,QAAO,SAAS,GAAG,KAAK;IAC1B,KAAK;IACL,KAAK,OACH,QAAO,SAAS,GAAG,OAAO;IAC5B,KAAK;IACL,KAAK;IACL,KAAK,SACH,QAAO,IAAI,GAAG,KAAK,GAAG,GAAG,IAAI;IAC/B,QACE,QAAO,IAAI,GAAG,KAAK;;IAEvB,CACD,KAAK,GAAG;;;CAIb,MAAM,UAAU,UAAiD;AAC/D,MAAI;GACF,MAAM,YAAY,MAAM,KAAK,IAAkC,kBAAkB,EAAE,UAAU,CAAC;AAC9F,UAAO,MAAKF,WAAY,UAAU,UAAU,YAAY,UAAU;WAC3DM,KAAU;AACjB,QAAK,OAAO,KAAK,OAAO,SAAS,QAAQ,KAAK,WAAW,MAAM;AAC/D,UAAO;;;;CAKX,MAAM,WAAW,SAAiD;AAChE,MAAI;GACF,MAAM,aAAa,MAAM,KAAK,IAAmC,qBAAqB,EAAE,SAAS,CAAC;AAClG,UAAO,MAAKR,YAAa,SAAS,WAAW,UAAU,WAAW;WAC3DQ,KAAU;AACjB,QAAK,OAAO,KAAK,QAAQ,QAAQ,QAAQ,KAAK,WAAW,MAAM;AAE/D,UAAO;;;;;;CAOX,KAA+B,MAAS,SAAsD;EAC5F,MAAM,eAAe,UAAgC;AACnD,WAAQ,MAAM;AACd,SAAKJ,MAAO,IAAI,MAAM,YAAY;;AAGpC,OAAK,OAAO,MAAM,YAAY,OAAO,KAAK,GAAG;AAC7C,QAAKA,MAAO,GAAG,MAAM,YAAY;;;;;;;;;CAUnC,GAA6B,MAAS,SAAsD;AAC1F,OAAK,OAAO,MAAM,SAAS,OAAO,KAAK,GAAG;AAC1C,QAAKA,MAAO,GAAG,MAAM,QAAQ;;;;;CAM/B,IAA8B,MAAS,SAAsD;AAC3F,OAAK,OAAO,MAAM,SAAS,OAAO,KAAK,GAAG;AAC1C,QAAKA,MAAO,IAAI,MAAM,QAAQ;;;;;CAMhC,IAAmB,QAA6B,SAA8B,EAAE,EAAc;AAC5F,QAAKK,mBAAoB,MAAKlB,GAAI;AAClC,OAAK,OAAO,MAAM,UAAU,OAAO,MAAM,KAAK,UAAU,OAAO,GAAG;EAClE,MAAM,OAAO,MAAKmB,QAAS;AAC3B,QAAKnB,GAAI,KAAK,KAAK,UAAU;GAAE;GAAM;GAAQ;GAAQ,CAAC,CAAC;AACvD,SAAO,MAAKoB,cAAkB,KAAK;;;;;CAMrC,SAAS,SAAiB,QAAgB,GAAkB;AAC1D,SAAO,KAAK,IAAU,aAAa;GAAE;GAAS;GAAO,CAAC;;;;;CAMxD,MAAM,gBAA2D;AAE/D,UADgB,MAAM,KAAK,IAAc,kBAAkB,EAC5C,KAAK,MAAM,MAAKX,YAAa,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;;;;;CAMxE,MAAM,eAAyD;AAE7D,UADe,MAAM,KAAK,IAAa,iBAAiB,EAC1C,KAAK,MAAM,MAAKE,WAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;;;;CAMzE,YAAY,YAAoB,IAA2B;AACzD,SAAO,KAAK,IAAU,sBAAsB;GAAE;GAAY,UAAU;GAAI,KAAK;GAAM,CAAC;;;;;CAMtF,YAAY,YAAoB,IAA2B;AACzD,SAAO,KAAK,IAAU,sBAAsB;GAAE;GAAY,UAAU;GAAI,KAAK;GAAO,CAAC;;;;;CAMvF,MAAM,OAAO,YAA8F;AACzG,MAAI,CAAC,WACH,QAAO;EAGT,MAAM,MAAM,MAAM,KAAK,IAAS,WAAW,EAAE,YAAY,CAAC;AAE1D,MAAI,IAAI,iBAAiB,UACvB,QAAO,MAAKI,yBAA0B,IAAI;MAE1C,QAAO,MAAKC,uBAAwB,IAAI;;;;;CAO5C,aAAa,SAAiB,QAAiB,OAAO,OAAgB,OAAsB;AAC1F,SAAO,KAAK,IAAU,iBAAiB;GACrC;GACA,YAAY;GACZ,eAAe;GAChB,CAAC;;;;;CAMJ,YAAY,UAAkB,SAAiB,UAAiC;AAC9E,SAAO,KAAK,IAAU,iBAAiB;GAAE;GAAU;GAAS;GAAU,CAAC;;;;;CAMzE,UAAU,YAAmC;AAC3C,SAAO,KAAK,IAAU,cAAc,EAAE,YAAY,CAAC;;;;;CAMrD,gBAAgB,SAA+B;AAC7C,SAAO,KAAK,IAAS,qBAAqB,EAAE,SAAS,CAAC;;;;;CAMxD,eAAe,SAAiB,UAAkE;AAChG,SAAO,KAAK,IAA4B,oBAAoB;GAC1D;GACA,SAAS,KAAK,kBAAkB,SAAS;GAC1C,CAAC;;;;;CAMJ,aAAa,UAAkB,UAAkE;AAC/F,SAAO,KAAK,IAA4B,kBAAkB;GACxD;GACA,SAAS,KAAK,kBAAkB,SAAS;GAC1C,CAAC;;;;;CAMJ,aAAa,UAAgC;AAC3C,SAAO,KAAK,IAAS,kBAAkB,EAAE,UAAU,CAAC;;;;;CAMtD,aAAa,UAAgC;AAC3C,SAAO,KAAK,IAAU,kBAAkB,EAAE,UAAU,CAAC;;;;;CAMvD,cAAc,YAAmC;AAC/C,SAAO,KAAK,IAAU,mBAAmB,EAAE,YAAY,CAAC;;;;;CAM1D,iBAAiB,YAAmC;AAClD,SAAO,KAAK,IAAU,sBAAsB,EAAE,YAAY,CAAC;;;;;CAM7D,aAAa,UAAkB,SAAiB,MAA6B;AAC3E,SAAO,KAAK,IAAU,kBAAkB;GAAE;GAAU;GAAS;GAAM,CAAC;;;;;CAMtE,qBAAqB,UAAkB,SAAiB,OAA8B;AACpF,SAAO,KAAK,IAAU,2BAA2B;GAAE;GAAU;GAAS;GAAO,CAAC;;;;;CAMhF,mBAAmB,UAA8C;AAC/D,SAAO,KAAK,IAAuB,yBAAyB,EAAE,UAAU,CAAC;;;;;CAM3E,mBAAmB,UAAkB,SAA2C;AAC9E,SAAO,KAAK,IAAqB,yBAAyB;GAAE;GAAU;GAAS,CAAC;;;;;CAMlF,WAAoB;AAClB,SAAO,MAAKhB,IAAK,eAAe,UAAU,QAAQ,MAAKc;;;;;CAMzD,OAAO,OAAuB;EAC5B,IAAI,MAAM;AACV,OAAK,IAAI,IAAI,GAAG,MAAM,MAAM,QAAQ,IAAI,KAAK,EAAE,EAC7C,SAAQ,OAAO,KAAK,MAAM,WAAW,EAAE;AAEzC,SAAO,MAAM;;;;;CAMf,iBAAiB,QAA2D;AAC1E,SAAO,KAAK,IAAsC,eAAe,EAAE,QAAQ,CAAC;;;;;CAM9E,iBAA+F;AAC7F,SAAO,KAAK,IAAyE,mBAAmB;;;;;CAM1G,eAA+D;AAC7D,SAAO,KAAK,IAA2C,iBAAiB;;;;;CAM1E,MAAM,UAAU,QAQb;EACD,MAAM,QAAQ,MAAKO,YAAa,IAAI,OAAO;AAE3C,MAAI,MAAO,QAAO;EAElB,MAAM,EAAE,SAAS,cAAc,QAAQ,MAAM,KAAK,iBAAiB,OAAO;EAE1E,MAAM,OAAO,aAAa,MAAM,eAAe,GAAG,MAAM;EACxD,MAAM,QAAQ,aAAa,MAAM,gBAAgB,GAAG,MAAM;EAC1D,MAAM,MAAM,KAAK,OAAO,MAAM;EAE9B,MAAM,UAAU;GACd;GACA;GACA,KAAK,KAAK;GACV,KAAK,OAAO,IAAI;GAChB;GACA,QAAQ,OAAO,KAAK,IAAI,SAAS,KAAK,UAAU,KAAK,IAAI,WAAW,MAAM;GAC1E,cAAc,QAAQ,KAAK,IAAI,SAAS,KAAK,WAAW,KAAK,IAAI,WAAW,MAAM;GACnF;AAED,QAAKA,YAAa,IAAI,QAAQ,QAAQ;AAGtC,mBACQ;AACJ,SAAKA,YAAa,OAAO,OAAO;KAElC,MAAO,KAAK,GACb;AAED,SAAO;;;;;CAMT,MAAM,SAAS,QAAiC;EAC9C,MAAM,EAAE,UAAU,MAAM,KAAK,UAAU,OAAO;AAC9C,SAAO;;;;;CAMT,MAAM,SAA0B;EAC9B,MAAM,EAAE,QAAQ,MAAM,KAAK,UAAU,aAAa;AAClD,SAAO;;;CAIT,MAAM,MAAqB;EACzB,MAAM,EAAE,QAAQ,GAAG,OAAO,IAAI,GAAG,WAAW,MAAKtB;AAEjD,OAAK,OAAO,MAAM,QAAQ,KAAK,UAAU,OAAO,GAAG;AAEnD,SAAO,IAAI,SAAe,SAAS,WAAW;GAC5C,MAAM,KAAK,IAAI,UAAU,MAAKuB,YAAa,CAAC;AAE5C,MAAG,aAAa,UAAU;IACxB,MAAM,cAAc;AAClB,SAAI;AACF,aAAO,KAAK,MAAM,MAAM,KAAK;aACvB;AACN,aAAO;;QAEP;AAEJ,QAAI,CAAC,MAAM;AACT,UAAK,OAAO,MAAM,eAAe,MAAM,OAAO;AAC9C;;AAGF,UAAKT,MAAO,KAAK,cAAc,KAAK;AACpC,UAAKD,mBAAoB,KAAK;;AAGhC,MAAG,gBAAgB;AACjB,UAAKE,SAAU;AACf,SAAK,OAAO,MAAM,eAAe;AACjC,UAAKD,MAAO,KAAK,WAAW;;AAG9B,MAAG,WAAW,UAAU;AACtB,UAAKC,SAAU;AACf,SAAK,OAAO,MAAM,eAAe,QAAQ;AACzC,UAAKD,MAAO,KAAK,YAAY,MAAM;AACnC,WAAO,MAAM;;AAGf,MAAG,eAAe;AAChB,SAAK,OAAO,MAAM,aAAa;AAC/B,UAAKA,MAAO,KAAK,UAAU;AAC3B,aAAS;;AAGX,SAAKb,KAAM;AAEX,QAAK,OAAO,MAAM,mBAAmB;IACrC;;;CAIJ,QAAc;AACZ,MAAI,MAAKA,IAAK;AACZ,QAAK,OAAO,KAAK,wBAAwB;AACzC,SAAKA,GAAI,OAAO;AAChB,SAAKA,KAAM;AACX,QAAK,OAAO,KAAK,oBAAoB;QAErC,MAAK,OAAO,KAAK,qBAAqB;;;;;;;AAW5C,MAAMuB,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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1100,6 +1100,10 @@ declare class NapCat {
|
|
|
1100
1100
|
*/
|
|
1101
1101
|
api<T extends any>(action: API | (string & {}), params?: Record<string, any>): Promise<T>;
|
|
1102
1102
|
/**
|
|
1103
|
+
* 给好友名片点赞
|
|
1104
|
+
*/
|
|
1105
|
+
sendLike(user_id: number, times?: number): Promise<void>;
|
|
1106
|
+
/**
|
|
1103
1107
|
* 获取好友列表
|
|
1104
1108
|
*/
|
|
1105
1109
|
getFriendList(): Promise<(Friend & Record<string, any>)[]>;
|
package/dist/index.d.mts
CHANGED
|
@@ -1100,6 +1100,10 @@ declare class NapCat {
|
|
|
1100
1100
|
*/
|
|
1101
1101
|
api<T extends any>(action: API | (string & {}), params?: Record<string, any>): Promise<T>;
|
|
1102
1102
|
/**
|
|
1103
|
+
* 给好友名片点赞
|
|
1104
|
+
*/
|
|
1105
|
+
sendLike(user_id: number, times?: number): Promise<void>;
|
|
1106
|
+
/**
|
|
1103
1107
|
* 获取好友列表
|
|
1104
1108
|
*/
|
|
1105
1109
|
getFriendList(): Promise<(Friend & Record<string, any>)[]>;
|
package/dist/index.mjs
CHANGED
|
@@ -21,7 +21,7 @@ const CONSOLE_LOGGER = {
|
|
|
21
21
|
//#endregion
|
|
22
22
|
//#region package.json
|
|
23
23
|
var name$1 = "napcat-sdk";
|
|
24
|
-
var version$1 = "0.6.
|
|
24
|
+
var version$1 = "0.6.4";
|
|
25
25
|
|
|
26
26
|
//#endregion
|
|
27
27
|
//#region src/segment.ts
|
|
@@ -537,6 +537,15 @@ var NapCat = class {
|
|
|
537
537
|
return this.#waitForAction(echo);
|
|
538
538
|
}
|
|
539
539
|
/**
|
|
540
|
+
* 给好友名片点赞
|
|
541
|
+
*/
|
|
542
|
+
sendLike(user_id, times = 1) {
|
|
543
|
+
return this.api("send_like", {
|
|
544
|
+
user_id,
|
|
545
|
+
times
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
540
549
|
* 获取好友列表
|
|
541
550
|
*/
|
|
542
551
|
async getFriendList() {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","name: string","pkg.name","version: string","pkg.version","DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>>","options: NapcatOptions","#stat","#config","#ws","#uin","#nickname","#echoEvent","name","#nicknameCache","quote_id: string | null","#transformOneBotMessage","#buildFriend","#wrapReply","#buildGroup","#bindInternalEvents","#event","#online","#buildPrivateMessageEvent","#buildGroupMessageEvent","err: any","#ensureWsConnection","#echoId","#waitForAction","#cookieCache","#buildWsUrl","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nexport const noop = (): void => {}\n\nexport const ABSTRACT_LOGGER: Logger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n error: console.error.bind(console, '[ERROR]'),\n warn: console.warn.bind(console, '[WARN]'),\n info: console.info.bind(console, '[INFO]'),\n debug: console.debug.bind(console, '[DEBUG]'),\n trace: console.trace.bind(console, '[TRACE]'),\n}\n","{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.6.2\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMemberInfo,\n GroupMessageEvent,\n GroupWithInfo,\n NapcatOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n Stat,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = ''\n /** 机器人状态 */\n #online: boolean = false\n /** nickname 缓存 */\n #nicknameCache = new Map<number, string>()\n /** 消息数据 */\n #stat: Stat = {\n start_time: Date.now(),\n recv: { group: 0, private: 0 },\n send: { group: 0, private: 0 },\n }\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: NapcatOptions) {}\n\n /** 统计数据 */\n get stat(): Stat {\n return this.#stat\n }\n\n /** 配置项 */\n get #config(): Required<NapcatOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n *\n * @deprecated 建议使用 `uin` 属性\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n const { protocol, host, port, token } = this.#config\n return `${protocol}://${host}:${port}?access_token=${token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket 未打开。')\n throw new Error('WebSocket 未打开。')\n }\n }\n\n /** 标准化可发送消息元素 */\n normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API 错误:发送失败,请先添加对方为好友')\n } else {\n reject(`API 错误:${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n sign: this.setGroupSign.bind(this, group_id),\n setTitle: this.setGroupSpecialTitle.bind(this, group_id),\n setCard: this.setGroupCard.bind(this, group_id),\n setEssence: this.setEssenceMsg.bind(this),\n delEssence: this.deleteEssenceMsg.bind(this),\n getInfo: this.getGroupInfo.bind(this, group_id),\n getMemberList: this.getGroupMemberList.bind(this, group_id),\n getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),\n recall: this.recallMsg.bind(this),\n ban: this.setGroupBan.bind(this, group_id),\n sendMsg: this.sendGroupMsg.bind(this, group_id),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n const name = nickname || this.#nicknameCache.get(user_id) || ''\n this.#nicknameCache.set(user_id, name)\n\n return {\n ...extraInfo,\n user_id,\n nickname: name,\n napcat: this,\n delete: this.deleteFriend.bind(this, user_id),\n sendMsg: this.sendPrivateMsg.bind(this, user_id),\n getInfo: this.getStrangerInfo.bind(this, user_id),\n }\n }\n\n #transformOneBotMessage(message: any[]): RecvElement[] {\n return (message || []).filter((e) => e.type !== 'reply').map((el: any) => ({ type: el.type, ...el.data }))\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n const target = event.target_id\n ? { user_id: event.target_id, nickname: this.#nicknameCache.get(event.target_id) || '' }\n : { user_id: event.sender.user_id, nickname: event.sender.nickname }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<PrivateMessageEvent | null>,\n message: this.#transformOneBotMessage(event.message),\n friend: this.#buildFriend(target.user_id, target.nickname),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<GroupMessageEvent | null>,\n getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),\n message: this.#transformOneBotMessage(event.message),\n group: this.#buildGroup(event.group_id, event.group_name || ''),\n recall: this.recallMsg.bind(this, event.message_id),\n addReaction: this.addReaction.bind(this, event.message_id),\n delReaction: this.delReaction.bind(this, event.message_id),\n setEssence: this.setEssenceMsg.bind(this, event.message_id),\n delEssence: this.deleteEssenceMsg.bind(this, event.message_id),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`收到 meta_event:${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('收到 meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n timestamp: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n this.#stat.recv.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.recv.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n const msg = this.stringifyMessage(data.message)\n\n const group = data.group ? `${data.group_name}(${data.group_id})` : ''\n const sender = `${data.sender.nickname}(${data.sender.user_id})`\n\n switch (data.message_type) {\n case 'private': {\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n this.logger.trace(`收到私聊消息:${JSON.stringify(data)}`)\n this.logger.info(`[私:${sender}] ${msg}`)\n break\n }\n\n case 'group': {\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n this.logger.trace(`收到群消息:${JSON.stringify(data)}`)\n this.logger.info(`[群:${group}] ${sender}: ${msg}`)\n break\n }\n\n default: {\n this.logger.debug(`收到未知消息类型:${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n if (data.message_type === 'private') {\n this.#stat.send.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.send.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message_sent', data)\n this.logger.trace(`收到 message_sent:${JSON.stringify(data)}`)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n\n const msg = this.stringifyMessage(data.message)\n\n if (data.message_type === 'group' && data.group_id) {\n this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`)\n } else {\n this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`收到通知:${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`收到未知通知类型:${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`收到请求:${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`收到:${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`获取群 ${group_id} 信息失败:${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`获取好友 ${user_id} 信息失败:${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`注册一次性监听器:${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`注册监听器:${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`移除监听器:${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`调用 API:${action},参数:${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 获取好友列表\n */\n async getFriendList(): Promise<(Friend & Record<string, any>)[]> {\n const friends = await this.api<Friend[]>('get_friend_list')\n return friends.map((f) => this.#buildFriend(f.user_id, f.nickname, f))\n }\n\n /**\n * 获取群列表\n */\n async getGroupList(): Promise<(Group & Record<string, any>)[]> {\n const groups = await this.api<Group[]>('get_group_list')\n return groups.map((g) => this.#buildGroup(g.group_id, g.group_name, g))\n }\n\n /**\n * 添加消息回应\n */\n addReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: true })\n }\n\n /**\n * 删除消息回应\n */\n delReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: false })\n }\n\n /**\n * 获取消息\n */\n async getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null> {\n if (!message_id) {\n return null\n }\n\n const msg = await this.api<any>('get_msg', { message_id })\n\n if (msg.message_type === 'private') {\n return this.#buildPrivateMessageEvent(msg)\n } else {\n return this.#buildGroupMessageEvent(msg)\n }\n }\n\n /**\n * 删除好友\n */\n deleteFriend(user_id: number, block: boolean = false, both: boolean = false): Promise<void> {\n return this.api<void>('delete_friend', {\n user_id,\n temp_block: block,\n temp_both_del: both,\n })\n }\n\n /**\n * 设置群成员禁言\n */\n setGroupBan(group_id: number, user_id: number, duration: number): Promise<void> {\n return this.api<void>('set_group_ban', { group_id, user_id, duration })\n }\n\n /**\n * 撤回消息\n */\n recallMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_msg', { message_id })\n }\n\n /**\n * 获取陌生人信息\n */\n getStrangerInfo(user_id: number): Promise<any> {\n return this.api<any>('get_stranger_info', { user_id })\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 获取群信息\n */\n getGroupInfo(group_id: number): Promise<any> {\n return this.api<any>('get_group_info', { group_id })\n }\n\n /**\n * 群签到\n */\n setGroupSign(group_id: number): Promise<any> {\n return this.api<void>('set_group_sign', { group_id })\n }\n\n /**\n * 设置群精华消息\n */\n setEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('set_essence_msg', { message_id })\n }\n\n /**\n * 删除群精华消息\n */\n deleteEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_essence_msg', { message_id })\n }\n\n /**\n * 设置群成员名片\n */\n setGroupCard(group_id: number, user_id: number, card: string): Promise<void> {\n return this.api<void>('set_group_card', { group_id, user_id, card })\n }\n\n /**\n * 设置群成员专属头衔\n */\n setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void> {\n return this.api<void>('set_group_special_title', { group_id, user_id, title })\n }\n\n /**\n * 获取群成员列表\n */\n getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]> {\n return this.api<GroupMemberInfo[]>('get_group_member_list', { group_id })\n }\n\n /**\n * 获取群成员信息\n */\n getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo> {\n return this.api<GroupMemberInfo>('get_group_member_info', { group_id, user_id })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除 Cookie 缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`启动配置:${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`收到非 JSON 消息:${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat 已断开连接')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat 发生错误:${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat 已连接')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket 实例已创建。`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('正在销毁 NapCat SDK 实例...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK 实例已销毁。')\n } else {\n this.logger.warn('NapCat SDK 实例未初始化。')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","name: string","pkg.name","version: string","pkg.version","DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>>","options: NapcatOptions","#stat","#config","#ws","#uin","#nickname","#echoEvent","name","#nicknameCache","quote_id: string | null","#transformOneBotMessage","#buildFriend","#wrapReply","#buildGroup","#bindInternalEvents","#event","#online","#buildPrivateMessageEvent","#buildGroupMessageEvent","err: any","#ensureWsConnection","#echoId","#waitForAction","#cookieCache","#buildWsUrl","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nexport const noop = (): void => {}\n\nexport const ABSTRACT_LOGGER: Logger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n error: console.error.bind(console, '[ERROR]'),\n warn: console.warn.bind(console, '[WARN]'),\n info: console.info.bind(console, '[INFO]'),\n debug: console.debug.bind(console, '[DEBUG]'),\n trace: console.trace.bind(console, '[TRACE]'),\n}\n","{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.6.4\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMemberInfo,\n GroupMessageEvent,\n GroupWithInfo,\n NapcatOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n Stat,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = ''\n /** 机器人状态 */\n #online: boolean = false\n /** nickname 缓存 */\n #nicknameCache = new Map<number, string>()\n /** 消息数据 */\n #stat: Stat = {\n start_time: Date.now(),\n recv: { group: 0, private: 0 },\n send: { group: 0, private: 0 },\n }\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: NapcatOptions) {}\n\n /** 统计数据 */\n get stat(): Stat {\n return this.#stat\n }\n\n /** 配置项 */\n get #config(): Required<NapcatOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n *\n * @deprecated 建议使用 `uin` 属性\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n const { protocol, host, port, token } = this.#config\n return `${protocol}://${host}:${port}?access_token=${token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket 未连接。')\n throw new Error('WebSocket 未连接。')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket 未打开。')\n throw new Error('WebSocket 未打开。')\n }\n }\n\n /** 标准化可发送消息元素 */\n normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API 错误:发送失败,请先添加对方为好友')\n } else {\n reject(`API 错误:${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n sign: this.setGroupSign.bind(this, group_id),\n setTitle: this.setGroupSpecialTitle.bind(this, group_id),\n setCard: this.setGroupCard.bind(this, group_id),\n setEssence: this.setEssenceMsg.bind(this),\n delEssence: this.deleteEssenceMsg.bind(this),\n getInfo: this.getGroupInfo.bind(this, group_id),\n getMemberList: this.getGroupMemberList.bind(this, group_id),\n getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),\n recall: this.recallMsg.bind(this),\n ban: this.setGroupBan.bind(this, group_id),\n sendMsg: this.sendGroupMsg.bind(this, group_id),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n const name = nickname || this.#nicknameCache.get(user_id) || ''\n this.#nicknameCache.set(user_id, name)\n\n return {\n ...extraInfo,\n user_id,\n nickname: name,\n napcat: this,\n delete: this.deleteFriend.bind(this, user_id),\n sendMsg: this.sendPrivateMsg.bind(this, user_id),\n getInfo: this.getStrangerInfo.bind(this, user_id),\n }\n }\n\n #transformOneBotMessage(message: any[]): RecvElement[] {\n return (message || []).filter((e) => e.type !== 'reply').map((el: any) => ({ type: el.type, ...el.data }))\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n const target = event.target_id\n ? { user_id: event.target_id, nickname: this.#nicknameCache.get(event.target_id) || '' }\n : { user_id: event.sender.user_id, nickname: event.sender.nickname }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<PrivateMessageEvent | null>,\n message: this.#transformOneBotMessage(event.message),\n friend: this.#buildFriend(target.user_id, target.nickname),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<GroupMessageEvent | null>,\n getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),\n message: this.#transformOneBotMessage(event.message),\n group: this.#buildGroup(event.group_id, event.group_name || ''),\n recall: this.recallMsg.bind(this, event.message_id),\n addReaction: this.addReaction.bind(this, event.message_id),\n delReaction: this.delReaction.bind(this, event.message_id),\n setEssence: this.setEssenceMsg.bind(this, event.message_id),\n delEssence: this.deleteEssenceMsg.bind(this, event.message_id),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`收到 meta_event:${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('收到 meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n timestamp: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n this.#stat.recv.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.recv.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n const msg = this.stringifyMessage(data.message)\n\n const group = data.group ? `${data.group_name}(${data.group_id})` : ''\n const sender = `${data.sender.nickname}(${data.sender.user_id})`\n\n switch (data.message_type) {\n case 'private': {\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n this.logger.trace(`收到私聊消息:${JSON.stringify(data)}`)\n this.logger.info(`[私:${sender}] ${msg}`)\n break\n }\n\n case 'group': {\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n this.logger.trace(`收到群消息:${JSON.stringify(data)}`)\n this.logger.info(`[群:${group}] ${sender}: ${msg}`)\n break\n }\n\n default: {\n this.logger.debug(`收到未知消息类型:${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n if (data.message_type === 'private') {\n this.#stat.send.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.send.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message_sent', data)\n this.logger.trace(`收到 message_sent:${JSON.stringify(data)}`)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n\n const msg = this.stringifyMessage(data.message)\n\n if (data.message_type === 'group' && data.group_id) {\n this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`)\n } else {\n this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`收到通知:${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`收到未知通知类型:${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`收到请求:${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`收到:${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`获取群 ${group_id} 信息失败:${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`获取好友 ${user_id} 信息失败:${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`注册一次性监听器:${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`注册监听器:${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`移除监听器:${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`调用 API:${action},参数:${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 给好友名片点赞\n */\n sendLike(user_id: number, times: number = 1): Promise<void> {\n return this.api<void>('send_like', { user_id, times })\n }\n\n /**\n * 获取好友列表\n */\n async getFriendList(): Promise<(Friend & Record<string, any>)[]> {\n const friends = await this.api<Friend[]>('get_friend_list')\n return friends.map((f) => this.#buildFriend(f.user_id, f.nickname, f))\n }\n\n /**\n * 获取群列表\n */\n async getGroupList(): Promise<(Group & Record<string, any>)[]> {\n const groups = await this.api<Group[]>('get_group_list')\n return groups.map((g) => this.#buildGroup(g.group_id, g.group_name, g))\n }\n\n /**\n * 添加消息回应\n */\n addReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: true })\n }\n\n /**\n * 删除消息回应\n */\n delReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: false })\n }\n\n /**\n * 获取消息\n */\n async getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null> {\n if (!message_id) {\n return null\n }\n\n const msg = await this.api<any>('get_msg', { message_id })\n\n if (msg.message_type === 'private') {\n return this.#buildPrivateMessageEvent(msg)\n } else {\n return this.#buildGroupMessageEvent(msg)\n }\n }\n\n /**\n * 删除好友\n */\n deleteFriend(user_id: number, block: boolean = false, both: boolean = false): Promise<void> {\n return this.api<void>('delete_friend', {\n user_id,\n temp_block: block,\n temp_both_del: both,\n })\n }\n\n /**\n * 设置群成员禁言\n */\n setGroupBan(group_id: number, user_id: number, duration: number): Promise<void> {\n return this.api<void>('set_group_ban', { group_id, user_id, duration })\n }\n\n /**\n * 撤回消息\n */\n recallMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_msg', { message_id })\n }\n\n /**\n * 获取陌生人信息\n */\n getStrangerInfo(user_id: number): Promise<any> {\n return this.api<any>('get_stranger_info', { user_id })\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 获取群信息\n */\n getGroupInfo(group_id: number): Promise<any> {\n return this.api<any>('get_group_info', { group_id })\n }\n\n /**\n * 群签到\n */\n setGroupSign(group_id: number): Promise<any> {\n return this.api<void>('set_group_sign', { group_id })\n }\n\n /**\n * 设置群精华消息\n */\n setEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('set_essence_msg', { message_id })\n }\n\n /**\n * 删除群精华消息\n */\n deleteEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_essence_msg', { message_id })\n }\n\n /**\n * 设置群成员名片\n */\n setGroupCard(group_id: number, user_id: number, card: string): Promise<void> {\n return this.api<void>('set_group_card', { group_id, user_id, card })\n }\n\n /**\n * 设置群成员专属头衔\n */\n setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void> {\n return this.api<void>('set_group_special_title', { group_id, user_id, title })\n }\n\n /**\n * 获取群成员列表\n */\n getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]> {\n return this.api<GroupMemberInfo[]>('get_group_member_list', { group_id })\n }\n\n /**\n * 获取群成员信息\n */\n getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo> {\n return this.api<GroupMemberInfo>('get_group_member_info', { group_id, user_id })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除 Cookie 缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`启动配置:${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`收到非 JSON 消息:${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat 已断开连接')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat 发生错误:${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat 已连接')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket 实例已创建。`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('正在销毁 NapCat SDK 实例...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK 实例已销毁。')\n } else {\n this.logger.warn('NapCat SDK 实例未初始化。')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":"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"}
|