@zhin.js/adapter-icqq 3.0.4 → 3.0.5

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.
Files changed (62) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +1 -1
  3. package/dist/index.js +1 -1
  4. package/lib/bot.d.ts +56 -12
  5. package/lib/bot.d.ts.map +1 -1
  6. package/lib/bot.js +416 -136
  7. package/lib/bot.js.map +1 -1
  8. package/lib/cq-message.d.ts +10 -0
  9. package/lib/cq-message.d.ts.map +1 -0
  10. package/lib/cq-message.js +119 -0
  11. package/lib/cq-message.js.map +1 -0
  12. package/lib/forward-msg.d.ts +27 -0
  13. package/lib/forward-msg.d.ts.map +1 -0
  14. package/lib/forward-msg.js +387 -0
  15. package/lib/forward-msg.js.map +1 -0
  16. package/lib/get-msg.d.ts +3 -0
  17. package/lib/get-msg.d.ts.map +1 -0
  18. package/lib/get-msg.js +46 -0
  19. package/lib/get-msg.js.map +1 -0
  20. package/lib/icqq-inbound.d.ts +114 -0
  21. package/lib/icqq-inbound.d.ts.map +1 -0
  22. package/lib/icqq-inbound.js +495 -0
  23. package/lib/icqq-inbound.js.map +1 -0
  24. package/lib/icqq-side-events.d.ts +34 -0
  25. package/lib/icqq-side-events.d.ts.map +1 -0
  26. package/lib/icqq-side-events.js +194 -0
  27. package/lib/icqq-side-events.js.map +1 -0
  28. package/lib/index.d.ts +2 -0
  29. package/lib/index.d.ts.map +1 -1
  30. package/lib/index.js +1 -0
  31. package/lib/index.js.map +1 -1
  32. package/lib/ipc-client.d.ts +7 -2
  33. package/lib/ipc-client.d.ts.map +1 -1
  34. package/lib/ipc-client.js +74 -16
  35. package/lib/ipc-client.js.map +1 -1
  36. package/lib/protocol.d.ts +3 -10
  37. package/lib/protocol.d.ts.map +1 -1
  38. package/lib/protocol.js +2 -0
  39. package/lib/protocol.js.map +1 -1
  40. package/lib/types.d.ts +44 -0
  41. package/lib/types.d.ts.map +1 -1
  42. package/lib/typing-indicator-example.d.ts +108 -0
  43. package/lib/typing-indicator-example.d.ts.map +1 -0
  44. package/lib/typing-indicator-example.js +220 -0
  45. package/lib/typing-indicator-example.js.map +1 -0
  46. package/lib/typing-indicator.d.ts +89 -0
  47. package/lib/typing-indicator.d.ts.map +1 -0
  48. package/lib/typing-indicator.js +237 -0
  49. package/lib/typing-indicator.js.map +1 -0
  50. package/package.json +14 -10
  51. package/src/bot.ts +524 -149
  52. package/src/cq-message.ts +120 -0
  53. package/src/forward-msg.ts +433 -0
  54. package/src/get-msg.ts +56 -0
  55. package/src/icqq-inbound.ts +616 -0
  56. package/src/icqq-side-events.ts +228 -0
  57. package/src/index.ts +8 -0
  58. package/src/ipc-client.ts +76 -16
  59. package/src/protocol.ts +4 -10
  60. package/src/types.ts +45 -0
  61. package/src/typing-indicator-example.ts +269 -0
  62. package/src/typing-indicator.ts +334 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * ICQQ Typing Indicator 使用示例
