napcat-sdk 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","name: string","pkg.name","version: string","pkg.version","DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<MiokiOptions>>","options: MiokiOptions","#config","#ws","#uin","#nickname","crypto","#echoEvent","quote_id: string | null","event","#buildPrivateMessageEvent","#buildFriend","#wrapReply","#buildGroupMessageEvent","#buildGroup","#bindInternalEvents","#event","#online","err: any","#ensureWsConnection","#echoId","#waitForAction","#normalizeSendable","#cookieCache","#buildWsUrl","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nexport const noop = (): void => {}\n\nexport const ABSTRACT_LOGGER: Logger = {\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n error: console.error.bind(console, '[ERROR]'),\n warn: console.warn.bind(console, '[WARN]'),\n info: console.info.bind(console, '[INFO]'),\n debug: console.debug.bind(console, '[DEBUG]'),\n trace: console.trace.bind(console, '[TRACE]'),\n}\n","{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.5.1\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMessageEvent,\n GroupWithInfo,\n MiokiOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<MiokiOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = '-'\n /** 机器人状态 */\n #online: boolean = false\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: MiokiOptions) {}\n\n /** 配置项 */\n get #config(): Required<MiokiOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket is not connected.')\n throw new Error('WebSocket is not connected.')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n return `${this.#config.protocol}://${this.#config.host}:${this.#config.port}?access_token=${this.#config.token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket is not connected.')\n throw new Error('WebSocket is not connected.')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket is not open.')\n throw new Error('WebSocket is not open.')\n }\n }\n\n /** 标准化可发送消息元素 */\n #normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API Error: 发送失败,请先添加对方为好友')\n } else {\n reject(`API Error: ${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n doSign: () => this.api('set_group_sign', { group_id }),\n getInfo: () => this.api('get_group_info', { group_id }),\n getMemberList: async () => this.api('get_group_member_list', { group_id }),\n getMemberInfo: (user_id: number) => this.api('get_group_member_info', { group_id, user_id }),\n setTitle: (title: string) => this.api('set_group_special_title', { group_id, title }),\n setCard: (user_id: number, card: string) => this.api('set_group_card', { group_id, user_id, card }),\n addEssence: (message_id: string) => this.api('set_essence_msg', { message_id }),\n delEssence: (message_id: string) => this.api('delete_essence_msg', { message_id }),\n recall: (message_id: number) => this.api('delete_msg', { message_id }),\n banMember: (user_id: number, duration: number) => this.api('set_group_ban', { group_id, user_id, duration }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendGroupMsg(group_id, sendable),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n return {\n ...extraInfo,\n user_id,\n nickname,\n napcat: this,\n delete: (block?: boolean, both?: boolean) =>\n this.api('delete_friend', { user_id, temp_block: block, temp_both_del: both }),\n sendMsg: (sendable: Sendable | Sendable[]) => this.sendPrivateMsg(user_id, sendable),\n getInfo: () => this.api('get_stranger_info', { user_id }),\n }\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<PrivateMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<PrivateMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildPrivateMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n friend: this.#buildFriend(event.user_id, event.sender?.nickname || ''),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(event.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: async (): Promise<GroupMessageEvent | null> => {\n if (!quote_id) return null\n const event = await this.api<GroupMessageEvent>('get_msg', { message_id: quote_id })\n return this.#buildGroupMessageEvent(event)\n },\n message: (event.message || [])\n .filter((e) => e.type !== 'reply')\n .map((el: any) => ({ type: el.type, ...el.data })),\n group: this.#buildGroup(event.group_id, event.group?.group_name || ''),\n recall: () => this.api<any>('delete_msg', { message_id: event.message_id }),\n addReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: true }),\n delReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: false }),\n addEssence: () => this.api('set_essence_msg', { message_id: event.message_id }),\n delEssence: () => this.api('delete_essence_msg', { message_id: event.message_id }),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`received meta_event: ${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('recv meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n ts: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n data = this.#buildPrivateMessageEvent(data)\n } else {\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n switch (data.message_type) {\n case 'private': {\n this.logger.trace(`received private message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[P] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(data.message)}`,\n )\n\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n\n break\n }\n\n case 'group': {\n this.logger.trace(`received group message: ${JSON.stringify(data)}`)\n\n this.logger.info(\n `[G:${data.group_name}:${data.group_id}] ${data.sender.nickname}(${data.sender.user_id}): ${this.stringifyMessage(\n data.message,\n )}`,\n )\n\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n\n break\n }\n\n default: {\n this.logger.debug(`received unknown message type: ${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n this.logger.trace(`received message_sent: ${JSON.stringify(data)}`)\n this.#event.emit('message_sent', data)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`received notice: ${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`received unknown notice type: ${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`received request: ${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`received: ${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`Error to pickGroup ${group_id}: ${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`Error to pickFriend ${user_id}: ${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`registering once: ${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`registering: ${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`unregistering: ${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`calling api action: ${action} with params: ${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.#normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.#normalizeSendable(sendable),\n })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`run with config: ${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`received non-json message: ${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat disconnected')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat error: ${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat connected')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket instance created.`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('destroying NapCat SDK instance...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK instance destroyed.')\n } else {\n this.logger.warn('NapCat SDK instance is not initialized.')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":"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"}
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.0\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n node: (options: Partial<ExtractByType<SendElement, 'node'>>): SendElement => createSegment('node', { ...options }),\n /** 创建一个合并转发消息片段 */\n forward: (id: string): SendElement => createSegment('forward', { id }),\n /** 创建一个 JSON 消息片段 */\n json: (data: string): SendElement => createSegment('json', { data }),\n /** 创建一个文件消息片段 */\n file: (file: string, options?: Omit<ExtractByType<SendElement, 'file'>, 'type' | 'file'>): SendElement =>\n createSegment('file', { file, ...options }),\n /** 创建一个 Markdown 消息片段 */\n markdown: (): SendElement => createSegment('markdown', {}),\n /** 创建一个轻应用消息片段 */\n lightapp: (): SendElement => createSegment('lightapp', {}),\n}\n","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { ABSTRACT_LOGGER } from './logger'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type {\n API,\n EventMap,\n Friend,\n FriendWithInfo,\n Group,\n GroupMemberInfo,\n GroupMessageEvent,\n GroupWithInfo,\n NapcatOptions,\n NormalizedElementToSend,\n OptionalProps,\n PrivateMessageEvent,\n RecvElement,\n Sendable,\n Stat,\n} from './types'\n\nexport const name: string = pkg.name\nexport const version: string = pkg.version\n\nconst DEFAULT_NAPCAT_OPTIONS: Required<OptionalProps<NapcatOptions>> = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n}\n\nexport class NapCat {\n /** WebSocket 实例 */\n #ws: WebSocket | null = null\n /** 事件发射器 */\n #event: Emitter<EventMap & Record<string | symbol, unknown>> = mitt()\n /** Echo 事件发射器 */\n #echoEvent: Emitter<Record<string, unknown>> = mitt()\n /** 机器人 ID */\n #uin: number = 0\n /** 机器人昵称 */\n #nickname: string = ''\n /** 机器人状态 */\n #online: boolean = false\n /** nickname 缓存 */\n #nicknameCache = new Map<number, string>()\n /** 消息数据 */\n #stat: Stat = {\n start_time: Date.now(),\n recv: { group: 0, private: 0 },\n send: { group: 0, private: 0 },\n }\n /** Cookies 缓存 */\n #cookieCache = new Map<\n string,\n {\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }\n >()\n\n constructor(private readonly options: NapcatOptions) {}\n\n /** 统计数据 */\n get stat(): Stat {\n return this.#stat\n }\n\n /** 配置项 */\n get #config(): Required<NapcatOptions> {\n return {\n protocol: this.options.protocol || DEFAULT_NAPCAT_OPTIONS.protocol,\n host: this.options.host || DEFAULT_NAPCAT_OPTIONS.host,\n port: this.options.port || DEFAULT_NAPCAT_OPTIONS.port,\n logger: this.options.logger || DEFAULT_NAPCAT_OPTIONS.logger,\n token: this.options.token,\n }\n }\n\n /** WebSocket 实例 */\n get ws(): WebSocket {\n if (!this.#ws) {\n this.logger.error('WebSocket is not connected.')\n throw new Error('WebSocket is not connected.')\n }\n\n return this.#ws\n }\n\n /** 日志记录器 */\n get logger(): Logger {\n return this.#config.logger\n }\n\n /** 消息段构建器 */\n get segment(): typeof segment {\n return segment\n }\n\n /**\n * 机器人 QQ 号\n *\n * @deprecated 建议使用 `uin` 属性\n */\n get user_id(): number {\n return this.uin\n }\n\n /**\n * 机器人 QQ 号\n */\n get uin(): number {\n return this.#uin\n }\n\n /**\n * 机器人昵称\n */\n get nickname(): string {\n return this.#nickname\n }\n\n /** 生成唯一的 echo ID */\n #echoId() {\n return crypto.randomBytes(16).toString('hex')\n }\n\n /** 构建 WebSocket 连接地址 */\n #buildWsUrl(): string {\n const { protocol, host, port, token } = this.#config\n return `${protocol}://${host}:${port}?access_token=${token}`\n }\n\n /** 包装回复消息 */\n #wrapReply(sendable: Sendable | Sendable[], message_id?: number, reply?: boolean): Sendable[] {\n const sendableList = typeof sendable === 'string' ? [sendable] : [sendable].flat()\n\n if (reply && message_id) {\n return [segment.reply(String(message_id)), ...sendableList]\n }\n\n return sendableList\n }\n\n /** 确保 WebSocket 已连接 */\n #ensureWsConnection(ws: WebSocket | null): asserts ws is WebSocket {\n if (!ws) {\n this.logger.error('WebSocket is not connected.')\n throw new Error('WebSocket is not connected.')\n }\n\n if (ws.readyState !== WebSocket.OPEN) {\n this.logger.error('WebSocket is not open.')\n throw new Error('WebSocket is not open.')\n }\n }\n\n /** 标准化可发送消息元素 */\n normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[] {\n return [msg].flat(2).map((item) => {\n if (typeof item === 'string') {\n return { type: 'text', data: { text: item } }\n }\n if (item.type === 'at') {\n return { type: 'at', data: { qq: String(item.qq) } }\n }\n const { type, ...data } = item\n return { type, data } as NormalizedElementToSend\n })\n }\n\n /** 等待服务器响应操作 */\n #waitForAction<T extends any>(echoId: string) {\n const eventName = `echo#${echoId}`\n\n return new Promise<T>((resolve, reject) => {\n const handle = (data: any) => {\n if (!data || data.echo !== echoId) return\n\n this.#echoEvent.off(eventName, handle)\n\n if (data.retcode === 0) {\n resolve(data.data as T)\n } else if (data.retcode === 1200) {\n reject('API Error: 发送失败,请先添加对方为好友')\n } else {\n reject(`API Error: ${data.message}`)\n }\n }\n\n this.#echoEvent.on(eventName, handle)\n })\n }\n\n /** 构建群对象 */\n #buildGroup<T extends object>(group_id: number, group_name: string = '', extraInfo: T = {} as T): Group & T {\n return {\n ...extraInfo,\n group_id,\n group_name,\n napcat: this,\n sign: this.setGroupSign.bind(this, group_id),\n setTitle: this.setGroupSpecialTitle.bind(this, group_id),\n setCard: this.setGroupCard.bind(this, group_id),\n setEssence: this.setEssenceMsg.bind(this),\n delEssence: this.deleteEssenceMsg.bind(this),\n getInfo: this.getGroupInfo.bind(this, group_id),\n getMemberList: this.getGroupMemberList.bind(this, group_id),\n getMemberInfo: this.getGroupMemberInfo.bind(this, group_id),\n recall: this.recallMsg.bind(this),\n ban: this.setGroupBan.bind(this, group_id),\n sendMsg: this.sendGroupMsg.bind(this, group_id),\n }\n }\n\n /** 构建好友对象 */\n #buildFriend<T extends object>(user_id: number, nickname: string = '', extraInfo: T = {} as T): Friend & T {\n const name = nickname || this.#nicknameCache.get(user_id) || ''\n this.#nicknameCache.set(user_id, name)\n\n return {\n ...extraInfo,\n user_id,\n nickname: name,\n napcat: this,\n delete: this.deleteFriend.bind(this, user_id),\n sendMsg: this.sendPrivateMsg.bind(this, user_id),\n getInfo: this.getStrangerInfo.bind(this, user_id),\n }\n }\n\n #transformOneBotMessage(message: any[]): RecvElement[] {\n return (message || []).filter((e) => e.type !== 'reply').map((el: any) => ({ type: el.type, ...el.data }))\n }\n\n /** 构建私聊消息事件 */\n #buildPrivateMessageEvent(event: Omit<PrivateMessageEvent, 'message'> & { message: any[] }): PrivateMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n const target = event.target_id\n ? { user_id: event.target_id, nickname: this.#nicknameCache.get(event.target_id) || '' }\n : { user_id: event.sender.user_id, nickname: event.sender.nickname }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<PrivateMessageEvent | null>,\n message: this.#transformOneBotMessage(event.message),\n friend: this.#buildFriend(target.user_id, target.nickname),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendPrivateMsg(target.user_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 构建群消息事件对象 */\n #buildGroupMessageEvent(event: Omit<GroupMessageEvent, 'message'> & { message: any[] }): GroupMessageEvent {\n const quote_id: string | null = event.message.find((el: any) => el.type === 'reply')?.data?.id || null\n\n if (event.sender.nickname) {\n this.#nicknameCache.set(event.sender.user_id, event.sender.nickname)\n }\n\n return {\n ...event,\n quote_id,\n getQuoteMessage: () => this.getMsg(quote_id) as Promise<GroupMessageEvent | null>,\n getSenderMemberInfo: this.getGroupMemberInfo.bind(this, event.group_id, event.sender.user_id),\n message: this.#transformOneBotMessage(event.message),\n group: this.#buildGroup(event.group_id, event.group_name || ''),\n recall: this.recallMsg.bind(this, event.message_id),\n addReaction: this.addReaction.bind(this, event.message_id),\n delReaction: this.delReaction.bind(this, event.message_id),\n setEssence: this.setEssenceMsg.bind(this, event.message_id),\n delEssence: this.deleteEssenceMsg.bind(this, event.message_id),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n async #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`received meta_event: ${JSON.stringify(data)}`)\n\n this.#event.emit('meta_event', data)\n\n if (data.meta_event_type) {\n this.#event.emit(`meta_event.${data.meta_event_type}`, data)\n\n this.logger.debug('recv meta_event_type:', data.meta_event_type)\n\n if (data.sub_type) {\n if (data.sub_type === 'connect') {\n const { app_name, app_version, protocol_version } = await this.getVersionInfo()\n const { nickname, user_id } = await this.getLoginInfo()\n\n this.#online = true\n this.#uin = user_id\n this.#nickname = nickname\n\n this.#event.emit('napcat.connected', {\n user_id: this.#uin,\n nickname: this.#nickname,\n app_name,\n app_version,\n protocol_version,\n timestamp: data.time * 1000,\n })\n }\n\n this.#event.emit(`meta_event.${data.meta_event_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'message': {\n if (data.message_type === 'private') {\n this.#stat.recv.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.recv.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message', data)\n\n const msg = this.stringifyMessage(data.message)\n\n const group = data.group ? `${data.group_name}(${data.group_id})` : ''\n const sender = `${data.sender.nickname}(${data.sender.user_id})`\n\n switch (data.message_type) {\n case 'private': {\n this.#event.emit('message.private', data)\n this.#event.emit(`message.private.${data.sub_type}`, data)\n this.logger.trace(`received private message: ${JSON.stringify(data)}`)\n this.logger.info(`[私:${sender}] ${msg}`)\n break\n }\n\n case 'group': {\n this.#event.emit('message.group', data)\n this.#event.emit(`message.group.${data.sub_type}`, data)\n this.logger.trace(`received group message: ${JSON.stringify(data)}`)\n this.logger.info(`[群:${group}] ${sender}: ${msg}`)\n break\n }\n\n default: {\n this.logger.debug(`received unknown message type: ${JSON.stringify(data)}`)\n\n break\n }\n }\n\n break\n }\n\n case 'message_sent': {\n if (data.message_type === 'private') {\n this.#stat.send.private++\n data = this.#buildPrivateMessageEvent(data)\n } else {\n this.#stat.send.group++\n data = this.#buildGroupMessageEvent(data)\n }\n\n this.#event.emit('message_sent', data)\n this.logger.trace(`received message_sent: ${JSON.stringify(data)}`)\n\n if (data.message_type) {\n this.#event.emit(`message_sent.${data.message_type}`, data)\n\n if (data.sub_type) {\n this.#event.emit(`message_sent.${data.message_type}.${data.sub_type}`, data)\n }\n\n const msg = this.stringifyMessage(data.message)\n\n if (data.message_type === 'group' && data.group_id) {\n this.logger.info(`[>>>:群:${data.group_name}(${data.group_id})] ${msg}`)\n } else {\n this.logger.info(`[>>>:私:${data.friend.nickname}(${data.friend.user_id})] ${msg}`)\n }\n }\n\n break\n }\n\n case 'notice': {\n this.logger.trace(`received notice: ${JSON.stringify(data)}`)\n\n if (!data.notice_type) {\n this.logger.debug(`received unknown notice type: ${JSON.stringify(data)}`)\n break\n }\n\n const isNotify = data.notice_type === 'notify'\n const isPoke = data.sub_type === 'poke'\n const isGroup = !!data.group_id\n\n const { notice_type, sub_type } = isNotify\n ? isPoke\n ? { notice_type: isGroup ? 'group' : 'friend', sub_type: 'poke' }\n : NAPCAT_NOTICE_NOTIFY_MAP[data.sub_type] || {}\n : NAPCAT_NOTICE_EVENT_MAP[data.notice_type] || {}\n\n data.original_notice_type = data.notice_type\n data.notice_type = notice_type || data.notice_type\n\n if (data.sub_type && data.sub_type !== sub_type) {\n data.action_type = data.sub_type\n }\n\n data.sub_type = sub_type || data.sub_type\n\n if (isGroup) {\n data.group = this.#buildGroup(data.group_id, data.group_name || '')\n } else {\n data.friend = this.#buildFriend(data.user_id, data.nickname || '')\n }\n\n this.#event.emit('notice', data)\n\n if (notice_type) {\n this.#event.emit(`notice.${notice_type}`, data)\n if (sub_type) {\n this.#event.emit(`notice.${notice_type}.${sub_type}`, data)\n }\n }\n\n break\n }\n\n case 'request': {\n this.logger.trace(`received request: ${JSON.stringify(data)}`)\n\n if (data.request_type === 'friend') {\n data.reject = (reason?: string) =>\n this.api('set_friend_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_friend_add_request', { flag: data.flag, approve: true })\n }\n\n if (data.request_type === 'group') {\n data.reject = (reason?: string) =>\n this.api('set_group_add_request', { flag: data.flag, approve: false, reason })\n data.approve = () => this.api('set_group_add_request', { flag: data.flag, approve: true })\n }\n\n this.#event.emit('request', data)\n\n if (data.request_type) {\n this.#event.emit(`request.${data.request_type}`, data)\n if (data.sub_type) {\n this.#event.emit(`request.${data.request_type}.${data.sub_type}`, data)\n }\n }\n\n break\n }\n\n default: {\n this.logger.debug(`received: ${JSON.stringify(data)}`)\n this.#event.emit(data.post_type, data)\n return\n }\n }\n\n return\n }\n }\n\n stringifyMessage(message: RecvElement[]): string {\n return message\n .map((el) => {\n switch (el.type) {\n case 'text':\n return el.text\n case 'at':\n return `{at:${el.qq}}`\n case 'face':\n return `{face:${el.id}}`\n case 'image':\n return `{image:${el.file},${el.url}}`\n case 'json':\n return `{json:${el.data}}`\n case 'rps':\n case 'dice':\n return `{dice:${el.result}}`\n case 'file':\n case 'video':\n case 'record':\n return `{${el.type}:${el.url}}`\n default:\n return `{${el.type}}`\n }\n })\n .join('')\n }\n\n /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo | null> {\n try {\n const groupInfo = await this.api<ReturnType<Group['getInfo']>>('get_group_info', { group_id })\n return this.#buildGroup(group_id, groupInfo.group_name, groupInfo)\n } catch (err: any) {\n this.logger.warn(`Error to pickGroup ${group_id}: ${err?.message || err}`)\n return null\n }\n }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo | null> {\n try {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n } catch (err: any) {\n this.logger.warn(`Error to pickFriend ${user_id}: ${err?.message || err}`)\n // return this.#buildFriend(user_id, '', {}) as FriendWithInfo\n return null\n }\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n const onceHandler = (event: EventMap[NoInfer<T>]) => {\n handler(event)\n this.#event.off(type, onceHandler)\n }\n\n this.logger.debug(`registering once: ${String(type)}`)\n this.#event.on(type, onceHandler)\n }\n\n /**\n * 注册事件监听器,支持主类型或者点分子类型\n *\n * 如: `notice`、`message.private`、`request.group.invite` 等\n *\n * 如果需要移除监听器,请调用 `off` 方法\n */\n on<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`registering: ${String(type)}`)\n this.#event.on(type, handler)\n }\n\n /**\n * 移除事件监听器\n */\n off<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => void): void {\n this.logger.debug(`unregistering: ${String(type)}`)\n this.#event.off(type, handler)\n }\n\n /**\n * 调用 NapCat API\n */\n api<T extends any>(action: API | (string & {}), params: Record<string, any> = {}): Promise<T> {\n this.#ensureWsConnection(this.#ws)\n this.logger.debug(`calling api action: ${action} with params: ${JSON.stringify(params)}`)\n const echo = this.#echoId()\n this.#ws.send(JSON.stringify({ echo, action, params }))\n return this.#waitForAction<T>(echo)\n }\n\n /**\n * 获取好友列表\n */\n async getFriendList(): Promise<(Friend & Record<string, any>)[]> {\n const friends = await this.api<Friend[]>('get_friend_list')\n return friends.map((f) => this.#buildFriend(f.user_id, f.nickname, f))\n }\n\n /**\n * 获取群列表\n */\n async getGroupList(): Promise<(Group & Record<string, any>)[]> {\n const groups = await this.api<Group[]>('get_group_list')\n return groups.map((g) => this.#buildGroup(g.group_id, g.group_name, g))\n }\n\n /**\n * 添加消息回应\n */\n addReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: true })\n }\n\n /**\n * 删除消息回应\n */\n delReaction(message_id: number, id: string): Promise<void> {\n return this.api<void>('set_msg_emoji_like', { message_id, emoji_id: id, set: false })\n }\n\n /**\n * 获取消息\n */\n async getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null> {\n if (!message_id) {\n return null\n }\n\n const msg = await this.api<any>('get_msg', { message_id })\n\n if (msg.message_type === 'private') {\n return this.#buildPrivateMessageEvent(msg)\n } else {\n return this.#buildGroupMessageEvent(msg)\n }\n }\n\n /**\n * 删除好友\n */\n deleteFriend(user_id: number, block: boolean = false, both: boolean = false): Promise<void> {\n return this.api<void>('delete_friend', {\n user_id,\n temp_block: block,\n temp_both_del: both,\n })\n }\n\n /**\n * 设置群成员禁言\n */\n setGroupBan(group_id: number, user_id: number, duration: number): Promise<void> {\n return this.api<void>('set_group_ban', { group_id, user_id, duration })\n }\n\n /**\n * 撤回消息\n */\n recallMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_msg', { message_id })\n }\n\n /**\n * 获取陌生人信息\n */\n getStrangerInfo(user_id: number): Promise<any> {\n return this.api<any>('get_stranger_info', { user_id })\n }\n\n /**\n * 发送私聊消息\n */\n sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_private_msg', {\n user_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 发送群消息\n */\n sendGroupMsg(group_id: number, sendable: Sendable | Sendable[]): Promise<{ message_id: number }> {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.normalizeSendable(sendable),\n })\n }\n\n /**\n * 获取群信息\n */\n getGroupInfo(group_id: number): Promise<any> {\n return this.api<any>('get_group_info', { group_id })\n }\n\n /**\n * 群签到\n */\n setGroupSign(group_id: number): Promise<any> {\n return this.api<void>('set_group_sign', { group_id })\n }\n\n /**\n * 设置群精华消息\n */\n setEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('set_essence_msg', { message_id })\n }\n\n /**\n * 删除群精华消息\n */\n deleteEssenceMsg(message_id: number): Promise<void> {\n return this.api<void>('delete_essence_msg', { message_id })\n }\n\n /**\n * 设置群成员名片\n */\n setGroupCard(group_id: number, user_id: number, card: string): Promise<void> {\n return this.api<void>('set_group_card', { group_id, user_id, card })\n }\n\n /**\n * 设置群成员专属头衔\n */\n setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void> {\n return this.api<void>('set_group_special_title', { group_id, user_id, title })\n }\n\n /**\n * 获取群成员列表\n */\n getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]> {\n return this.api<GroupMemberInfo[]>('get_group_member_list', { group_id })\n }\n\n /**\n * 获取群成员信息\n */\n getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo> {\n return this.api<GroupMemberInfo>('get_group_member_info', { group_id, user_id })\n }\n\n /**\n * 机器人是否在线\n */\n isOnline(): boolean {\n return this.#ws?.readyState === WebSocket.OPEN && this.#online\n }\n\n /**\n * 计算 GTK 值\n */\n getGTk(pskey: string): number {\n let gkt = 5381\n for (let i = 0, len = pskey.length; i < len; ++i) {\n gkt += (gkt << 5) + pskey.charCodeAt(i)\n }\n return gkt & 0x7fffffff\n }\n\n /**\n * 获取 NapCat 原始 Cookie 相关信息\n */\n getNapCatCookies(domain: string): Promise<{ cookies: string; bkn: string }> {\n return this.api<{ cookies: string; bkn: string }>('get_cookies', { domain })\n }\n\n /**\n * 获取版本信息\n */\n getVersionInfo(): Promise<{ app_name: string; protocol_version: string; app_version: string }> {\n return this.api<{ app_name: string; protocol_version: string; app_version: string }>('get_version_info')\n }\n\n /**\n * 获取登录信息\n */\n getLoginInfo(): Promise<{ user_id: number; nickname: string }> {\n return this.api<{ user_id: number; nickname: string }>('get_login_info')\n }\n\n /**\n * 获取 Cookie 相关信息\n */\n async getCookie(domain: string): Promise<{\n uin: number\n pskey: string\n skey: string\n gtk: string\n bkn: string\n cookie: string\n legacyCookie: string\n }> {\n const cache = this.#cookieCache.get(domain)\n\n if (cache) return cache\n\n const { cookies: cookieString, bkn } = await this.getNapCatCookies(domain)\n\n const skey = cookieString.match(/skey=([^;]*)/)?.[1] || ''\n const pskey = cookieString.match(/pskey=([^;]*)/)?.[1] || ''\n const gtk = this.getGTk(pskey)\n\n const returns = {\n pskey,\n skey,\n uin: this.uin,\n gtk: String(gtk),\n bkn,\n cookie: `uin=${this.uin}; skey=${skey}; p_uin=${this.uin}; p_skey=${pskey};`,\n legacyCookie: `uin=o${this.uin}; skey=${skey}; p_uin=o${this.uin}; p_skey=${pskey};`,\n }\n\n this.#cookieCache.set(domain, returns)\n\n // 1 小时后清除缓存\n setTimeout(\n () => {\n this.#cookieCache.delete(domain)\n },\n 1000 * 60 * 60,\n )\n\n return returns\n }\n\n /**\n * 通过域名获取 Pskey\n */\n async getPskey(domain: string): Promise<string> {\n const { pskey } = await this.getCookie(domain)\n return pskey\n }\n\n /**\n * 获取 Bkn 值\n */\n async getBkn(): Promise<string> {\n const { bkn } = await this.getCookie('vip.qq.com')\n return bkn\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, token: __, ...config } = this.#config\n\n this.logger.debug(`run with config: ${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.debug(`received non-json message: ${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.#online = false\n this.logger.debug('NapCat disconnected')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.#online = false\n this.logger.debug(`NapCat error: ${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.debug('NapCat connected')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket instance created.`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n close(): void {\n if (this.#ws) {\n this.logger.info('destroying NapCat SDK instance...')\n this.#ws.close()\n this.#ws = null\n this.logger.info('NapCat SDK instance destroyed.')\n } else {\n this.logger.warn('NapCat SDK instance is not initialized.')\n }\n }\n}\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n input_status: {\n notice_type: 'friend',\n sub_type: 'input',\n },\n profile_like: {\n notice_type: 'friend',\n sub_type: 'like',\n },\n title: {\n notice_type: 'group',\n sub_type: 'title',\n },\n}\n\n/**\n * NapCat 通知事件映射表(notice 类型)\n * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type\n */\nconst NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }> = {\n friend_add: {\n notice_type: 'friend',\n sub_type: 'increase',\n },\n friend_recall: {\n notice_type: 'friend',\n sub_type: 'recall',\n },\n offline_file: {\n notice_type: 'friend',\n sub_type: 'offline_file',\n },\n client_status: {\n notice_type: 'client',\n sub_type: 'status',\n },\n group_admin: {\n notice_type: 'group',\n sub_type: 'admin',\n },\n group_ban: {\n notice_type: 'group',\n sub_type: 'ban',\n },\n group_card: {\n notice_type: 'group',\n sub_type: 'card',\n },\n group_upload: {\n notice_type: 'group',\n sub_type: 'upload',\n },\n group_decrease: {\n notice_type: 'group',\n sub_type: 'decrease',\n },\n group_increase: {\n notice_type: 'group',\n sub_type: 'increase',\n },\n group_msg_emoji_like: {\n notice_type: 'group',\n sub_type: 'reaction',\n },\n essence: {\n notice_type: 'group',\n sub_type: 'essence',\n },\n group_recall: {\n notice_type: 'group',\n sub_type: 'recall',\n },\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -6,7 +6,21 @@ declare const ABSTRACT_LOGGER: Logger;
6
6
  declare const CONSOLE_LOGGER: Logger;
7
7
  //#endregion
8
8
  //#region src/types.d.ts
9
- interface MiokiOptions {
9
+ interface Stat {
10
+ /** 启动时间,Unix 时间戳(毫秒) */
11
+ start_time: number;
12
+ /** 已接受消息数 */
13
+ recv: {
14
+ group: number;
15
+ private: number;
16
+ };
17
+ /** 已发送消息数 */
18
+ send: {
19
+ group: number;
20
+ private: number;
21
+ };
22
+ }
23
+ interface NapcatOptions {
10
24
  /** NapCat 访问令牌 */
11
25
  token: string;
12
26
  /** NapCat 服务器协议,默认为 ws */
@@ -39,7 +53,7 @@ interface EventMap extends OneBotEventMap {
39
53
  app_name: string;
40
54
  app_version: string;
41
55
  protocol_version: string;
42
- ts: number;
56
+ timestamp: number;
43
57
  };
44
58
  }
45
59
  /**
@@ -428,7 +442,7 @@ interface Group {
428
442
  /** NapCat 实例 */
429
443
  napcat: NapCat;
430
444
  /** 群签到 */
431
- doSign: () => Promise<string>;
445
+ sign: () => Promise<string>;
432
446
  /** 获取群信息 */
433
447
  getInfo: () => Promise<{
434
448
  group_all_shut: number;
@@ -439,21 +453,21 @@ interface Group {
439
453
  max_member_count: number;
440
454
  }>;
441
455
  /** 获取群成员列表 */
442
- getMemberList: () => Promise<any>;
456
+ getMemberList: () => Promise<GroupMemberInfo[]>;
443
457
  /** 获取群成员信息 */
444
- getMemberInfo: (user_id: number) => Promise<any>;
458
+ getMemberInfo: (user_id: number) => Promise<GroupMemberInfo>;
445
459
  /** 设置群头衔 */
446
- setTitle: (title: string) => Promise<any>;
460
+ setTitle: (user_id: number, title: string) => Promise<any>;
447
461
  /** 设置群名片 */
448
462
  setCard: (user_id: number, card: string) => Promise<any>;
449
- /** 添加群精华消息 */
450
- addEssence: (message_id: string) => Promise<any>;
451
- /** 删除群精华消息 */
452
- delEssence: (message_id: string) => Promise<any>;
463
+ /** 设置群精华消息 */
464
+ setEssence: (message_id: number) => Promise<any>;
465
+ /** 移除群精华消息 */
466
+ delEssence: (message_id: number) => Promise<any>;
453
467
  /** 撤回群消息 */
454
468
  recall: (message_id: number) => Promise<any>;
455
469
  /** 禁言群成员 */
456
- banMember: (user_id: number, duration: number) => Promise<any>;
470
+ ban: (user_id: number, duration: number) => Promise<any>;
457
471
  /** 发送群消息 */
458
472
  sendMsg: SendMsg;
459
473
  }
@@ -581,7 +595,7 @@ type MessageEventBase<T extends MessageType, U$1 extends object> = EventBase<"me
581
595
  raw_message: string;
582
596
  /** 消息段数组 */
583
597
  message: RecvElement[];
584
- /** 回复消息的方法 */
598
+ /** 回复消息 */
585
599
  reply: Reply;
586
600
  }>;
587
601
  /**
@@ -620,18 +634,20 @@ type GroupMessageEvent = MessageEventBase<"group", {
620
634
  user_id: number;
621
635
  /** 群消息子类型:normal-普通消息, notice-通知消息 */
622
636
  sub_type: "normal" | "notice";
623
- /** 撤回该消息的方法 */
637
+ /** 撤回该消息 */
624
638
  recall: Recall;
625
- /** 添加消息表态的方法 */
639
+ /** 添加消息表态 */
626
640
  addReaction: ReactionAction;
627
- /** 删除消息表态的方法 */
641
+ /** 删除消息表态 */
628
642
  delReaction: ReactionAction;
629
643
  /** 获取引用的消息 */
630
644
  getQuoteMessage: () => Promise<GroupMessageEvent | null>;
631
- /** 添加精华消息的方法 */
632
- addEssence: () => Promise<void>;
633
- /** 删除精华消息的方法 */
645
+ /** 设置精华消息 */
646
+ setEssence: () => Promise<void>;
647
+ /** 删除精华消息 */
634
648
  delEssence: () => Promise<void>;
649
+ /** 获取发送者作为群成员的相关信息,如群身份、群名片等 */
650
+ getSenderMemberInfo: () => Promise<any>;
635
651
  /** 群信息对象 */
636
652
  group: Group;
637
653
  /** 发送者信息 */
@@ -840,9 +856,9 @@ type RequestEventBase<T extends string, U$1 extends object> = EventBase<"request
840
856
  }>;
