@zhin.js/adapter-icqq 3.0.4 → 3.0.6
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/CHANGELOG.md +106 -78
- package/README.md +3 -3
- package/client/index.tsx +1 -1
- package/client/tsconfig.json +1 -1
- package/dist/index.js +1 -1
- package/lib/bot.d.ts +56 -12
- package/lib/bot.d.ts.map +1 -1
- package/lib/bot.js +416 -136
- package/lib/bot.js.map +1 -1
- package/lib/cq-message.d.ts +10 -0
- package/lib/cq-message.d.ts.map +1 -0
- package/lib/cq-message.js +119 -0
- package/lib/cq-message.js.map +1 -0
- package/lib/forward-msg.d.ts +27 -0
- package/lib/forward-msg.d.ts.map +1 -0
- package/lib/forward-msg.js +387 -0
- package/lib/forward-msg.js.map +1 -0
- package/lib/get-msg.d.ts +3 -0
- package/lib/get-msg.d.ts.map +1 -0
- package/lib/get-msg.js +46 -0
- package/lib/get-msg.js.map +1 -0
- package/lib/icqq-inbound.d.ts +114 -0
- package/lib/icqq-inbound.d.ts.map +1 -0
- package/lib/icqq-inbound.js +495 -0
- package/lib/icqq-inbound.js.map +1 -0
- package/lib/icqq-side-events.d.ts +34 -0
- package/lib/icqq-side-events.d.ts.map +1 -0
- package/lib/icqq-side-events.js +194 -0
- package/lib/icqq-side-events.js.map +1 -0
- package/lib/index.d.ts +4 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/ipc-client.d.ts +7 -2
- package/lib/ipc-client.d.ts.map +1 -1
- package/lib/ipc-client.js +74 -16
- package/lib/ipc-client.js.map +1 -1
- package/lib/protocol.d.ts +3 -10
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +2 -0
- package/lib/protocol.js.map +1 -1
- package/lib/routes.d.ts +1 -1
- package/lib/routes.d.ts.map +1 -1
- package/lib/types.d.ts +44 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/typing-indicator-example.d.ts +108 -0
- package/lib/typing-indicator-example.d.ts.map +1 -0
- package/lib/typing-indicator-example.js +220 -0
- package/lib/typing-indicator-example.js.map +1 -0
- package/lib/typing-indicator.d.ts +87 -0
- package/lib/typing-indicator.d.ts.map +1 -0
- package/lib/typing-indicator.js +225 -0
- package/lib/typing-indicator.js.map +1 -0
- package/package.json +18 -12
- package/src/bot.ts +524 -149
- package/src/cq-message.ts +120 -0
- package/src/forward-msg.ts +433 -0
- package/src/get-msg.ts +56 -0
- package/src/icqq-inbound.ts +616 -0
- package/src/icqq-side-events.ts +228 -0
- package/src/index.ts +10 -2
- package/src/ipc-client.ts +76 -16
- package/src/protocol.ts +4 -10
- package/src/routes.ts +1 -1
- package/src/types.ts +45 -0
- package/src/typing-indicator-example.ts +269 -0
- package/src/typing-indicator.ts +312 -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":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
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
|
+
/**
|
|
33
|
+
* 开始提示
|
|
34
|
+
*/
|
|
35
|
+
start(options: {
|
|
36
|
+
messageId?: string;
|
|
37
|
+
sessionId: string;
|
|
38
|
+
userId?: string;
|
|
39
|
+
groupId?: string;
|
|
40
|
+
sceneType: 'private' | 'group';
|
|
41
|
+
}): Promise<TypingIndicator>;
|
|
42
|
+
/**
|
|
43
|
+
* 停止提示
|
|
44
|
+
*/
|
|
45
|
+
stop(options: {
|
|
46
|
+
sessionId: string;
|
|
47
|
+
userId?: string;
|
|
48
|
+
groupId?: string;
|
|
49
|
+
}): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* 停止所有提示
|
|
52
|
+
*/
|
|
53
|
+
stopAll(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* 更新配置
|
|
56
|
+
*/
|
|
57
|
+
updateConfig(config: Partial<ICQQTypingIndicatorConfig>): void;
|
|
58
|
+
/**
|
|
59
|
+
* 获取配置
|
|
60
|
+
*/
|
|
61
|
+
getConfig(): ICQQTypingIndicatorConfig;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 为 ICQQ Bot 创建 Typing Indicator 管理器
|
|
65
|
+
*/
|
|
66
|
+
export declare function createICQQTypingIndicatorManager(bot: IcqqBot, config?: Partial<ICQQTypingIndicatorConfig>): ICQQTypingIndicatorManager;
|
|
67
|
+
/**
|
|
68
|
+
* 快速开始提示
|
|
69
|
+
*/
|
|
70
|
+
export declare function startICQQTypingIndicator(bot: IcqqBot, options: {
|
|
71
|
+
messageId?: string;
|
|
72
|
+
sessionId: string;
|
|
73
|
+
userId?: string;
|
|
74
|
+
groupId?: string;
|
|
75
|
+
sceneType: 'private' | 'group';
|
|
76
|
+
}, config?: Partial<ICQQTypingIndicatorConfig>): Promise<TypingIndicator>;
|
|
77
|
+
declare module './bot.js' {
|
|
78
|
+
interface IcqqBot {
|
|
79
|
+
/** Typing Indicator 管理器 */
|
|
80
|
+
$typingIndicator?: ICQQTypingIndicatorManager;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 为 IcqqBot 添加 Typing Indicator 支持
|
|
85
|
+
*/
|
|
86
|
+
export declare function enableTypingIndicator(bot: IcqqBot, config?: Partial<ICQQTypingIndicatorConfig>): ICQQTypingIndicatorManager;
|
|
87
|
+
//# 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;IAsEvB;;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;IAoD5B;;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;IAqBjB;;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,225 @@
|
|
|
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 (options, content) => {
|
|
59
|
+
try {
|
|
60
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] sendMessage called', {
|
|
61
|
+
sessionId: options.sessionId,
|
|
62
|
+
content,
|
|
63
|
+
sceneType: options.sceneType,
|
|
64
|
+
groupId: options.groupId,
|
|
65
|
+
userId: options.userId,
|
|
66
|
+
});
|
|
67
|
+
// 根据场景类型发送消息
|
|
68
|
+
if (options.sceneType === 'group' && options.groupId) {
|
|
69
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] sending group message', {
|
|
70
|
+
groupId: options.groupId,
|
|
71
|
+
});
|
|
72
|
+
return await this.bot.$sendMessage({
|
|
73
|
+
type: 'group',
|
|
74
|
+
id: options.groupId,
|
|
75
|
+
context: 'icqq',
|
|
76
|
+
bot: this.bot.$id,
|
|
77
|
+
content: [{ type: 'text', data: { text: content } }],
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else if (options.userId) {
|
|
81
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] sending private message', {
|
|
82
|
+
userId: options.userId,
|
|
83
|
+
});
|
|
84
|
+
return await this.bot.$sendMessage({
|
|
85
|
+
type: 'private',
|
|
86
|
+
id: options.userId,
|
|
87
|
+
context: 'icqq',
|
|
88
|
+
bot: this.bot.$id,
|
|
89
|
+
content: [{ type: 'text', data: { text: content } }],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] no valid target', {
|
|
93
|
+
sceneType: options.sceneType,
|
|
94
|
+
groupId: options.groupId,
|
|
95
|
+
userId: options.userId,
|
|
96
|
+
});
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
this.bot.logger.error('[ICQQ:TypingIndicator] Failed to send typing message:', error);
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
// deleteMessage
|
|
105
|
+
async (messageId) => {
|
|
106
|
+
try {
|
|
107
|
+
await this.bot.$recallMessage(messageId);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this.bot.logger.error('[ICQQ:TypingIndicator] Failed to delete typing message:', error);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
this.manager.registerAdapter(adapter);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 开始提示
|
|
117
|
+
*/
|
|
118
|
+
async start(options) {
|
|
119
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] start called', {
|
|
120
|
+
enabled: this.config.enabled,
|
|
121
|
+
sceneType: options.sceneType,
|
|
122
|
+
messageId: options.messageId,
|
|
123
|
+
sessionId: options.sessionId,
|
|
124
|
+
userId: options.userId,
|
|
125
|
+
groupId: options.groupId,
|
|
126
|
+
});
|
|
127
|
+
if (!this.config.enabled) {
|
|
128
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] disabled, returning noop');
|
|
129
|
+
return {
|
|
130
|
+
start: async () => { },
|
|
131
|
+
stop: async () => { },
|
|
132
|
+
isActive: () => false,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
// 根据场景类型选择配置
|
|
136
|
+
const config = options.sceneType === 'group'
|
|
137
|
+
? this.config.groupConfig
|
|
138
|
+
: this.config.privateConfig;
|
|
139
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] using config', {
|
|
140
|
+
sceneType: options.sceneType,
|
|
141
|
+
configType: config?.type,
|
|
142
|
+
configEmoji: config?.emoji,
|
|
143
|
+
configMessage: config?.message,
|
|
144
|
+
});
|
|
145
|
+
const typingOptions = {
|
|
146
|
+
messageId: options.messageId,
|
|
147
|
+
sessionId: options.sessionId,
|
|
148
|
+
userId: options.userId,
|
|
149
|
+
groupId: options.groupId,
|
|
150
|
+
platform: 'icqq',
|
|
151
|
+
botId: this.bot.$id,
|
|
152
|
+
sceneType: options.sceneType,
|
|
153
|
+
};
|
|
154
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] starting manager', typingOptions);
|
|
155
|
+
const result = await this.manager.start(typingOptions, config);
|
|
156
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] started', {
|
|
157
|
+
isActive: result.isActive(),
|
|
158
|
+
});
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 停止提示
|
|
163
|
+
*/
|
|
164
|
+
async stop(options) {
|
|
165
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] stop called', {
|
|
166
|
+
sessionId: options.sessionId,
|
|
167
|
+
userId: options.userId,
|
|
168
|
+
groupId: options.groupId,
|
|
169
|
+
});
|
|
170
|
+
const typingOptions = {
|
|
171
|
+
sessionId: options.sessionId,
|
|
172
|
+
userId: options.userId,
|
|
173
|
+
groupId: options.groupId,
|
|
174
|
+
platform: 'icqq',
|
|
175
|
+
botId: this.bot.$id,
|
|
176
|
+
sceneType: 'private', // 默认值,实际会根据 sessionId 判断
|
|
177
|
+
};
|
|
178
|
+
await this.manager.stop(typingOptions);
|
|
179
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] stopped');
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* 停止所有提示
|
|
183
|
+
*/
|
|
184
|
+
async stopAll() {
|
|
185
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] stopAll called');
|
|
186
|
+
await this.manager.stopAll();
|
|
187
|
+
this.bot.logger.debug('[ICQQ:TypingIndicator] stopAll completed');
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* 更新配置
|
|
191
|
+
*/
|
|
192
|
+
updateConfig(config) {
|
|
193
|
+
this.config = { ...this.config, ...config };
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* 获取配置
|
|
197
|
+
*/
|
|
198
|
+
getConfig() {
|
|
199
|
+
return { ...this.config };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ── 便捷函数 ──────────────────────────────────────────────────────────
|
|
203
|
+
/**
|
|
204
|
+
* 为 ICQQ Bot 创建 Typing Indicator 管理器
|
|
205
|
+
*/
|
|
206
|
+
export function createICQQTypingIndicatorManager(bot, config) {
|
|
207
|
+
return new ICQQTypingIndicatorManager(bot, config);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* 快速开始提示
|
|
211
|
+
*/
|
|
212
|
+
export async function startICQQTypingIndicator(bot, options, config) {
|
|
213
|
+
const manager = createICQQTypingIndicatorManager(bot, config);
|
|
214
|
+
return await manager.start(options);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* 为 IcqqBot 添加 Typing Indicator 支持
|
|
218
|
+
*/
|
|
219
|
+
export function enableTypingIndicator(bot, config) {
|
|
220
|
+
if (!bot.$typingIndicator) {
|
|
221
|
+
bot.$typingIndicator = createICQQTypingIndicatorManager(bot, config);
|
|
222
|
+
}
|
|
223
|
+
return bot.$typingIndicator;
|
|
224
|
+
}
|
|
225
|
+
//# 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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"}
|