3
+ *
4
+ * 展示如何在 ICQQ 适配器中集成消息处理状态提示
5
+ */
6
+ import type { IcqqBot } from './bot.js';
7
+ import type { IcqqAdapter } from './adapter.js';
8
+ import { ICQQTypingIndicatorManager, type ICQQTypingIndicatorConfig } from './typing-indicator.js';
9
+ /**
10
+ * 在 ICQQ 适配器初始化时启用 Typing Indicator
11
+ */
12
+ export declare function enableTypingIndicatorForAdapter(adapter: IcqqAdapter): void;
13
+ /**
14
+ * 在消息处理流程中使用 Typing Indicator
15
+ *
16
+ * 使用示例:
17
+ * ```typescript
18
+ * // 在消息处理开始时
19
+ * const indicator = await startTypingIndicator(bot, {
20
+ * messageId: message.$id,
21
+ * sessionId: `${message.$channel.type}:${message.$channel.id}`,
22
+ * userId: message.$sender.id,
23
+ * groupId: message.$channel.type === 'group' ? message.$channel.id : undefined,
24
+ * sceneType: message.$channel.type as 'private' | 'group',
25
+ * });
26
+ *
27
+ * try {
28
+ * // 执行 AI 处理
29
+ * const result = await processMessage(message);
30
+ * return result;
31
+ * } finally {
32
+ * // 处理完成后停止提示
33
+ * await indicator.stop();
34
+ * }
35
+ * ```
36
+ */
37
+ export declare function withTypingIndicator<T>(bot: IcqqBot, options: {
38
+ messageId?: string;
39
+ sessionId: string;
40
+ userId?: string;
41
+ groupId?: string;
42
+ sceneType: 'private' | 'group';
43
+ }, fn: () => Promise<T>): Promise<T>;
44
+ /**
45
+ * 自定义 Typing Indicator 配置
46
+ */
47
+ export declare const customConfigs: Record<string, Partial<ICQQTypingIndicatorConfig>>;
48
+ /**
49
+ * 在 ICQQ 插件中集成 Typing Indicator
50
+ *
51
+ * 在 `index.ts` 中添加:
52
+ * ```typescript
53
+ * import { enableTypingIndicatorForAdapter } from './typing-indicator-example.js';
54
+ *
55
+ * // 在适配器 mounted 后启用
56
+ * provide({
57
+ * name: "icqq",
58
+ * mounted: async (p: Plugin) => {
59
+ * const adapter = new IcqqAdapter(p);
60
+ * await adapter.start();
61
+ *
62
+ * // 启用 Typing Indicator
63
+ * enableTypingIndicatorForAdapter(adapter);
64
+ *
65
+ * return adapter;
66
+ * },
67
+ * });
68
+ * ```
69
+ */
70
+ /**
71
+ * 监听消息事件并自动添加 Typing Indicator
72
+ */
73
+ export declare function setupTypingIndicatorHooks(adapter: IcqqAdapter): void;
74
+ /**
75
+ * 批量管理多个 Bot 的 Typing Indicator
76
+ */
77
+ export declare class BatchTypingIndicatorManager {
78
+ private managers;
79
+ /**
80
+ * 注册 Bot
81
+ */
82
+ registerBot(bot: IcqqBot, config?: Partial<ICQQTypingIndicatorConfig>): void;
83
+ /**
84
+ * 开始提示
85
+ */
86
+ start(botId: string, options: {
87
+ messageId?: string;
88
+ sessionId: string;
89
+ userId?: string;
90
+ groupId?: string;
91
+ sceneType: 'private' | 'group';
92
+ }): Promise<void>;
93
+ /**
94
+ * 停止提示
95
+ */
96
+ stop(botId: string, options: {
97
+ sessionId: string;
98
+ }): Promise<void>;
99
+ /**
100
+ * 停止所有提示
101
+ */
102
+ stopAll(): Promise<void>;
103
+ /**
104
+ * 获取 Bot 的管理器
105
+ */
106
+ getManager(botId: string): ICQQTypingIndicatorManager | undefined;
107
+ }
108
+ //# sourceMappingURL=typing-indicator-example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-indicator-example.d.ts","sourceRoot":"","sources":["../src/typing-indicator-example.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EACL,0BAA0B,EAG1B,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAI/B;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CA0B1E;AAID;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;CAChC,EACD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAkBZ;AAID;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAyC5E,CAAC;AAIF;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAwBpE;AAID;;GAEG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAsD;IAEtE;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,IAAI;IAK5E;;OAEG;IACG,KAAK,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;KAChC,GACA,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS;CAGlE"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * ICQQ Typing Indicator 使用示例
3
+ *
4
+ * 展示如何在 ICQQ 适配器中集成消息处理状态提示
5
+ */
6
+ import { enableTypingIndicator, } from './typing-indicator.js';
7
+ // ── 示例 1: 在适配器中启用 Typing Indicator ──────────────────────────
8
+ /**
9
+ * 在 ICQQ 适配器初始化时启用 Typing Indicator
10
+ */
11
+ export function enableTypingIndicatorForAdapter(adapter) {
12
+ // 遍历所有 Bot 实例
13
+ for (const [botId, bot] of adapter.bots.entries()) {
14
+ const manager = enableTypingIndicator(bot, {
15
+ enabled: true,
16
+ defaultEmoji: '⏳',
17
+ autoRemove: true,
18
+ removeDelay: 5000,
19
+ // 私聊使用消息提示
20
+ privateConfig: {
21
+ type: 'message',
22
+ message: '正在思考中...',
23
+ autoRemove: true,
24
+ removeDelay: 3000,
25
+ },
26
+ // 群聊使用表情回应
27
+ groupConfig: {
28
+ type: 'reaction',
29
+ emoji: '⏳',
30
+ autoRemove: true,
31
+ removeDelay: 5000,
32
+ },
33
+ });
34
+ console.log(`[ICQQ] Typing indicator enabled for bot: ${botId}`);
35
+ }
36
+ }
37
+ // ── 示例 2: 在消息处理中使用 Typing Indicator ─────────────────────────
38
+ /**
39
+ * 在消息处理流程中使用 Typing Indicator
40
+ *
41
+ * 使用示例:
42
+ * ```typescript
43
+ * // 在消息处理开始时
44
+ * const indicator = await startTypingIndicator(bot, {
45
+ * messageId: message.$id,
46
+ * sessionId: `${message.$channel.type}:${message.$channel.id}`,
47
+ * userId: message.$sender.id,
48
+ * groupId: message.$channel.type === 'group' ? message.$channel.id : undefined,
49
+ * sceneType: message.$channel.type as 'private' | 'group',
50
+ * });
51
+ *
52
+ * try {
53
+ * // 执行 AI 处理
54
+ * const result = await processMessage(message);
55
+ * return result;
56
+ * } finally {
57
+ * // 处理完成后停止提示
58
+ * await indicator.stop();
59
+ * }
60
+ * ```
61
+ */
62
+ export async function withTypingIndicator(bot, options, fn) {
63
+ // 获取或创建 Typing Indicator 管理器
64
+ let manager = bot.$typingIndicator;
65
+ if (!manager) {
66
+ manager = enableTypingIndicator(bot);
67
+ }
68
+ // 开始提示
69
+ const indicator = await manager.start(options);
70
+ try {
71
+ // 执行实际处理
72
+ const result = await fn();
73
+ return result;
74
+ }
75
+ finally {
76
+ // 停止提示
77
+ await indicator.stop();
78
+ }
79
+ }
80
+ // ── 示例 3: 自定义配置 ────────────────────────────────────────────────
81
+ /**
82
+ * 自定义 Typing Indicator 配置
83
+ */
84
+ export const customConfigs = {
85
+ // 简洁模式:只使用表情
86
+ minimal: {
87
+ enabled: true,
88
+ defaultEmoji: '💭',
89
+ autoRemove: true,
90
+ removeDelay: 3000,
91
+ privateConfig: {
92
+ type: 'reaction',
93
+ emoji: '💭',
94
+ },
95
+ groupConfig: {
96
+ type: 'reaction',
97
+ emoji: '💭',
98
+ },
99
+ },
100
+ // 详细模式:使用消息提示
101
+ verbose: {
102
+ enabled: true,
103
+ defaultEmoji: '⏳',
104
+ autoRemove: true,
105
+ removeDelay: 5000,
106
+ privateConfig: {
107
+ type: 'message',
108
+ message: '正在处理您的请求,请稍候...',
109
+ autoRemove: true,
110
+ removeDelay: 5000,
111
+ },
112
+ groupConfig: {
113
+ type: 'message',
114
+ message: '正在思考中...',
115
+ autoRemove: true,
116
+ removeDelay: 3000,
117
+ },
118
+ },
119
+ // 禁用模式
120
+ disabled: {
121
+ enabled: false,
122
+ },
123
+ };
124
+ // ── 示例 4: 在插件中集成 ──────────────────────────────────────────────
125
+ /**
126
+ * 在 ICQQ 插件中集成 Typing Indicator
127
+ *
128
+ * 在 `index.ts` 中添加:
129
+ * ```typescript
130
+ * import { enableTypingIndicatorForAdapter } from './typing-indicator-example.js';
131
+ *
132
+ * // 在适配器 mounted 后启用
133
+ * provide({
134
+ * name: "icqq",
135
+ * mounted: async (p: Plugin) => {
136
+ * const adapter = new IcqqAdapter(p);
137
+ * await adapter.start();
138
+ *
139
+ * // 启用 Typing Indicator
140
+ * enableTypingIndicatorForAdapter(adapter);
141
+ *
142
+ * return adapter;
143
+ * },
144
+ * });
145
+ * ```
146
+ */
147
+ // ── 示例 5: 监听消息事件 ──────────────────────────────────────────────
148
+ /**
149
+ * 监听消息事件并自动添加 Typing Indicator
150
+ */
151
+ export function setupTypingIndicatorHooks(adapter) {
152
+ // 监听消息接收事件
153
+ adapter.on('message.receive', async (message) => {
154
+ const bot = adapter.bots.get(message.$bot);
155
+ if (!bot)
156
+ return;
157
+ // 获取或创建 Typing Indicator 管理器
158
+ let manager = bot.$typingIndicator;
159
+ if (!manager) {
160
+ manager = enableTypingIndicator(bot);
161
+ }
162
+ // 开始提示
163
+ const indicator = await manager.start({
164
+ messageId: message.$id,
165
+ sessionId: `${message.$channel.type}:${message.$channel.id}`,
166
+ userId: message.$sender.id,
167
+ groupId: message.$channel.type === 'group' ? message.$channel.id : undefined,
168
+ sceneType: message.$channel.type,
169
+ });
170
+ // 注意:这里只是示例,实际应该在消息处理完成后停止
171
+ // 通常由消息处理流程控制
172
+ });
173
+ }
174
+ // ── 示例 6: 批量操作 ──────────────────────────────────────────────────
175
+ /**
176
+ * 批量管理多个 Bot 的 Typing Indicator
177
+ */
178
+ export class BatchTypingIndicatorManager {
179
+ managers = new Map();
180
+ /**
181
+ * 注册 Bot
182
+ */
183
+ registerBot(bot, config) {
184
+ const manager = enableTypingIndicator(bot, config);
185
+ this.managers.set(bot.$id, manager);
186
+ }
187
+ /**
188
+ * 开始提示
189
+ */
190
+ async start(botId, options) {
191
+ const manager = this.managers.get(botId);
192
+ if (manager) {
193
+ await manager.start(options);
194
+ }
195
+ }
196
+ /**
197
+ * 停止提示
198
+ */
199
+ async stop(botId, options) {
200
+ const manager = this.managers.get(botId);
201
+ if (manager) {
202
+ await manager.stop(options);
203
+ }
204
+ }
205
+ /**
206
+ * 停止所有提示
207
+ */
208
+ async stopAll() {
209
+ for (const manager of this.managers.values()) {
210
+ await manager.stopAll();
211
+ }
212
+ }
213
+ /**
214
+ * 获取 Bot 的管理器
215
+ */
216
+ getManager(botId) {
217
+ return this.managers.get(botId);
218
+ }
219
+ }
220
+ //# sourceMappingURL=typing-indicator-example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-indicator-example.js","sourceRoot":"","sources":["../src/typing-indicator-example.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAEL,qBAAqB,GAGtB,MAAM,uBAAuB,CAAC;AAE/B,+DAA+D;AAE/D;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAAC,OAAoB;IAClE,cAAc;IACd,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,EAAE;YACzC,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,GAAG;YACjB,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI;YACjB,WAAW;YACX,aAAa,EAAE;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,UAAU;gBACnB,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,IAAI;aAClB;YACD,WAAW;YACX,WAAW,EAAE;gBACX,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,GAAG;gBACV,UAAU,EAAE,IAAI;gBAChB,WAAW,EAAE,IAAI;aAClB;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,4CAA4C,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,+DAA+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAY,EACZ,OAMC,EACD,EAAoB;IAEpB,6BAA6B;IAC7B,IAAI,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,OAAO;IACP,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,SAAS;QACT,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,OAAO;QACP,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,kEAAkE;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAuD;IAC/E,aAAa;IACb,OAAO,EAAE;QACP,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE;YACb,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI;SACZ;QACD,WAAW,EAAE;YACX,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI;SACZ;KACF;IAED,cAAc;IACd,OAAO,EAAE;QACP,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,GAAG;QACjB,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE;YACb,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,iBAAiB;YAC1B,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI;SAClB;QACD,WAAW,EAAE;YACX,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,UAAU;YACnB,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,IAAI;SAClB;KACF;IAED,OAAO;IACP,QAAQ,EAAE;QACR,OAAO,EAAE,KAAK;KACf;CACF,CAAC;AAEF,iEAAiE;AAEjE;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,iEAAiE;AAEjE;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAoB;IAC5D,WAAW;IACX,OAAO,CAAC,EAAE,CAAC,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,6BAA6B;QAC7B,IAAI,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAED,OAAO;QACP,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;YACpC,SAAS,EAAE,OAAO,CAAC,GAAG;YACtB,SAAS,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE;YAC5D,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YAC5E,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,IAA2B;SACxD,CAAC,CAAC;QAEH,2BAA2B;QAC3B,cAAc;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,mEAAmE;AAEnE;;GAEG;AACH,MAAM,OAAO,2BAA2B;IAC9B,QAAQ,GAA4C,IAAI,GAAG,EAAE,CAAC;IAEtE;;OAEG;IACH,WAAW,CAAC,GAAY,EAAE,MAA2C;QACnE,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,KAAa,EACb,OAMC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,OAA8B;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAa;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * ICQQ Typing Indicator 集成
3
+ *
4
+ * 为 ICQQ 适配器提供消息处理状态提示功能,
5
+ * 使用消息回应(表情)来提示用户"AI 正在处理"。
6
+ */
7
+ import type { IcqqBot } from './bot.js';
8
+ import { type TypingIndicatorConfig, type TypingIndicator } from '@zhin.js/agent';
9
+ export interface ICQQTypingIndicatorConfig {
10
+ /** 是否启用 */
11
+ enabled: boolean;
12
+ /** 默认表情 */
13
+ defaultEmoji: string;
14
+ /** 是否在完成后自动移除 */
15
+ autoRemove: boolean;
16
+ /** 自动移除延迟(毫秒) */
17
+ removeDelay: number;
18
+ /** 私聊配置 */
19
+ privateConfig?: Partial<TypingIndicatorConfig>;
20
+ /** 群聊配置 */
21
+ groupConfig?: Partial<TypingIndicatorConfig>;
22
+ }
23
+ export declare class ICQQTypingIndicatorManager {
24
+ private manager;
25
+ private config;
26
+ private bot;
27
+ constructor(bot: IcqqBot, config?: Partial<ICQQTypingIndicatorConfig>);
28
+ /**
29
+ * 注册 ICQQ 适配器
30
+ */
31
+ private registerAdapter;
32
+ /** 当前提示选项(用于 sendMessage 回调) */
33
+ private currentOptions?;
34
+ /**
35
+ * 开始提示
36
+ */
37
+ start(options: {
38
+ messageId?: string;
39
+ sessionId: string;
40
+ userId?: string;
41
+ groupId?: string;
42
+ sceneType: 'private' | 'group';
43
+ }): Promise<TypingIndicator>;
44
+ /**
45
+ * 停止提示
46
+ */
47
+ stop(options: {
48
+ sessionId: string;
49
+ userId?: string;
50
+ groupId?: string;
51
+ }): Promise<void>;
52
+ /**
53
+ * 停止所有提示
54
+ */
55
+ stopAll(): Promise<void>;
56
+ /**
57
+ * 更新配置
58
+ */
59
+ updateConfig(config: Partial<ICQQTypingIndicatorConfig>): void;
60
+ /**
61
+ * 获取配置
62
+ */
63
+ getConfig(): ICQQTypingIndicatorConfig;
64
+ }
65
+ /**
66
+ * 为 ICQQ Bot 创建 Typing Indicator 管理器
67
+ */
68
+ export declare function createICQQTypingIndicatorManager(bot: IcqqBot, config?: Partial<ICQQTypingIndicatorConfig>): ICQQTypingIndicatorManager;
69
+ /**
70
+ * 快速开始提示
71
+ */
72
+ export declare function startICQQTypingIndicator(bot: IcqqBot, options: {
73
+ messageId?: string;
74
+ sessionId: string;
75
+ userId?: string;
76
+ groupId?: string;
77
+ sceneType: 'private' | 'group';
78
+ }, config?: Partial<ICQQTypingIndicatorConfig>): Promise<TypingIndicator>;
79
+ declare module './bot.js' {
80
+ interface IcqqBot {
81
+ /** Typing Indicator 管理器 */
82
+ $typingIndicator?: ICQQTypingIndicatorManager;
83
+ }
84
+ }
85
+ /**
86
+ * 为 IcqqBot 添加 Typing Indicator 支持
87
+ */
88
+ export declare function enableTypingIndicator(bot: IcqqBot, config?: Partial<ICQQTypingIndicatorConfig>): ICQQTypingIndicatorManager;
89
+ //# sourceMappingURL=typing-indicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-indicator.d.ts","sourceRoot":"","sources":["../src/typing-indicator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,yBAAyB;IACxC,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,aAAa,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC/C,WAAW;IACX,WAAW,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAC9C;AAuBD,qBAAa,0BAA0B;IACrC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,GAAG,CAAU;gBAET,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,OAAO,CAAC,yBAAyB,CAAM;IAgBzE;;OAEG;IACH,OAAO,CAAC,eAAe;IA6EvB,gCAAgC;IAChC,OAAO,CAAC,cAAc,CAAC,CAMrB;IAEF;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;KAChC,GAAG,OAAO,CAAC,eAAe,CAAC;IAuD5B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBjB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAAG,IAAI;IAI9D;;OAEG;IACH,SAAS,IAAI,yBAAyB;CAGvC;AAID;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,OAAO,EACZ,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAC1C,0BAA0B,CAE5B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;CAChC,EACD,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAC1C,OAAO,CAAC,eAAe,CAAC,CAG1B;AAID,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,OAAO;QACf,2BAA2B;QAC3B,gBAAgB,CAAC,EAAE,0BAA0B,CAAC;KAC/C;CACF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,EACZ,MAAM,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,GAC1C,0BAA0B,CAK5B"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * ICQQ Typing Indicator 集成
3
+ *
4
+ * 为 ICQQ 适配器提供消息处理状态提示功能,
5
+ * 使用消息回应(表情)来提示用户"AI 正在处理"。
6
+ */
7
+ import { TypingIndicatorManager, ReactionTypingIndicatorAdapter, } from '@zhin.js/agent';
8
+ const DEFAULT_ICQQ_CONFIG = {
9
+ enabled: true,
10
+ defaultEmoji: '⏳',
11
+ autoRemove: true,
12
+ removeDelay: 5000,
13
+ privateConfig: {
14
+ type: 'message',
15
+ message: '正在思考中...',
16
+ autoRemove: true,
17
+ removeDelay: 3000,
18
+ },
19
+ groupConfig: {
20
+ type: 'reaction',
21
+ emoji: '⏳',
22
+ autoRemove: true,
23
+ removeDelay: 5000,
24
+ },
25
+ };
26
+ // ── ICQQ Typing Indicator 管理器 ─────────────────────────────────────
27
+ export class ICQQTypingIndicatorManager {
28
+ manager;
29
+ config;
30
+ bot;
31
+ constructor(bot, config = {}) {
32
+ this.bot = bot;
33
+ this.config = { ...DEFAULT_ICQQ_CONFIG, ...config };
34
+ // 创建 Typing Indicator 管理器
35
+ this.manager = new TypingIndicatorManager({
36
+ type: 'reaction',
37
+ emoji: this.config.defaultEmoji,
38
+ autoRemove: this.config.autoRemove,
39
+ removeDelay: this.config.removeDelay,
40
+ });
41
+ // 注册 ICQQ 适配器
42
+ this.registerAdapter();
43
+ }
44
+ /**
45
+ * 注册 ICQQ 适配器
46
+ */
47
+ registerAdapter() {
48
+ const adapter = new ReactionTypingIndicatorAdapter(
49
+ // addReaction
50
+ async (messageId, emoji) => {
51
+ return await this.bot.$addReaction(messageId, emoji);
52
+ },
53
+ // removeReaction
54
+ async (messageId, reactionId) => {
55
+ await this.bot.$removeReaction(messageId, reactionId);
56
+ },
57
+ // sendMessage
58
+ async (sessionId, content) => {
59
+ try {
60
+ // 从存储的选项中获取场景信息
61
+ const options = this.currentOptions;
62
+ if (!options) {
63
+ this.bot.logger.error('[ICQQ:TypingIndicator] No current options for typing indicator');
64
+ return null;
65
+ }
66
+ this.bot.logger.debug('[ICQQ:TypingIndicator] sendMessage called', {
67
+ sessionId,
68
+ content,
69
+ sceneType: options.sceneType,
70
+ groupId: options.groupId,
71
+ userId: options.userId,
72
+ });
73
+ // 根据场景类型发送消息
74
+ if (options.sceneType === 'group' && options.groupId) {
75
+ this.bot.logger.debug('[ICQQ:TypingIndicator] sending group message', {
76
+ groupId: options.groupId,
77
+ });
78
+ return await this.bot.$sendMessage({
79
+ type: 'group',
80
+ id: options.groupId,
81
+ context: 'icqq',
82
+ bot: this.bot.$id,
83
+ content: [{ type: 'text', data: { text: content } }],
84
+ });
85
+ }
86
+ else if (options.userId) {
87
+ this.bot.logger.debug('[ICQQ:TypingIndicator] sending private message', {
88
+ userId: options.userId,
89
+ });
90
+ return await this.bot.$sendMessage({
91
+ type: 'private',
92
+ id: options.userId,
93
+ context: 'icqq',
94
+ bot: this.bot.$id,
95
+ content: [{ type: 'text', data: { text: content } }],
96
+ });
97
+ }
98
+ this.bot.logger.debug('[ICQQ:TypingIndicator] no valid target', {
99
+ sceneType: options.sceneType,
100
+ groupId: options.groupId,
101
+ userId: options.userId,
102
+ });
103
+ return null;
104
+ }
105
+ catch (error) {
106
+ this.bot.logger.error('[ICQQ:TypingIndicator] Failed to send typing message:', error);
107
+ return null;
108
+ }
109
+ },
110
+ // deleteMessage
111
+ async (messageId) => {
112
+ try {
113
+ await this.bot.$recallMessage(messageId);
114
+ }
115
+ catch (error) {
116
+ this.bot.logger.error('[ICQQ:TypingIndicator] Failed to delete typing message:', error);
117
+ }
118
+ });
119
+ this.manager.registerAdapter(adapter);
120
+ }
121
+ /** 当前提示选项(用于 sendMessage 回调) */
122
+ currentOptions;
123
+ /**
124
+ * 开始提示
125
+ */
126
+ async start(options) {
127
+ this.bot.logger.debug('[ICQQ:TypingIndicator] start called', {
128
+ enabled: this.config.enabled,
129
+ sceneType: options.sceneType,
130
+ messageId: options.messageId,
131
+ sessionId: options.sessionId,
132
+ userId: options.userId,
133
+ groupId: options.groupId,
134
+ });
135
+ if (!this.config.enabled) {
136
+ this.bot.logger.debug('[ICQQ:TypingIndicator] disabled, returning noop');
137
+ return {
138
+ start: async () => { },
139
+ stop: async () => { },
140
+ isActive: () => false,
141
+ };
142
+ }
143
+ // 保存当前选项(用于 sendMessage 回调)
144
+ this.currentOptions = options;
145
+ // 根据场景类型选择配置
146
+ const config = options.sceneType === 'group'
147
+ ? this.config.groupConfig
148
+ : this.config.privateConfig;
149
+ this.bot.logger.debug('[ICQQ:TypingIndicator] using config', {
150
+ sceneType: options.sceneType,
151
+ configType: config?.type,
152
+ configEmoji: config?.emoji,
153
+ configMessage: config?.message,
154
+ });
155
+ const typingOptions = {
156
+ messageId: options.messageId,
157
+ sessionId: options.sessionId,
158
+ userId: options.userId,
159
+ groupId: options.groupId,
160
+ platform: 'icqq',
161
+ botId: this.bot.$id,
162
+ sceneType: options.sceneType,
163
+ };
164
+ this.bot.logger.debug('[ICQQ:TypingIndicator] starting manager', typingOptions);
165
+ const result = await this.manager.start(typingOptions, config);
166
+ this.bot.logger.debug('[ICQQ:TypingIndicator] started', {
167
+ isActive: result.isActive(),
168
+ });
169
+ return result;
170
+ }
171
+ /**
172
+ * 停止提示
173
+ */
174
+ async stop(options) {
175
+ this.bot.logger.debug('[ICQQ:TypingIndicator] stop called', {
176
+ sessionId: options.sessionId,
177
+ userId: options.userId,
178
+ groupId: options.groupId,
179
+ });
180
+ const typingOptions = {
181
+ sessionId: options.sessionId,
182
+ userId: options.userId,
183
+ groupId: options.groupId,
184
+ platform: 'icqq',
185
+ botId: this.bot.$id,
186
+ sceneType: 'private', // 默认值,实际会根据 sessionId 判断
187
+ };
188
+ await this.manager.stop(typingOptions);
189
+ // 清除当前选项
190
+ this.currentOptions = undefined;
191
+ this.bot.logger.debug('[ICQQ:TypingIndicator] stopped');
192
+ }
193
+ /**
194
+ * 停止所有提示
195
+ */
196
+ async stopAll() {
197
+ this.bot.logger.debug('[ICQQ:TypingIndicator] stopAll called');
198
+ await this.manager.stopAll();
199
+ this.bot.logger.debug('[ICQQ:TypingIndicator] stopAll completed');
200
+ }
201
+ /**
202
+ * 更新配置
203
+ */
204
+ updateConfig(config) {
205
+ this.config = { ...this.config, ...config };
206
+ }
207
+ /**
208
+ * 获取配置
209
+ */
210
+ getConfig() {
211
+ return { ...this.config };
212
+ }
213
+ }
214
+ // ── 便捷函数 ──────────────────────────────────────────────────────────
215
+ /**
216
+ * 为 ICQQ Bot 创建 Typing Indicator 管理器
217
+ */
218
+ export function createICQQTypingIndicatorManager(bot, config) {
219
+ return new ICQQTypingIndicatorManager(bot, config);
220
+ }
221
+ /**
222
+ * 快速开始提示
223
+ */
224
+ export async function startICQQTypingIndicator(bot, options, config) {
225
+ const manager = createICQQTypingIndicatorManager(bot, config);
226
+ return await manager.start(options);
227
+ }
228
+ /**
229
+ * 为 IcqqBot 添加 Typing Indicator 支持
230
+ */
231
+ export function enableTypingIndicator(bot, config) {
232
+ if (!bot.$typingIndicator) {
233
+ bot.$typingIndicator = createICQQTypingIndicatorManager(bot, config);
234
+ }
235
+ return bot.$typingIndicator;
236
+ }
237
+ //# sourceMappingURL=typing-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typing-indicator.js","sourceRoot":"","sources":["../src/typing-indicator.ts"],"names":[],"mappings":"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"}