napcat-sdk 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -30,53 +30,35 @@ node_crypto = __toESM(node_crypto);
30
30
  let mitt = require("mitt");
31
31
  mitt = __toESM(mitt);
32
32
 
33
+ //#region src/logger.ts
34
+ const noop = () => {};
35
+ const ABSTRACT_LOGGER = {
36
+ fatal: noop,
37
+ error: noop,
38
+ warn: noop,
39
+ info: noop,
40
+ debug: noop,
41
+ trace: noop
42
+ };
43
+ const CONSOLE_LOGGER = {
44
+ fatal: console.error.bind(console, "[FATAL]"),
45
+ error: console.error.bind(console, "[ERROR]"),
46
+ warn: console.warn.bind(console, "[WARN]"),
47
+ info: console.info.bind(console, "[INFO]"),
48
+ debug: console.debug.bind(console, "[DEBUG]"),
49
+ trace: console.trace.bind(console, "[TRACE]")
50
+ };
51
+
52
+ //#endregion
33
53
  //#region package.json
34
54
  var name$1 = "napcat-sdk";
35
- var version$1 = "0.1.0";
36
- var package_default = {
37
- name: name$1,
38
- type: "module",
39
- version: version$1,
40
- packageManager: "pnpm@10.26.0",
41
- description: "A simple SDK for NapCat OneBot v11.",
42
- keywords: [
43
- "napcat",
44
- "onebot",
45
- "onebot v11",
46
- "sdk"
47
- ],
48
- repository: {
49
- "type": "git",
50
- "url": "git+https://github.com/vikiboss/mioki.git",
51
- "directory": "packages/napcat-sdk"
52
- },
53
- scripts: {
54
- "dev": "tsdown -w",
55
- "build": "tsdown"
56
- },
57
- exports: {
58
- ".": {
59
- "require": "./dist/index.cjs",
60
- "import": "./dist/index.mjs",
61
- "types": "./dist/index.d.ts"
62
- },
63
- "./package.json": "./package.json"
64
- },
65
- author: "Viki <hi@viki.moe> (https://github.com/vikiboss)",
66
- license: "MIT",
67
- devDependencies: {
68
- "@types/node": "catalog:dev",
69
- "tsdown": "catalog:dev",
70
- "typescript": "catalog:dev"
71
- },
72
- dependencies: { "mitt": "^3.0.1" }
73
- };
55
+ var version$1 = "0.1.2";
74
56
 
75
57
  //#endregion
76
58
  //#region src/segment.ts
77
- function createSegment(type$1, data) {
59
+ function createSegment(type, data) {
78
60
  return {
79
- type: type$1,
61
+ type,
80
62
  ...data
81
63
  };
82
64
  }
@@ -102,9 +84,9 @@ const segment = {
102
84
  }),
103
85
  mface: (options) => createSegment("mface", { ...options }),
104
86
  bface: (id) => createSegment("bface", { id }),