841
857
  /** 好友添加请求事件 */
842
858
  type FriendRequestEvent = RequestEventBase<"friend", {
843
- /** 同意添加好友请求的方法 */
859
+ /** 同意添加好友请求 */
844
860
  approve: () => Promise<void>;
845
- /** 拒绝添加好友请求的方法 */
861
+ /** 拒绝添加好友请求 */
846
862
  reject: (reason?: string) => Promise<void>;
847
863
  }>;
848
864
  /** 加群请求事件(他人申请加入群) */
@@ -851,9 +867,9 @@ type GroupAddRequestEvent = RequestEventBase<"group", {
851
867
  group_id: number;
852
868
  /** 请求子类型:add-主动加群 */
853
869
  sub_type: "add";
854
- /** 同意群请求的方法 */
870
+ /** 同意群请求 */
855
871
  approve: () => Promise<void>;
856
- /** 拒绝群请求的方法 */
872
+ /** 拒绝群请求 */
857
873
  reject: (reason?: string) => Promise<void>;
858
874
  }>;
859
875
  /** 邀请入群请求事件(他人邀请机器人入群) */
@@ -961,6 +977,26 @@ type OneBotAPI = "delete_friend" | "delete_msg" | "get_forward_msg" | "get_frien
961
977
  type NapCatExtendAPI = "_del_group_notice" | "_get_group_notice" | "_get_model_show" | "_mark_all_as_read" | "_send_group_notice" | "_set_model_show" | ".handle_quick_operation" | ".ocr_image" | "ArkShareGroup" | "ArkSharePeer" | "bot_exit" | "can_send_image" | "can_send_record" | "clean_cache" | "click_inline_keyboard_button" | "create_collection" | "create_group_file_folder" | "delete_essence_msg" | "delete_group_file" | "delete_group_folder" | "download_file" | "fetch_custom_face" | "fetch_emoji_like" | "forward_friend_single_msg" | "forward_group_single_msg" | "friend_poke" | "get_ai_characters" | "get_ai_record" | "get_clientkey" | "get_collection_list" | "get_cookies" | "get_credentials" | "get_csrf_token" | "get_doubt_friends_add_request" | "get_essence_msg_list" | "get_file" | "get_friend_msg_history" | "get_friends_with_category" | "get_group_at_all_remain" | "get_group_detail_info" | "get_group_file_system_info" | "get_group_file_url" | "get_group_files_by_folder" | "get_group_honor_info" | "get_group_ignored_notifies" | "get_group_info_ex" | "get_group_root_files" | "get_group_shut_list" | "get_group_system_msg" | "get_image" | "get_mini_app_ark" | "get_online_clients" | "get_private_file_url" | "get_profile_like" | "get_recent_contact" | "get_record" | "get_rkey_server" | "get_rkey" | "get_robot_uin_range" | "get_unidirectional_friend_list" | "get_version_info" | "group_poke" | "mark_group_msg_as_read" | "mark_msg_as_read" | "mark_private_msg_as_read" | "move_group_file" | "nc_get_packet_status" | "nc_get_rkey" | "nc_get_user_status" | "ocr_image" | "rename_group_file" | "send_forward_msg" | "send_group_ai_record" | "send_group_sign" | "send_like" | "send_packet" | "send_poke" | "set_diy_online_status" | "set_essence_msg" | "set_friend_remark" | "set_group_add_option" | "set_group_kick_members" | "set_group_remark" | "set_group_robot_add_option" | "set_group_search" | "set_group_sign" | "set_group_whole_ban" | "set_input_status" | "set_msg_emoji_like" | "set_online_status" | "set_qq_avatar" | "set_self_longnick" | "trans_group_file" | "translate_en2zh" | "upload_group_file" | "upload_private_file";
