napcat-sdk 0.5.0 → 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.
- package/dist/index.cjs +232 -82
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +134 -24
- package/dist/index.d.mts +134 -24
- package/dist/index.mjs +232 -82
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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<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.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 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
|
|
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
|
-
|
|
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
|
-
|
|
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<
|
|
456
|
+
getMemberList: () => Promise<GroupMemberInfo[]>;
|
|
443
457
|
/** 获取群成员信息 */
|
|
444
|
-
getMemberInfo: (user_id: number) => Promise<
|
|
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
|
-
|
|
451
|
-
/**
|
|
452
|
-
delEssence: (message_id:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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,
|
|
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
|