105
- contact: (type$1, id) => createSegment("contact", {
87
+ contact: (type, id) => createSegment("contact", {
106
88
  id,
107
- sub_type: type$1
89
+ sub_type: type
108
90
  }),
109
91
  poke: () => createSegment("poke", {}),
110
92
  music: (platform, id) => createSegment("music", {
@@ -128,101 +110,6 @@ const segment = {
128
110
  lightapp: () => createSegment("lightapp", {})
129
111
  };
130
112
 
131
- //#endregion
132
- //#region src/logger.ts
133
- const LOG_LEVEL_KEYS = Object.keys({
134
- fatal: 0,
135
- error: 1,
136
- warn: 2,
137
- info: 3,
138
- debug: 4,
139
- trace: 5
140
- });
141
- const noop = () => {};
142
- const ABSTRACT_LOGGER = Object.fromEntries(LOG_LEVEL_KEYS.map((level) => [level, noop]));
143
- const CONSOLE_LOGGER = Object.fromEntries(LOG_LEVEL_KEYS.map((level) => [level, (...args) => {
144
- console[level === "fatal" ? "error" : level === "trace" ? "debug" : level](...args);
145
- }]));
146
-
147
- //#endregion
148
- //#region src/onebot.ts
149
- /**
150
- * NapCat 通知类型映射表(notify 类型)
151
- * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type
152
- */
153
- const NAPCAT_NOTICE_NOTIFY_MAP = {
154
- input_status: {
155
- notice_type: "friend",
156
- sub_type: "input"
157
- },
158
- profile_like: {
159
- notice_type: "friend",
160
- sub_type: "like"
161
- },
162
- title: {
163
- notice_type: "group",
164
- sub_type: "title"
165
- }
166
- };
167
- /**
168
- * NapCat 通知事件映射表(notice 类型)
169
- * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type
170
- */
171
- const NAPCAT_NOTICE_EVENT_MAP = {
172
- friend_add: {
173
- notice_type: "friend",
174
- sub_type: "increase"
175
- },
176
- friend_recall: {
177
- notice_type: "friend",
178
- sub_type: "recall"
179
- },
180
- offline_file: {
181
- notice_type: "friend",
182
- sub_type: "offline_file"
183
- },
184
- client_status: {
185
- notice_type: "client",
186
- sub_type: "status"
187
- },
188
- group_admin: {
189
- notice_type: "group",
190
- sub_type: "admin"
191
- },
192
- group_ban: {
193
- notice_type: "group",
194
- sub_type: "ban"
195
- },
196
- group_card: {
197
- notice_type: "group",
198
- sub_type: "card"
199
- },
200
- group_upload: {
201
- notice_type: "group",
202
- sub_type: "upload"
203
- },
204
- group_decrease: {
205
- notice_type: "group",
206
- sub_type: "decrease"
207
- },
208
- group_increase: {
209
- notice_type: "group",
210
- sub_type: "increase"
211
- },
212
- group_msg_emoji_like: {
213
- notice_type: "group",
214
- sub_type: "reaction"
215
- },
216
- essence: {
217
- notice_type: "group",
218
- sub_type: "essence"
219
- },
220
- group_recall: {
221
- notice_type: "group",
222
- sub_type: "recall"
223
- }
224
- };
225
-
226
113
  //#endregion
227
114
  //#region src/napcat.ts
228
115
  const name = name$1;
@@ -305,9 +192,9 @@ var NapCat = class {
305
192
  type: "at",
306
193
  data: { qq: String(item.qq) }
307
194
  };
308
- const { type: type$1, ...data } = item;
195
+ const { type, ...data } = item;
309
196
  return {
310
- type: type$1,
197
+ type,
311
198
  data
312
199
  };
313
200
  });
@@ -531,13 +418,13 @@ var NapCat = class {
531
418
  /**
532
419
  * 注册一次性事件监听器
533
420
  */
534
- once(type$1, handler) {
421
+ once(type, handler) {
535
422
  const onceHandler = (event) => {
536
423
  handler(event);
537
- this.#event.off(type$1, onceHandler);
424
+ this.#event.off(type, onceHandler);
538
425
  };
539
- this.logger.debug(`registering once: ${String(type$1)}`);
540
- this.#event.on(type$1, onceHandler);
426
+ this.logger.debug(`registering once: ${String(type)}`);
427
+ this.#event.on(type, onceHandler);
541
428
  }
542
429
  /**
543
430
  * 注册事件监听器,支持主类型或者点分子类型
@@ -546,16 +433,16 @@ var NapCat = class {
546
433
  *
547
434
  * 如果需要移除监听器,请调用 `off` 方法
548
435
  */
549
- on(type$1, handler) {
550
- this.logger.debug(`registering: ${String(type$1)}`);
551
- this.#event.on(type$1, handler);
436
+ on(type, handler) {
437
+ this.logger.debug(`registering: ${String(type)}`);
438
+ this.#event.on(type, handler);
552
439
  }
553
440
  /**
554
441
  * 移除事件监听器
555
442
  */
556
- off(type$1, handler) {
557
- this.logger.debug(`unregistering: ${String(type$1)}`);
558
- this.#event.off(type$1, handler);
443
+ off(type, handler) {
444
+ this.logger.debug(`unregistering: ${String(type)}`);
445
+ this.#event.off(type, handler);
559
446
  }
560
447
  api(action, params = {}) {
561
448
  this.#ensureWsConnection(this.#ws);
@@ -587,7 +474,7 @@ var NapCat = class {
587
474
  });
588
475
  }
589
476
  /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */
590
- async bootstrap() {
477
+ async run() {
591
478
  const { logger: _, ...config } = this.#config;
592
479
  this.logger.info(`bootstrap with config: ${JSON.stringify(config)}`);
593
480
  return new Promise((resolve, reject) => {
@@ -626,7 +513,7 @@ var NapCat = class {
626
513
  });
627
514
  }
628
515
  /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */
629
- async destroy() {
516
+ close() {
630
517
  if (this.#ws) {
631
518
  this.logger.info("destroying NapCat SDK instance...");
632
519
  this.#ws.close();
@@ -635,19 +522,89 @@ var NapCat = class {
635
522
  } else this.logger.warn("NapCat SDK instance is not initialized.");
636
523
  }
637
524
  };
525
+ /**
526
+ * NapCat 通知类型映射表(notify 类型)
527
+ * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type
528
+ */
529
+ const NAPCAT_NOTICE_NOTIFY_MAP = {
530
+ input_status: {
531
+ notice_type: "friend",
532
+ sub_type: "input"
533
+ },
534
+ profile_like: {
535
+ notice_type: "friend",
536
+ sub_type: "like"
537
+ },
538
+ title: {
539
+ notice_type: "group",
540
+ sub_type: "title"
541
+ }
542
+ };
543
+ /**
544
+ * NapCat 通知事件映射表(notice 类型)
545
+ * @description 将 NapCat 的原始通知事件类型映射到标准的 notice_type 和 sub_type
546
+ */
547
+ const NAPCAT_NOTICE_EVENT_MAP = {
548
+ friend_add: {
549
+ notice_type: "friend",
550
+ sub_type: "increase"
551
+ },
552
+ friend_recall: {
553
+ notice_type: "friend",
554
+ sub_type: "recall"
555
+ },
556
+ offline_file: {
557
+ notice_type: "friend",
558
+ sub_type: "offline_file"
559
+ },
560
+ client_status: {
561
+ notice_type: "client",
562
+ sub_type: "status"
563
+ },
564
+ group_admin: {
565
+ notice_type: "group",
566
+ sub_type: "admin"
567
+ },
568
+ group_ban: {
569
+ notice_type: "group",
570
+ sub_type: "ban"
571
+ },
572
+ group_card: {
573
+ notice_type: "group",
574
+ sub_type: "card"
575
+ },
576
+ group_upload: {
577
+ notice_type: "group",
578
+ sub_type: "upload"
579
+ },
580
+ group_decrease: {
581
+ notice_type: "group",
582
+ sub_type: "decrease"
583
+ },
584
+ group_increase: {
585
+ notice_type: "group",
586
+ sub_type: "increase"
587
+ },
588
+ group_msg_emoji_like: {
589
+ notice_type: "group",
590
+ sub_type: "reaction"
591
+ },
592
+ essence: {
593
+ notice_type: "group",
594
+ sub_type: "essence"
595
+ },
596
+ group_recall: {
597
+ notice_type: "group",
598
+ sub_type: "recall"
599
+ }
600
+ };
638
601
 
639
602
  //#endregion
640
603
  exports.ABSTRACT_LOGGER = ABSTRACT_LOGGER;
641
604
  exports.CONSOLE_LOGGER = CONSOLE_LOGGER;
642
- exports.DEFAULT_NAPCAT_OPTIONS = DEFAULT_NAPCAT_OPTIONS;
643
605
  exports.NapCat = NapCat;
644
- Object.defineProperty(exports, 'PKG', {
645
- enumerable: true,
646
- get: function () {
647
- return package_default;
648
- }
649
- });
650
606
  exports.name = name;
607
+ exports.noop = noop;
651
608
  exports.segment = segment;
652
609
  exports.version = version;
653
610
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["type","ABSTRACT_LOGGER: Logger","CONSOLE_LOGGER: Logger","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>","pkg.name","pkg.version","options: MiokiOptions","#config","#ws","crypto","#echoEvent","#buildFriend","#wrapReply","#buildGroup","#event","#buildPrivateMessageEvent","#buildGroupMessageEvent","type","#ensureWsConnection","#echoId","#waitForAction","#normalizeSendable","#buildWsUrl","#bindInternalEvents"],"sources":["../package.json","../src/segment.ts","../src/logger.ts","../src/onebot.ts","../src/napcat.ts"],"sourcesContent":["{\n \"name\": \"napcat-sdk\",\n \"type\": \"module\",\n \"version\": \"0.1.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 \"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 \"types\": \"./dist/index.d.ts\"\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 } from './types'\nimport type { SendElement } from './onebot'\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 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","export type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace'\n\nexport type Logger = Record<LogLevel, (...args: unknown[]) => void>\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n fatal: 0,\n error: 1,\n warn: 2,\n info: 3,\n debug: 4,\n trace: 5,\n}\n\nconst LOG_LEVEL_KEYS = Object.keys(LOG_LEVELS) as LogLevel[]\n\nconst noop = () => {}\n\nexport const ABSTRACT_LOGGER: Logger = Object.fromEntries(LOG_LEVEL_KEYS.map((level) => [level, noop])) as Logger\n\nexport const CONSOLE_LOGGER: Logger = Object.fromEntries(\n LOG_LEVEL_KEYS.map((level) => [\n level,\n (...args: unknown[]) => {\n console[level === 'fatal' ? 'error' : level === 'trace' ? 'debug' : level](...args)\n },\n ]),\n) as Logger\n","/**\n * 媒体消息的通用属性\n */\nexport interface MediaProps {\n /** 媒体文件的 URL 地址 */\n url: string\n /** 媒体文件的本地路径 */\n path: string\n /** 媒体文件名或特殊标识 */\n file: (string & {}) | 'marketface'\n /** 媒体文件 ID */\n file_id: string\n /** 媒体文件大小(字节) */\n file_size: string\n /** 媒体文件唯一标识 */\n file_unique: string\n}\n\n// ==================== 接收消息段类型 ====================\n\n/** 接收的纯文本消息段 */\nexport interface RecvTextElement {\n type: 'text'\n /** 文本内容 */\n text: string\n}\n\n/** 接收的 @ 消息段 */\nexport interface RecvAtElement {\n type: 'at'\n /** 被 @ 的 QQ 号,'all' 表示 @全体成员 */\n qq: 'all' | (string & {})\n}\n\n/** 接收的回复消息段 */\nexport interface RecvReplyElement {\n type: 'reply'\n /** 被回复的消息 ID */\n id: string\n}\n\n/** 接收的 QQ 表情消息段 */\nexport interface RecvFaceElement {\n type: 'face'\n /** QQ 表情 ID */\n id: number\n}\n\n/** 接收的图片消息段 */\nexport interface RecvImageElement extends MediaProps {\n type: 'image'\n /** 图片摘要/描述 */\n summary?: string\n /** 图片子类型 */\n sub_type?: string\n}\n\n/** 接收的语音消息段 */\nexport interface RecvRecordElement extends MediaProps {\n type: 'record'\n}\n\n/** 接收的视频消息段 */\nexport interface RecvVideoElement extends MediaProps {\n type: 'video'\n}\n\n/** 接收的猜拳消息段 */\nexport interface RecvRpsElement {\n type: 'rps'\n /** 猜拳结果:1-石头, 2-剪刀, 3-布 */\n result: string\n}\n\n/** 接收的掷骰子消息段 */\nexport interface RecvDiceElement {\n type: 'dice'\n /** 骰子点数:1-6 */\n result: string\n}\n\n/** 接收的窗口抖动消息段(戳一戳) */\nexport interface RecvShakeElement {\n type: 'shake'\n}\n\n/** 接收的戳一戳消息段 */\nexport interface RecvPokeElement {\n type: 'poke'\n}\n\n/** 接收的分享链接消息段 */\nexport interface RecvShareElement {\n type: 'share'\n}\n\n/** 接收的位置消息段 */\nexport interface RecvLocationElement {\n type: 'location'\n}\n\n/** 接收的合并转发消息段 */\nexport interface RecvForwardElement {\n type: 'forward'\n /** 合并转发消息 ID */\n id: string\n /** 合并转发消息内容 */\n content: []\n}\n\n/** 接收的 JSON 消息段 */\nexport interface RecvJsonElement {\n type: 'json'\n /** JSON 数据字符串 */\n data: string\n}\n\n/** 接收的文件消息段 */\nexport interface RecvFileElement extends MediaProps {\n type: 'file'\n}\n\n/** 接收的 Markdown 消息段 */\nexport interface RecvMarkdownElement {\n type: 'markdown'\n}\n\n/** 接收的小程序消息段 */\nexport interface RecvLightAppElement {\n type: 'lightapp'\n}\n\n/**\n * 接收的消息段类型联合\n * @description 表示从 QQ 接收到的所有可能的消息段类型\n */\nexport type RecvElement =\n | RecvTextElement\n | RecvAtElement\n | RecvReplyElement\n | RecvFaceElement\n | RecvImageElement\n | RecvRecordElement\n | RecvVideoElement\n | RecvRpsElement\n | RecvDiceElement\n | RecvShakeElement\n | RecvPokeElement\n | RecvShareElement\n | RecvLocationElement\n | RecvForwardElement\n | RecvJsonElement\n | RecvFileElement\n | RecvMarkdownElement\n | RecvLightAppElement\n\n// ==================== 发送消息段类型 ====================\n\n/** 发送的纯文本消息段 */\nexport interface SendTextElement {\n type: 'text'\n /** 文本内容 */\n text: string\n}\n\n/** 发送的 @ 消息段 */\nexport interface SendAtElement {\n type: 'at'\n /** 被 @ 的 QQ 号,'all' 表示 @全体成员 */\n qq: 'all' | (string & {}) | number\n}\n\n/** 发送的回复消息段 */\nexport interface SendReplyElement {\n type: 'reply'\n /** 被回复的消息 ID */\n id: string\n}\n\n/** 发送的商城表情消息段 */\nexport interface SendMfaceElement {\n type: 'mface'\n /** 表情 ID */\n id: number\n /** 表情 key */\n key: string\n /** emoji ID */\n emoji_id: string\n /** emoji 表情包 ID */\n emoji_package_id: string\n /** 表情描述/摘要 */\n summary?: string\n}\n\n/** 发送的 QQ 表情消息段 */\nexport interface SendFaceElement {\n type: 'face'\n /** QQ 表情 ID */\n id: number\n}\n\n/** 发送的大表情消息段 */\nexport interface SendBfaceElement {\n type: 'bface'\n /** 大表情 ID */\n id: number\n}\n\n/** 发送的图片消息段 */\nexport interface SendImageElement {\n type: 'image'\n /** 图片文件,支持 file:// / http:// / base64:// 协议 */\n file: string\n /** 图片文件名 */\n name?: string\n /** 图片摘要/描述 */\n summary?: string\n /** 图片子类型 */\n sub_type?: string\n}\n\n/** 发送的视频消息段 */\nexport interface SendVideoElement {\n type: 'video'\n /** 视频文件,支持 file:// / http:// / base64:// 协议 */\n file: string\n /** 视频文件名 */\n name?: string\n /** 视频封面图,支持 file:// / http:// / base64:// 协议 */\n thumb?: string\n}\n\n/** 发送的语音消息段 */\nexport interface SendRecordElement {\n type: 'record'\n /** 语音文件,支持 file:// / http:// / base64:// 协议 */\n file: string\n /** 语音文件名 */\n name?: string\n}\n\n/** 发送的推荐好友/群消息段 */\nexport interface SendContactElement {\n type: 'contact'\n /** 推荐类型:qq-好友, group-群 */\n sub_type: 'qq' | 'group'\n /** 被推荐的 QQ 号或群号 */\n id: string\n}\n\n/** 发送的戳一戳消息段 */\nexport interface SendPokeElement {\n type: 'poke'\n}\n\n/** 发送的音乐分享消息段 - 平台音乐 */\nexport interface SendPlatformMusicElement {\n type: 'music'\n /** 音乐平台 */\n platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo'\n /** 音乐 ID */\n id: string\n}\n\n/** 发送的音乐分享消息段 - 自定义音乐 */\nexport interface SendCustomMusicElement {\n type: 'music'\n /** 自定义音乐标识 */\n platform: 'custom'\n /** 跳转链接 URL */\n url: string\n /** 音频链接 URL */\n audio: string\n /** 音乐标题 */\n title: string\n /** 封面图片 URL */\n image?: string\n /** 歌手名称 */\n singer?: string\n}\n\n/** 发送的音乐分享消息段 */\nexport type SendMusicElement = SendPlatformMusicElement | SendCustomMusicElement\n\n/** 发送的合并转发消息段 */\nexport interface SendForwardElement {\n type: 'forward'\n /** 合并转发消息 ID */\n id: string\n}\n\n/** 发送的合并转发节点 - 引用已有消息 */\nexport interface SendNodeRefElement {\n type: 'node'\n /** 发送者 QQ 号(可选) */\n user_id?: string\n /** 发送者昵称(可选) */\n nickname?: string\n /** 引用的消息 ID */\n id: string\n}\n\n/** 发送的合并转发节点 - 自定义内容 */\nexport interface SendNodeContentElement {\n type: 'node'\n /** 发送者 QQ 号(可选) */\n user_id?: string\n /** 发送者昵称(可选) */\n nickname?: string\n /** 自定义消息内容 */\n content: Exclude<SendElement, { type: 'node' }>[]\n}\n\n/** 发送的合并转发节点消息段 */\nexport type SendNodeElement = SendNodeRefElement | SendNodeContentElement\n\n/** 发送的 JSON 消息段 */\nexport interface SendJsonElement {\n type: 'json'\n /** JSON 数据字符串 */\n data: string\n}\n\n/** 发送的文件消息段 */\nexport interface SendFileElement {\n type: 'file'\n /** 文件,支持 file:// / http:// / base64:// 协议 */\n file: string\n /** 文件名 */\n name?: string\n}\n\n/** 发送的 Markdown 消息段 */\nexport interface SendMarkdownElement {\n type: 'markdown'\n}\n\n/** 发送的小程序消息段 */\nexport interface SendLightAppElement {\n type: 'lightapp'\n}\n\n/**\n * 发送的消息段类型联合\n * @description 表示可以发送给 QQ 的所有可能的消息段类型\n */\nexport type SendElement =\n | SendTextElement\n | SendAtElement\n | SendReplyElement\n | SendMfaceElement\n | SendFaceElement\n | SendBfaceElement\n | SendImageElement\n | SendVideoElement\n | SendRecordElement\n | SendContactElement\n | SendPokeElement\n | SendMusicElement\n | SendForwardElement\n | SendNodeElement\n | SendJsonElement\n | SendFileElement\n | SendMarkdownElement\n | SendLightAppElement\n\n/**\n * 将消息段类型包装为 OneBot 标准格式\n * @description 将 { type, ...data } 转换为 { type, data: { ...data } } 格式\n */\nexport type WrapData<T extends { type: string }> = { type: T['type']; data: Omit<T, 'type'> }\n\n/**\n * 将 OneBot 标准格式展开为扁平格式\n * @description 将 { type, data: { ...data } } 转换为 { type, ...data } 格式\n */\nexport type FlattenData<T extends { type: string }> = T extends { data: infer U } ? U & { type: T['type'] } : never\n\n/** 标准化后的发送消息段(OneBot 标准格式) */\nexport type NormalizedElementToSend = WrapData<SendElement>\n\n/** 可发送的消息类型,可以是字符串或消息段 */\nexport type Sendable = string | SendElement\n\n// ==================== 事件类型定义 ====================\n\n/** 上报事件类型 */\nexport type PostType = 'meta_event' | 'message' | 'message_sent' | 'notice' | 'request'\n\n/** 元事件类型 */\nexport type MetaEventType = 'heartbeat' | 'lifecycle'\n\n/** 消息类型 */\nexport type MessageType = 'private' | 'group'\n\n/** 通知类型 */\nexport type NoticeType = 'friend' | 'group' | 'client'\n\n/** 通知子类型 */\nexport type NoticeSubType =\n | 'increase'\n | 'decrease'\n | 'recall'\n | 'poke'\n | 'like'\n | 'input'\n | 'admin'\n | 'ban'\n | 'title'\n | 'card'\n | 'upload'\n | 'reaction'\n | 'essence'\n\n/**\n * 事件基础类型\n * @description 所有事件的基础结构,包含时间戳、机器人 QQ 号和事件类型\n */\nexport type EventBase<T extends PostType, U extends object> = U & {\n /** 事件发生的 Unix 时间戳 */\n time: number\n /** 收到事件的机器人 QQ 号 */\n self_id: number\n /** 上报类型 */\n post_type: T\n}\n\n/**\n * 元事件基础类型\n * @description 元事件表示 OneBot 实现本身的状态变化\n */\nexport type MetaEventBase<T extends MetaEventType, U extends object> = EventBase<\n 'meta_event',\n U & { meta_event_type: T }\n>\n\n/**\n * 心跳元事件\n * @description 定期发送的心跳事件,用于确认连接状态\n */\nexport type HeartbeatMetaEvent = MetaEventBase<\n 'heartbeat',\n {\n /** 状态信息 */\n status: {\n /** 是否在线 */\n online: boolean\n /** 状态是否正常 */\n good: boolean\n }\n /** 心跳间隔(毫秒) */\n interval: number\n }\n>\n\n/**\n * 生命周期元事件\n * @description OneBot 实现的生命周期事件\n */\nexport type LifecycleMetaEvent = MetaEventBase<\n 'lifecycle',\n {\n /** 生命周期子类型 */\n sub_type: 'connect'\n // sub_type: 'connect' | 'disable' | 'enable'\n }\n>\n\n/** 元事件联合类型 */\nexport type MetaEvent = HeartbeatMetaEvent | LifecycleMetaEvent\n\n// ==================== 辅助函数类型 ====================\n\n/** 回复消息的函数类型 */\ntype Reply = (sendable: Sendable | Sendable[], reply?: boolean) => Promise<{ message_id: number }>\n\n/** 发送消息的函数类型 */\ntype SendMsg = (sendable: Sendable | Sendable[]) => Promise<{ message_id: number }>\n\n/** 消息表态操作的函数类型 */\ntype ReactionAction = (id: string) => Promise<void>\n\n/** 撤回消息的函数类型 */\ntype Recall = () => Promise<void>\n\n// ==================== 群和好友接口 ====================\n\n/**\n * 群信息接口\n * @description 包含群的基本信息和常用操作方法\n */\nexport interface Group {\n /** 群号 */\n group_id: number\n /** 群名称 */\n group_name: string\n /** 群签到 */\n doSign: () => Promise<string>\n /** 获取群信息 */\n getInfo: () => Promise<{\n group_all_shut: number\n group_remark: string\n group_id: number\n group_name: string\n member_count: number\n max_member_count: number\n }>\n /** 获取群成员列表 */\n getMemberList: () => Promise<any>\n /** 获取群成员信息 */\n getMemberInfo: (user_id: number) => Promise<any>\n /** 设置群头衔 */\n setTitle: (title: string) => Promise<any>\n /** 设置群名片 */\n setCard: (user_id: number, card: string) => Promise<any>\n /** 添加群精华消息 */\n addEssence: (message_id: string) => Promise<any>\n /** 删除群精华消息 */\n delEssence: (message_id: string) => Promise<any>\n /** 撤回群消息 */\n recall: (message_id: number) => Promise<any>\n /** 禁言群成员 */\n banMember: (user_id: number, duration: number) => Promise<any>\n /** 发送群消息 */\n sendMsg: SendMsg\n}\n\nexport type GroupWithInfo = Group & Awaited<ReturnType<Group['getInfo']>>\n\n/**\n * 好友信息接口\n * @description 包含好友的基本信息和常用操作方法\n */\nexport interface Friend {\n /** 好友 QQ 号 */\n user_id: number\n /** 好友昵称 */\n nickname: string\n /** 发送私聊消息 */\n sendMsg: SendMsg\n /** 删除好友 */\n delete: (block?: boolean, both?: boolean) => Promise<any>\n /** 获取好友信息 */\n getInfo: () => Promise<{\n uid: string\n uin: string\n nick: string\n remark: string\n constellation: number\n shengXiao: number\n kBloodType: number\n homeTown: string\n makeFriendCareer: number\n pos: string\n college: string\n country: string\n province: string\n city: string\n postCode: string\n address: string\n regTime: number\n interest: string\n labels: string[]\n qqLevel: number\n qid: string\n longNick: string\n birthday_year: number\n birthday_month: number\n birthday_day: number\n age: number\n sex: string\n eMail: string\n phoneNum: string\n categoryId: number\n richTime: number\n richBuffer: {}\n topTime: string\n isBlock: boolean\n isMsgDisturb: boolean\n isSpecialCareOpen: boolean\n isSpecialCareZone: boolean\n ringId: string\n isBlocked: boolean\n recommendImgFlag: number\n disableEmojiShortCuts: number\n qidianMasterFlag: number\n qidianCrewFlag: number\n qidianCrewFlag2: number\n isHideQQLevel: number\n isHidePrivilegeIcon: number\n status: number\n extStatus: number\n batteryStatus: number\n termType: number\n netType: number\n iconType: number\n customStatus: null | string\n setTime: string\n specialFlag: number\n abiFlag: number\n eNetworkType: number\n showName: string\n termDesc: string\n musicInfo: {\n buf: {}\n }\n extOnlineBusinessInfo: {\n buf: {}\n customStatus: null\n videoBizInfo: {\n cid: string\n tvUrl: string\n synchType: string\n }\n videoInfo: {\n name: string\n }\n }\n user_id: number\n nickname: string\n long_nick: string\n reg_time: number\n is_vip: boolean\n is_years_vip: boolean\n vip_level: number\n login_days: number\n }>\n}\n\nexport type FriendWithInfo = Friend & Awaited<ReturnType<Friend['getInfo']>>\n\n// ==================== 消息事件类型 ====================\n\n/**\n * 消息事件基础类型\n * @description 所有消息事件的基础结构\n */\nexport type MessageEventBase<T extends MessageType, U extends object> = EventBase<\n 'message',\n U & {\n /** 消息 ID */\n message_id: number\n /** 消息类型 */\n message_type: T\n /** 消息序号 */\n message_seq: number\n /** 消息真实 ID */\n real_id: number\n /** 消息真实序号 */\n real_seq: number\n /** 原始消息内容(CQ 码格式) */\n raw_message: string\n /** 消息段数组 */\n message: RecvElement[]\n /** 回复消息的方法 */\n reply: Reply\n }\n>\n\n/**\n * 私聊消息事件\n * @description 包含好友私聊、群临时会话等私聊消息\n */\nexport type PrivateMessageEvent = MessageEventBase<\n 'private',\n {\n /** 发送者 QQ 号 */\n user_id: number\n /** 私聊子类型:friend-好友, group-群临时会话, group_self-群中自己发送, other-其他 */\n sub_type: 'friend' | 'group' | 'group_self' | 'other'\n /** 接收者 QQ 号 */\n target_id: number\n /** 好友信息对象 */\n friend: Friend\n /** 发送者信息 */\n sender: {\n /** 发送者 QQ 号 */\n user_id: number\n /** 发送者昵称 */\n nickname: string\n }\n }\n>\n\n/**\n * 群消息事件\n * @description 群聊中的消息事件\n */\nexport type GroupMessageEvent = MessageEventBase<\n 'group',\n {\n /** 群号 */\n group_id: number\n /** 群名称 */\n group_name: string\n /** 发送者 QQ 号 */\n user_id: number\n /** 群消息子类型:normal-普通消息, notice-通知消息 */\n sub_type: 'normal' | 'notice'\n /** 撤回该消息的方法 */\n recall: Recall\n /** 添加消息表态的方法 */\n addReaction: ReactionAction\n /** 删除消息表态的方法 */\n delReaction: ReactionAction\n /** 群信息对象 */\n group: Group\n /** 发送者信息 */\n sender: {\n /** 发送者 QQ 号 */\n user_id: number\n /** 发送者昵称 */\n nickname: string\n /** 发送者群名片 */\n card: string\n /** 发送者群角色:owner-群主, admin-管理员, member-普通成员 */\n role: 'owner' | 'admin' | 'member'\n }\n }\n>\n\n/** 消息事件联合类型 */\nexport type MessageEvent = PrivateMessageEvent | GroupMessageEvent\n\n/**\n * 将消息事件转换为发送消息事件类型\n * @description 用于表示机器人自己发送的消息事件\n */\ntype ToMessageSent<T extends MessageEvent> = Omit<T, 'post_type' | 'group' | 'friend' | 'reply'> & {\n post_type: 'message_sent'\n}\n\n// ==================== 通知事件类型 ====================\n\n/**\n * 通知事件基础类型\n * @description 所有通知事件的基础结构\n */\nexport type NoticeEventBase<T extends NoticeType, U extends object> = EventBase<\n 'notice',\n U & {\n /** 通知类型 */\n notice_type: T\n /** 原始通知类型 */\n original_notice_type: string\n }\n>\n\n/**\n * 群通知事件基础类型\n * @description 所有群相关通知事件的基础结构\n */\nexport type GroupNoticeEventBase<T extends NoticeSubType, U extends object> = NoticeEventBase<\n 'group',\n U & {\n /** 通知子类型 */\n sub_type: T\n /** 群号 */\n group_id: number\n /** 相关用户 QQ 号 */\n user_id: number\n /** 群信息对象 */\n group: Group\n }\n>\n\n/**\n * 好友通知事件基础类型\n * @description 所有好友相关通知事件的基础结构\n */\nexport type FriendNoticeEventBase<T extends NoticeSubType, U extends object> = NoticeEventBase<\n 'friend',\n U & {\n /** 通知子类型 */\n sub_type: T\n /** 相关用户 QQ 号 */\n user_id: number\n /** 好友信息对象 */\n friend: Friend\n }\n>\n\n/** 好友增加通知事件 */\nexport type FriendIncreaseNoticeEvent = FriendNoticeEventBase<'increase', {}>\n\n/** 好友减少通知事件 */\nexport type FriendDecreaseNoticeEvent = FriendNoticeEventBase<'decrease', {}>\n\n/** 好友消息撤回通知事件 */\nexport type FriendRecallNoticeEvent = FriendNoticeEventBase<\n 'recall',\n {\n /** 被撤回的消息 ID */\n message_id: number\n }\n>\n\n/** 好友戳一戳通知事件 */\nexport type FriendPokeNoticeEvent = FriendNoticeEventBase<\n 'poke',\n {\n /** 被戳者 QQ 号 */\n target_id: number\n /** 发送者 QQ 号 */\n sender_qq: number\n /** 原始信息 */\n raw_info: any[]\n }\n>\n\n/** 好友点赞通知事件 */\nexport type FriendLikeNoticeEvent = FriendNoticeEventBase<\n 'like',\n {\n /** 操作者 QQ 号 */\n operator_id: number\n /** 操作者昵称 */\n operator_nick: string\n /** 点赞次数 */\n times: number\n }\n>\n\n/** 好友输入状态通知事件 */\nexport type FriendInputNoticeEvent = FriendNoticeEventBase<\n 'input',\n {\n /** 状态文本 */\n status_text: string\n /** 事件类型 */\n event_type: number\n }\n>\n\n/** 好友通知事件联合类型 */\nexport type FriendNoticeEvent =\n | FriendIncreaseNoticeEvent\n | FriendDecreaseNoticeEvent\n | FriendRecallNoticeEvent\n | FriendPokeNoticeEvent\n | FriendLikeNoticeEvent\n | FriendInputNoticeEvent\n\n// ==================== 群通知事件 ====================\n\n/** 群成员增加通知事件 */\nexport type GroupIncreaseNoticeEvent = GroupNoticeEventBase<\n 'increase',\n {\n /** 操作者 QQ 号(如邀请者) */\n operator_id: number\n /** 加入类型:invite-邀请, add-主动加群, approve-管理员审批 */\n actions_type: 'invite' | 'add' | 'approve'\n }\n>\n\n/** 群成员减少通知事件 */\nexport type GroupDecreaseNoticeEvent = GroupNoticeEventBase<\n 'decrease',\n {\n /** 操作者 QQ 号 */\n operator_id: number\n /** 离开类型:kick-被踢, leave-主动退出 */\n actions_type: 'kick' | 'leave'\n }\n>\n\n/** 群管理员变动通知事件 */\nexport type GroupAdminNoticeEvent = GroupNoticeEventBase<\n 'admin',\n {\n /** 操作类型:set-设置管理员, unset-取消管理员 */\n action_type: 'set' | 'unset'\n }\n>\n\n/** 群禁言通知事件 */\nexport type GroupBanNoticeEvent = GroupNoticeEventBase<\n 'ban',\n {\n /** 禁言时长(秒),0 表示解除禁言 */\n duration: number\n /** 操作类型:ban-禁言, lift_ban-解除禁言 */\n action_type: 'ban' | 'lift_ban'\n /** 操作者 QQ 号 */\n operator_id: number\n }\n>\n\n/** 群名片变动通知事件 */\nexport type GroupCardNoticeEvent = GroupNoticeEventBase<\n 'card',\n {\n /** 新名片 */\n card_new: string\n /** 旧名片 */\n card_old: string\n }\n>\n\n/** 群戳一戳通知事件 */\nexport type GroupPokeNoticeEvent = GroupNoticeEventBase<\n 'poke',\n {\n /** 被戳者 QQ 号 */\n target_id: number\n /** 原始信息 */\n raw_info: any[]\n }\n>\n\n/** 群头衔变动通知事件 */\nexport type GroupTitleNoticeEvent = GroupNoticeEventBase<\n 'title',\n {\n /** 新头衔 */\n title: string\n }\n>\n\n/** 群文件上传通知事件 */\nexport type GroupUploadNoticeEvent = GroupNoticeEventBase<\n 'upload',\n {\n /** 上传的文件信息 */\n file: {\n /** 文件 ID */\n id: string\n /** 文件名 */\n name: string\n /** 文件大小(字节) */\n size: number\n /** 文件业务 ID */\n busid: number\n }\n }\n>\n\n/** 群消息表态变动通知事件 */\nexport type GroupReactionNoticeEvent = GroupNoticeEventBase<\n 'reaction',\n {\n /** 相关消息 ID */\n message_id: number\n /** 表态列表 */\n likes: {\n /** 表情 ID */\n emoji_id: string\n /** 表态数量 */\n count: number\n }[]\n /** 是否为添加表态 */\n is_add: boolean\n }\n>\n/** 群精华消息变动通知事件 */\nexport type GroupEssenceNoticeEvent = GroupNoticeEventBase<\n 'essence',\n {\n /** 原消息发送者 QQ 号 */\n sender_id: number\n /** 相关消息 ID */\n message_id: number\n /** 操作者 QQ 号 */\n operator_id: number\n /** 操作类型:add-添加精华, remove-移除精华 */\n action_type: 'add' | 'remove'\n }\n>\n\n/** 群消息撤回通知事件 */\nexport type GroupRecallNoticeEvent = GroupNoticeEventBase<\n 'recall',\n {\n /** 被撤回的消息 ID */\n message_id: number\n /** 操作者 QQ 号 */\n operator_id: number\n }\n>\n\n/** 群通知事件联合类型 */\nexport type GroupNoticeEvent =\n | GroupIncreaseNoticeEvent\n | GroupDecreaseNoticeEvent\n | GroupBanNoticeEvent\n | GroupCardNoticeEvent\n | GroupPokeNoticeEvent\n | GroupTitleNoticeEvent\n | GroupUploadNoticeEvent\n | GroupReactionNoticeEvent\n | GroupEssenceNoticeEvent\n | GroupRecallNoticeEvent\n\n/** 通知事件联合类型 */\nexport type NoticeEvent = GroupNoticeEvent | FriendNoticeEvent\n\n// ==================== 请求事件类型 ====================\n\n/**\n * 请求事件基础类型\n * @description 所有请求事件的基础结构\n */\nexport type RequestEventBase<T extends string, U extends object> = EventBase<\n 'request',\n U & {\n /** 请求类型 */\n request_type: T\n /** 请求者 QQ 号 */\n user_id: number\n /** 请求标识,用于处理请求 */\n flag: string\n /** 验证信息/备注 */\n comment: string\n }\n>\n\n/** 好友添加请求事件 */\nexport type FriendRequestEvent = RequestEventBase<'friend', {}>\n\n/** 加群请求事件(他人申请加入群) */\nexport type GroupAddRequestEvent = RequestEventBase<\n 'group',\n {\n /** 群号 */\n group_id: number\n /** 请求子类型:add-主动加群 */\n sub_type: 'add'\n }\n>\n\n/** 邀请入群请求事件(他人邀请机器人入群) */\nexport type GroupInviteRequestEvent = RequestEventBase<\n 'group',\n {\n /** 群号 */\n group_id: number\n /** 请求子类型:invite-被邀请 */\n sub_type: 'invite'\n }\n>\n\n/** 群请求事件联合类型 */\nexport type GroupRequestEvent = GroupAddRequestEvent | GroupInviteRequestEvent\n\n/** 请求事件联合类型 */\nexport type RequestEvent = FriendRequestEvent | GroupRequestEvent\n\n// ==================== 事件映射 ====================\n\n/**\n * OneBot 事件映射表\n * @description 定义了所有事件名称与对应事件类型的映射关系\n */\nexport interface OneBotEventMap {\n /** 元事件,通常与 OneBot 服务端状态相关 */\n meta_event: MetaEvent\n\n /** 元事件 - 心跳事件,确认服务端在线状态 */\n 'meta_event.heartbeat': HeartbeatMetaEvent\n\n /** 元事件 - 生命周期,服务端状态变化 */\n 'meta_event.lifecycle': LifecycleMetaEvent\n /** 元事件 - 生命周期 - 连接成功 */\n 'meta_event.lifecycle.connect': LifecycleMetaEvent\n // 'meta_event.lifecycle.disable': LifecycleMetaEvent\n // 'meta_event.lifecycle.enable': LifecycleMetaEvent\n\n /** 消息事件,包含私聊和群消息 */\n message: MessageEvent\n\n /** 消息事件 - 私聊消息 */\n 'message.private': PrivateMessageEvent\n /** 消息事件 - 私聊消息 - 好友私聊 */\n 'message.private.friend': PrivateMessageEvent\n /** 消息事件 - 私聊消息 - 群临时会话 */\n 'message.private.group': PrivateMessageEvent\n // 'message.private.group_self': PrivateMessageEvent\n // 'message.private.other': PrivateMessageEvent\n\n /** 消息事件 - 群消息 */\n 'message.group': GroupMessageEvent\n /** 消息事件 - 群消息 - 普通消息 */\n 'message.group.normal': GroupMessageEvent\n // 'message.group.notice': GroupMessageEvent\n\n message_sent: ToMessageSent<MessageEvent>\n\n /* 发送消息事件 - 私聊消息 */\n 'message_sent.private': ToMessageSent<PrivateMessageEvent>\n /* 发送消息事件 - 私聊消息 - 好友私聊 */\n 'message_sent.private.friend': ToMessageSent<PrivateMessageEvent>\n /* 发送消息事件 - 私聊消息 - 群临时会话 */\n 'message_sent.private.group': ToMessageSent<PrivateMessageEvent>\n // 'message_sent.private.group_self': MessageToMessageSent<PrivateMessageEvent>\n // 'message_sent.private.other': MessageToMessageSent<PrivateMessageEvent>\n\n /* 发送消息事件 - 群消息 */\n 'message_sent.group': ToMessageSent<GroupMessageEvent>\n /* 发送消息事件 - 群消息 - 普通消息 */\n 'message_sent.group.normal': ToMessageSent<GroupMessageEvent>\n // 'message.group.notice': MessageToMessageSent<GroupMessageEvent>\n\n /** 请求事件 */\n request: RequestEvent\n\n /** 请求事件 - 好友请求 */\n 'request.friend': FriendRequestEvent\n\n /** 请求事件 - 群请求 */\n 'request.group': GroupRequestEvent\n /** 请求事件 - 他人加群请求,当机器人是群主或管理员时收到 */\n 'request.group.add': GroupAddRequestEvent\n /** 请求事件 - 邀请加群请求,他人邀请机器人加入群时收到 */\n 'request.group.invite': GroupInviteRequestEvent\n\n /** 通知事件 */\n notice: NoticeEvent\n\n /** 通知事件 - 好友相关通知 */\n 'notice.friend': FriendNoticeEvent\n /** 通知事件 - 好友增加 */\n 'notice.friend.increase': FriendIncreaseNoticeEvent\n /** 通知事件 - 好友减少 */\n 'notice.friend.decrease': FriendDecreaseNoticeEvent\n /** 通知事件 - 好友备注变更 */\n 'notice.friend.recall': FriendRecallNoticeEvent\n /** 通知事件 - 好友戳一戳 */\n 'notice.friend.poke': FriendPokeNoticeEvent\n /** 通知事件 - 好友点赞 */\n 'notice.friend.like': FriendLikeNoticeEvent\n /** 通知事件 - 好友输入状态 */\n 'notice.friend.input': FriendInputNoticeEvent\n\n // 'notice.friend.offline_file': EventBase<'notice', any>\n // 'notice.client.status': EventBase<'notice', any>\n\n /** 通知事件 - 群相关通知 */\n 'notice.group': GroupNoticeEvent\n /** 通知事件 - 群成员增加 */\n 'notice.group.increase': GroupIncreaseNoticeEvent\n /** 通知事件 - 群成员减少 */\n 'notice.group.decrease': GroupDecreaseNoticeEvent\n /** 通知事件 - 群管理员变更 */\n 'notice.group.admin': GroupAdminNoticeEvent\n /** 通知事件 - 群成员被禁言 */\n 'notice.group.ban': GroupBanNoticeEvent\n /** 通知事件 - 群戳一戳 */\n 'notice.group.poke': GroupPokeNoticeEvent\n /** 通知事件 - 群头衔变更 */\n 'notice.group.title': GroupTitleNoticeEvent\n /** 通知事件 - 群名片变更 */\n 'notice.group.card': GroupCardNoticeEvent\n /** 通知事件 - 群公告变更 */\n 'notice.group.recall': GroupRecallNoticeEvent\n /** 通知事件 - 群上传文件 */\n 'notice.group.upload': GroupUploadNoticeEvent\n /** 通知事件 - 给群消息添加反应 Reaction */\n 'notice.group.reaction': GroupReactionNoticeEvent\n /** 通知事件 - 群精华消息变更 */\n 'notice.group.essence': GroupEssenceNoticeEvent\n}\n\n// ==================== API 类型 ====================\n\n/**\n * OneBot 11 标准 API\n * @description OneBot 11 规范定义的标准 API 接口\n */\nexport type OneBotAPI =\n | 'delete_friend'\n | 'delete_msg'\n | 'get_forward_msg'\n | 'get_friend_list'\n | 'get_group_info'\n | 'get_group_list'\n | 'get_group_member_info'\n | 'get_group_member_list'\n | 'get_group_msg_history'\n | 'get_login_info'\n | 'get_msg'\n | 'get_status'\n | 'get_stranger_info'\n | 'send_group_msg'\n | 'send_private_msg'\n | 'set_friend_add_request'\n | 'set_group_add_request'\n | 'set_group_admin'\n | 'set_group_ban'\n | 'set_group_card'\n | 'set_group_kick'\n | 'set_group_leave'\n | 'set_group_name'\n | 'set_group_portrait'\n | 'set_group_special_title'\n | 'set_qq_profile'\n\n/**\n * NapCat 扩展 API\n * @description NapCat 实现的额外扩展 API 接口\n */\nexport type NapCatExtendAPI =\n | '_del_group_notice'\n | '_get_group_notice'\n | '_get_model_show'\n | '_mark_all_as_read'\n | '_send_group_notice'\n | '_set_model_show'\n | '.handle_quick_operation'\n | '.ocr_image'\n | 'ArkShareGroup'\n | 'ArkSharePeer'\n | 'bot_exit'\n | 'can_send_image'\n | 'can_send_record'\n | 'clean_cache'\n | 'click_inline_keyboard_button'\n | 'create_collection'\n | 'create_group_file_folder'\n | 'delete_essence_msg'\n | 'delete_group_file'\n | 'delete_group_folder'\n | 'download_file'\n | 'fetch_custom_face'\n | 'fetch_emoji_like'\n | 'forward_friend_single_msg'\n | 'forward_group_single_msg'\n | 'friend_poke'\n | 'get_ai_characters'\n | 'get_ai_record'\n | 'get_clientkey'\n | 'get_collection_list'\n | 'get_cookies'\n | 'get_credentials'\n | 'get_csrf_token'\n | 'get_doubt_friends_add_request'\n | 'get_essence_msg_list'\n | 'get_file'\n | 'get_friend_msg_history'\n | 'get_friends_with_category'\n | 'get_group_at_all_remain'\n | 'get_group_detail_info'\n | 'get_group_file_system_info'\n | 'get_group_file_url'\n | 'get_group_files_by_folder'\n | 'get_group_honor_info'\n | 'get_group_ignored_notifies'\n | 'get_group_info_ex'\n | 'get_group_root_files'\n | 'get_group_shut_list'\n | 'get_group_system_msg'\n | 'get_image'\n | 'get_mini_app_ark'\n | 'get_online_clients'\n | 'get_private_file_url'\n | 'get_profile_like'\n | 'get_recent_contact'\n | 'get_record'\n | 'get_rkey_server'\n | 'get_rkey'\n | 'get_robot_uin_range'\n | 'get_unidirectional_friend_list'\n | 'get_version_info'\n | 'group_poke'\n | 'mark_group_msg_as_read'\n | 'mark_msg_as_read'\n | 'mark_private_msg_as_read'\n | 'move_group_file'\n | 'nc_get_packet_status'\n | 'nc_get_rkey'\n | 'nc_get_user_status'\n | 'ocr_image'\n | 'rename_group_file'\n | 'send_forward_msg'\n | 'send_group_ai_record'\n | 'send_group_sign'\n | 'send_like'\n | 'send_packet'\n | 'send_poke'\n | 'set_diy_online_status'\n | 'set_essence_msg'\n | 'set_friend_remark'\n | 'set_group_add_option'\n | 'set_group_kick_members'\n | 'set_group_remark'\n | 'set_group_robot_add_option'\n | 'set_group_search'\n | 'set_group_sign'\n | 'set_group_whole_ban'\n | 'set_input_status'\n | 'set_msg_emoji_like'\n | 'set_online_status'\n | 'set_qq_avatar'\n | 'set_self_longnick'\n | 'trans_group_file'\n | 'translate_en2zh'\n | 'upload_group_file'\n | 'upload_private_file'\n\n/** 所有可用的 API 接口联合类型 */\nexport type API = OneBotAPI | NapCatExtendAPI\n\n// ==================== 通知事件映射 ====================\n\n/**\n * NapCat 通知类型映射表(notify 类型)\n * @description 将 NapCat 特有的通知类型映射到标准的 notice_type 和 sub_type\n */\nexport const 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 */\nexport const 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","import crypto from 'node:crypto'\nimport mitt from 'mitt'\nimport pkg from '../package.json' with { type: 'json' }\nimport { segment } from './segment'\nimport { CONSOLE_LOGGER, ABSTRACT_LOGGER } from './logger'\nimport { NAPCAT_NOTICE_EVENT_MAP, NAPCAT_NOTICE_NOTIFY_MAP } from './onebot'\n\nimport type { Emitter } from 'mitt'\nimport type { Logger } from './logger'\nimport type { EventMap, MiokiOptions, OptionalProps } from './types'\nimport type {\n API,\n Friend,\n FriendWithInfo,\n Group,\n GroupMessageEvent,\n GroupWithInfo,\n NormalizedElementToSend,\n PrivateMessageEvent,\n Sendable,\n} from './onebot'\n\nexport const name = pkg.name\nexport const version = pkg.version\n\nexport { CONSOLE_LOGGER, ABSTRACT_LOGGER, pkg as PKG }\n\nexport const DEFAULT_NAPCAT_OPTIONS = {\n protocol: 'ws',\n host: 'localhost',\n port: 3333,\n logger: ABSTRACT_LOGGER,\n} satisfies Required<OptionalProps<MiokiOptions>>\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\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 /** 生成唯一的 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 {\n reject(`Server 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 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 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: PrivateMessageEvent) {\n return {\n ...event,\n message: (event.message || []).map((el: any) => ({ type: el.type, ...el.data })),\n friend: this.#buildFriend(event.user_id, event.sender?.nickname || ''),\n recall: () => this.api('delete_msg', { message_id: event.message_id }),\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: GroupMessageEvent) {\n return {\n ...event,\n message: (event.message || []).map((el: any) => ({ type: el.type, ...el.data })),\n group: this.#buildGroup(event.group_id, event.group?.group_name || ''),\n recall: () => this.api('delete_msg', { message_id: event.message_id }),\n addReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: true }),\n delReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: false }),\n addEssence: () => this.api('set_essence_msg', { message_id: event.message_id }),\n delEssence: () => this.api('delete_essence_msg', { message_id: event.message_id }),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`received meta_event: ${JSON.stringify(data)}`)\n 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 if (data.sub_type) {\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 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 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 = () => this.api('set_friend_request', { flag: data.flag, approve: false })\n data.approve = () => this.api('set_friend_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 /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo> {\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 }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo> {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\n }\n\n /**\n * 注册一次性事件监听器\n */\n once<T extends keyof EventMap>(type: T, handler: (event: EventMap[NoInfer<T>]) => 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) {\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) {\n this.logger.debug(`unregistering: ${String(type)}`)\n this.#event.off(type, handler)\n }\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[]) {\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[]) {\n return this.api<{ message_id: number }>('send_group_msg', {\n group_id,\n message: this.#normalizeSendable(sendable),\n })\n }\n\n /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async bootstrap() {\n const { logger: _, ...config } = this.#config\n\n this.logger.info(`bootstrap with config: ${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.warn(`received non-json message: ${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.logger.info('closed')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.logger.error(`error: ${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.info('connected')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket instance created: ${this.#ws}`)\n })\n }\n\n /** 销毁 NapCat SDK 实例,关闭 WebSocket 连接 */\n async destroy() {\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"],"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<MiokiOptions>>","options: MiokiOptions","#config","#ws","crypto","#echoEvent","#buildFriend","#wrapReply","#buildGroup","#event","#buildPrivateMessageEvent","#buildGroupMessageEvent","#ensureWsConnection","#echoId","#waitForAction","#normalizeSendable","#buildWsUrl","#bindInternalEvents","NAPCAT_NOTICE_NOTIFY_MAP: Record<string, { notice_type: string; sub_type: string }>","NAPCAT_NOTICE_EVENT_MAP: Record<string, { notice_type: string; sub_type: string }>"],"sources":["../src/logger.ts","../package.json","../src/segment.ts","../src/napcat.ts"],"sourcesContent":["export type LogLevel = 'fatal' | '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 fatal: noop,\n error: noop,\n warn: noop,\n info: noop,\n debug: noop,\n trace: noop,\n}\n\nexport const CONSOLE_LOGGER: Logger = {\n fatal: console.error.bind(console, '[FATAL]'),\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.1.2\",\n \"packageManager\": \"pnpm@10.26.0\",\n \"description\": \"A simple SDK for NapCat OneBot v11.\",\n \"keywords\": [\n \"napcat\",\n \"onebot\",\n \"onebot v11\",\n \"sdk\"\n ],\n \"homepage\": \"https://github.com/vikiboss/mioki#readme\",\n \"files\": [\n \"dist\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/vikiboss/mioki/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/vikiboss/mioki.git\",\n \"directory\": \"packages/napcat-sdk\"\n },\n \"scripts\": {\n \"dev\": \"tsdown -w\",\n \"build\": \"tsdown\"\n },\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"author\": \"Viki <hi@viki.moe> (https://github.com/vikiboss)\",\n \"license\": \"MIT\",\n \"devDependencies\": {\n \"@types/node\": \"catalog:dev\",\n \"tsdown\": \"catalog:dev\",\n \"typescript\": \"catalog:dev\"\n },\n \"dependencies\": {\n \"mitt\": \"^3.0.1\"\n }\n}\n","import type { ExtractByType, SendElement } from './types'\n\nfunction createSegment<T extends SendElement['type'], D>(type: T, data: D): SendElement {\n return { type, ...data } as SendElement\n}\n\n/**\n * 消息片段构造器\n */\nexport const segment = {\n /** 创建一个文本消息片段 */\n text: (text: string): SendElement => createSegment('text', { text }),\n /** 创建一个艾特消息片段 */\n at: (qq: 'all' | (string & {})): SendElement => createSegment('at', { qq }),\n /** 创建一个 QQ 表情消息片段 */\n face: (id: number): SendElement => createSegment('face', { id }),\n /** 创建一个回复消息片段 */\n reply: (id: string): SendElement => createSegment('reply', { id }),\n /** 创建一个图片消息片段 */\n image: (file: string, options?: Omit<ExtractByType<SendElement, 'image'>, 'type' | 'file'>): SendElement =>\n createSegment('image', { file, ...options }),\n /** 创建一个语音消息片段 */\n record: (file: string, options?: Omit<ExtractByType<SendElement, 'record'>, 'type' | 'file'>): SendElement =>\n createSegment('record', { file, ...options }),\n /** 创建一个视频消息片段 */\n video: (file: string, options?: Omit<ExtractByType<SendElement, 'video'>, 'type' | 'file'>): SendElement =>\n createSegment('video', { file, ...options }),\n /** 创建一个动态表情消息片段 */\n mface: (options: Omit<ExtractByType<SendElement, 'mface'>, 'type'>): SendElement =>\n createSegment('mface', { ...options }),\n /** 创建一个大表情消息片段 */\n bface: (id: number): SendElement => createSegment('bface', { id }),\n /** 创建一个 联系人/群 分享消息片段 */\n contact: (type: 'qq' | 'group', id: string): SendElement => createSegment('contact', { id, sub_type: type }),\n /** 创建一个戳一戳消息片段 */\n poke: (): SendElement => createSegment('poke', {}),\n /** 创建一个音乐消息片段 */\n music: (platform: 'qq' | '163' | 'kugou' | 'migu' | 'kuwo', id: string): SendElement =>\n createSegment('music', { platform, id }),\n /** 创建一个自定义音乐消息片段 */\n musicCustom: (\n title: string,\n audio: string,\n url: string,\n options?: Omit<ExtractByType<SendElement, 'music'>, 'type' | 'platform' | 'url' | 'audio' | 'title'>,\n ): SendElement => createSegment('music', { platform: 'custom', url, audio, title, ...options }),\n /** 创建一个合并转发消息片段 */\n 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 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\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 /** 生成唯一的 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 {\n reject(`Server 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 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 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: PrivateMessageEvent) {\n return {\n ...event,\n message: (event.message || []).map((el: any) => ({ type: el.type, ...el.data })),\n friend: this.#buildFriend(event.user_id, event.sender?.nickname || ''),\n recall: () => this.api('delete_msg', { message_id: event.message_id }),\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: GroupMessageEvent) {\n return {\n ...event,\n message: (event.message || []).map((el: any) => ({ type: el.type, ...el.data })),\n group: this.#buildGroup(event.group_id, event.group?.group_name || ''),\n recall: () => this.api('delete_msg', { message_id: event.message_id }),\n addReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: true }),\n delReaction: (id: string) =>\n this.api('set_msg_emoji_like', { message_id: event.message_id, emoji_id: id, set: false }),\n addEssence: () => this.api('set_essence_msg', { message_id: event.message_id }),\n delEssence: () => this.api('delete_essence_msg', { message_id: event.message_id }),\n reply: (sendable: Sendable | Sendable[], reply = false) =>\n this.sendGroupMsg(event.group_id, this.#wrapReply(sendable, event.message_id, reply)),\n }\n }\n\n /** 绑定内部事件处理器 */\n #bindInternalEvents(data: any) {\n if (data.echo) {\n this.#echoEvent.emit(`echo#${data.echo}`, data)\n return\n }\n\n if (data.post_type) {\n switch (data.post_type) {\n case 'meta_event': {\n this.logger.trace(`received meta_event: ${JSON.stringify(data)}`)\n 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 if (data.sub_type) {\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 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 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 = () => this.api('set_friend_request', { flag: data.flag, approve: false })\n data.approve = () => this.api('set_friend_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 /** 获取一个群的信息,可以用于发送群消息等操作 */\n async pickGroup(group_id: number): Promise<GroupWithInfo> {\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 }\n\n /** 获取一个好友的信息,可以用于发送私聊消息等操作 */\n async pickFriend(user_id: number): Promise<FriendWithInfo> {\n const friendInfo = await this.api<ReturnType<Friend['getInfo']>>('get_stranger_info', { user_id })\n return this.#buildFriend(user_id, friendInfo.nickname, friendInfo)\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 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 /** 启动 NapCat SDK 实例,建立 WebSocket 连接 */\n async run(): Promise<void> {\n const { logger: _, ...config } = this.#config\n\n this.logger.info(`bootstrap with config: ${JSON.stringify(config)}`)\n\n return new Promise<void>((resolve, reject) => {\n const ws = new WebSocket(this.#buildWsUrl())\n\n ws.onmessage = (event) => {\n const data = (() => {\n try {\n return JSON.parse(event.data)\n } catch {\n return null\n }\n })() as any\n\n if (!data) {\n this.logger.warn(`received non-json message: ${event.data}`)\n return\n }\n\n this.#event.emit('ws.message', data)\n this.#bindInternalEvents(data)\n }\n\n ws.onclose = () => {\n this.logger.info('closed')\n this.#event.emit('ws.close')\n }\n\n ws.onerror = (error) => {\n this.logger.error(`error: ${error}`)\n this.#event.emit('ws.error', error)\n reject(error)\n }\n\n ws.onopen = () => {\n this.logger.info('connected')\n this.#event.emit('ws.open')\n resolve()\n }\n\n this.#ws = ws\n\n this.logger.trace(`WebSocket instance created: ${this.#ws}`)\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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"}