962
978
  /** 所有可用的 API 接口联合类型 */
963
979
  type API = OneBotAPI | NapCatExtendAPI;
980
+ interface GroupMemberInfo {
981
+ group_id: number;
982
+ user_id: number;
983
+ nickname: string;
984
+ card: string;
985
+ sex: string;
986
+ age: number;
987
+ area: string;
988
+ level: string;
989
+ qq_level: number;
990
+ join_time: number;
991
+ last_sent_time: number;
992
+ title_expire_time: number;
993
+ unfriendly: boolean;
994
+ card_changeable: boolean;
995
+ is_robot: boolean;
996
+ shut_up_timestamp: number;
997
+ role: "owner" | "admin" | "member" | (string & {});
998
+ title: string;
999
+ }
964
1000
  //#endregion
965
1001
  //#region src/segment.d.ts
966
1002
  /**
@@ -1013,7 +1049,9 @@ declare const version: string;
1013
1049
  declare class NapCat {
1014
1050
  #private;
1015
1051
  private readonly options;
1016
- constructor(options: MiokiOptions);
1052
+ constructor(options: NapcatOptions);
1053
+ /** 统计数据 */
1054
+ get stat(): Stat;
1017
1055
  /** WebSocket 实例 */
1018
1056
  get ws(): WebSocket;
1019
1057
  /** 日志记录器 */
@@ -1022,6 +1060,8 @@ declare class NapCat {
1022
1060
  get segment(): typeof segment;
1023
1061
  /**
1024
1062
  * 机器人 QQ 号
1063
+ *
1064
+ * @deprecated 建议使用 `uin` 属性
1025
1065
  */
1026
1066
  get user_id(): number;
1027
1067
  /**
@@ -1032,6 +1072,8 @@ declare class NapCat {
1032
1072
  * 机器人昵称
1033
1073
  */
1034
1074
  get nickname(): string;
1075
+ /** 标准化可发送消息元素 */
1076
+ normalizeSendable(msg: Sendable | Sendable[]): NormalizedElementToSend[];
1035
1077
  stringifyMessage(message: RecvElement[]): string;
1036
1078
  /** 获取一个群的信息,可以用于发送群消息等操作 */
1037
1079
  pickGroup(group_id: number): Promise<GroupWithInfo | null>;
@@ -1058,6 +1100,42 @@ declare class NapCat {
1058
1100
  */
1059
1101
  api<T extends any>(action: API | (string & {}), params?: Record<string, any>): Promise<T>;
1060
1102
  /**
1103
+ * 获取好友列表
1104
+ */
1105
+ getFriendList(): Promise<(Friend & Record<string, any>)[]>;
1106
+ /**
1107
+ * 获取群列表
1108
+ */
1109
+ getGroupList(): Promise<(Group & Record<string, any>)[]>;
1110
+ /**
1111
+ * 添加消息回应
1112
+ */
1113
+ addReaction(message_id: number, id: string): Promise<void>;
1114
+ /**
1115
+ * 删除消息回应
1116
+ */
1117
+ delReaction(message_id: number, id: string): Promise<void>;
1118
+ /**
1119
+ * 获取消息
1120
+ */
1121
+ getMsg(message_id?: number | string | null): Promise<GroupMessageEvent | PrivateMessageEvent | null>;
1122
+ /**
1123
+ * 删除好友
1124
+ */
1125
+ deleteFriend(user_id: number, block?: boolean, both?: boolean): Promise<void>;
1126
+ /**
1127
+ * 设置群成员禁言
1128
+ */
1129
+ setGroupBan(group_id: number, user_id: number, duration: number): Promise<void>;
1130
+ /**
1131
+ * 撤回消息
1132
+ */
1133
+ recallMsg(message_id: number): Promise<void>;
1134
+ /**
1135
+ * 获取陌生人信息
1136
+ */
1137
+ getStrangerInfo(user_id: number): Promise<any>;
1138
+ /**
1061
1139
  * 发送私聊消息
1062
1140
  */
1063
1141
  sendPrivateMsg(user_id: number, sendable: Sendable | Sendable[]): Promise<{
@@ -1070,6 +1148,38 @@ declare class NapCat {
1070
1148
  message_id: number;
1071
1149
  }>;
1072
1150
  /**
1151
+ * 获取群信息
1152
+ */
1153
+ getGroupInfo(group_id: number): Promise<any>;
1154
+ /**
1155
+ * 群签到
1156
+ */
1157
+ setGroupSign(group_id: number): Promise<any>;
1158
+ /**
1159
+ * 设置群精华消息
1160
+ */
1161
+ setEssenceMsg(message_id: number): Promise<void>;
1162
+ /**
1163
+ * 删除群精华消息
1164
+ */
1165
+ deleteEssenceMsg(message_id: number): Promise<void>;
1166
+ /**
1167
+ * 设置群成员名片
1168
+ */
1169
+ setGroupCard(group_id: number, user_id: number, card: string): Promise<void>;
1170
+ /**
1171
+ * 设置群成员专属头衔
1172
+ */
1173
+ setGroupSpecialTitle(group_id: number, user_id: number, title: string): Promise<void>;
1174
+ /**
1175
+ * 获取群成员列表
1176
+ */
1177
+ getGroupMemberList(group_id: number): Promise<GroupMemberInfo[]>;
1178
+ /**
1179
+ * 获取群成员信息
1180
+ */
1181
+ getGroupMemberInfo(group_id: number, user_id: number): Promise<GroupMemberInfo>;
1182
+ /**
1073
1183
  * 机器人是否在线
1074
1184
  */
1075
1185
  isOnline(): boolean;
@@ -1125,5 +1235,5 @@ declare class NapCat {
1125
1235
  close(): void;
1126
1236
  }
1127
1237
  //#endregion
1128
- export { ABSTRACT_LOGGER, API, CONSOLE_LOGGER, EventBase, EventMap, ExtractByType, FlattenData, Friend, FriendDecreaseNoticeEvent, FriendIncreaseNoticeEvent, FriendInputNoticeEvent, FriendLikeNoticeEvent, FriendNoticeEvent, FriendNoticeEventBase, FriendPokeNoticeEvent, FriendRecallNoticeEvent, FriendRequestEvent, FriendWithInfo, Group, GroupAddRequestEvent, GroupAdminNoticeEvent, GroupBanNoticeEvent, GroupCardNoticeEvent, GroupDecreaseNoticeEvent, GroupEssenceNoticeEvent, GroupIncreaseNoticeEvent, GroupInviteRequestEvent, GroupMessageEvent, GroupNoticeEvent, GroupNoticeEventBase, GroupPokeNoticeEvent, GroupReactionNoticeEvent, GroupRecallNoticeEvent, GroupRequestEvent, GroupTitleNoticeEvent, GroupUploadNoticeEvent, GroupWithInfo, HeartbeatMetaEvent, LifecycleMetaEvent, LogLevel, Logger, MediaProps, MessageEvent, MessageEventBase, MessageType, MetaEvent, MetaEventBase, MetaEventType, MiokiOptions, NapCat, NapCatExtendAPI, NormalizedElementToSend, NoticeEvent, NoticeEventBase, NoticeSubType, NoticeType, OneBotAPI, OneBotEventMap, OptionalKeys, OptionalProps, PostType, PrivateMessageEvent, RecvAtElement, RecvDiceElement, RecvElement, RecvFaceElement, RecvFileElement, RecvForwardElement, RecvImageElement, RecvJsonElement, RecvLightAppElement, RecvLocationElement, RecvMarkdownElement, RecvPokeElement, RecvRecordElement, RecvReplyElement, RecvRpsElement, RecvShakeElement, RecvShareElement, RecvTextElement, RecvVideoElement, RequestEvent, RequestEventBase, SendAtElement, SendBfaceElement, SendContactElement, SendCustomMusicElement, SendElement, SendFaceElement, SendFileElement, SendForwardElement, SendImageElement, SendJsonElement, SendLightAppElement, SendMarkdownElement, SendMfaceElement, SendMusicElement, SendNodeContentElement, SendNodeElement, SendNodeRefElement, SendPlatformMusicElement, SendPokeElement, SendRecordElement, SendReplyElement, SendTextElement, SendVideoElement, Sendable, WrapData, name, noop, segment, version };
1238
+ export { ABSTRACT_LOGGER, API, CONSOLE_LOGGER, EventBase, EventMap, ExtractByType, FlattenData, Friend, FriendDecreaseNoticeEvent, FriendIncreaseNoticeEvent, FriendInputNoticeEvent, FriendLikeNoticeEvent, FriendNoticeEvent, FriendNoticeEventBase, FriendPokeNoticeEvent, FriendRecallNoticeEvent, FriendRequestEvent, FriendWithInfo, Group, GroupAddRequestEvent, GroupAdminNoticeEvent, GroupBanNoticeEvent, GroupCardNoticeEvent, GroupDecreaseNoticeEvent, GroupEssenceNoticeEvent, GroupIncreaseNoticeEvent, GroupInviteRequestEvent, GroupMemberInfo, GroupMessageEvent, GroupNoticeEvent, GroupNoticeEventBase, GroupPokeNoticeEvent, GroupReactionNoticeEvent, GroupRecallNoticeEvent, GroupRequestEvent, GroupTitleNoticeEvent, GroupUploadNoticeEvent, GroupWithInfo, HeartbeatMetaEvent, LifecycleMetaEvent, LogLevel, Logger, MediaProps, MessageEvent, MessageEventBase, MessageType, MetaEvent, MetaEventBase, MetaEventType, NapCat, NapCatExtendAPI, NapcatOptions, NormalizedElementToSend, NoticeEvent, NoticeEventBase, NoticeSubType, NoticeType, OneBotAPI, OneBotEventMap, OptionalKeys, OptionalProps, PostType, PrivateMessageEvent, RecvAtElement, RecvDiceElement, RecvElement, RecvFaceElement, RecvFileElement, RecvForwardElement, RecvImageElement, RecvJsonElement, RecvLightAppElement, RecvLocationElement, RecvMarkdownElement, RecvPokeElement, RecvRecordElement, RecvReplyElement, RecvRpsElement, RecvShakeElement, RecvShareElement, RecvTextElement, RecvVideoElement, RequestEvent, RequestEventBase, SendAtElement, SendBfaceElement, SendContactElement, SendCustomMusicElement, SendElement, SendFaceElement, SendFileElement, SendForwardElement, SendImageElement, SendJsonElement, SendLightAppElement, SendMarkdownElement, SendMfaceElement, SendMusicElement, SendNodeContentElement, SendNodeElement, SendNodeRefElement, SendPlatformMusicElement, SendPokeElement, SendRecordElement, SendReplyElement, SendTextElement, SendVideoElement, Sendable, Stat, WrapData, name, noop, segment, version };
1129
1239
  //# sourceMappingURL=index.d.cts.map