@tencent-connect/openclaw-qqbot 1.7.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -8
- package/README.zh.md +24 -8
- package/bin/qqbot-cli.js +5 -2
- package/dist/index.cjs +15549 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +890 -0
- package/index.ts +56 -19
- package/openclaw.plugin.json +19 -3
- package/package.json +14 -23
- package/preload.cjs +17 -14
- package/scripts/link-sdk-core.cjs +133 -50
- package/scripts/upgrade-via-npm.sh +42 -11
- package/scripts/upgrade-via-source.sh +4 -4
- package/skills/qqbot-channel/SKILL.md +34 -12
- package/src/adapter/contract.ts +69 -0
- package/src/adapter/gateway.ts +61 -0
- package/src/adapter/index.ts +15 -0
- package/src/adapter/lint.ts +144 -0
- package/src/adapter/media.ts +112 -0
- package/src/adapter/pairing.ts +99 -0
- package/src/adapter/resolve.ts +333 -0
- package/src/adapter/setup.ts +55 -0
- package/src/adapter/webhook.ts +248 -0
- package/src/adapter/workspace.ts +29 -0
- package/src/bot-instance.ts +60 -0
- package/src/channel.ts +202 -413
- package/src/commands/bot-approve.ts +143 -0
- package/src/commands/bot-clear-storage.ts +114 -0
- package/src/commands/bot-group-always.ts +62 -0
- package/src/commands/bot-help.ts +40 -0
- package/src/commands/bot-logs.ts +248 -0
- package/src/commands/bot-me.ts +18 -0
- package/src/commands/bot-pairing.ts +57 -0
- package/src/commands/bot-ping.ts +33 -0
- package/src/commands/bot-streaming.ts +55 -0
- package/src/commands/bot-upgrade.ts +56 -0
- package/src/commands/bot-version.ts +41 -0
- package/src/commands/config-util.ts +96 -0
- package/src/commands/index.ts +49 -0
- package/src/config.ts +46 -19
- package/src/dispatch/body-assembler.ts +356 -0
- package/src/dispatch/ctx-builder.ts +110 -0
- package/src/dispatch/dispatch.ts +352 -0
- package/src/dispatch/envelope-builder.ts +112 -0
- package/src/dispatch/index.ts +2 -0
- package/src/{approval-handler.ts → features/approval-handler.ts} +40 -94
- package/src/features/approval-utils.ts +41 -0
- package/src/features/credential-backup.ts +82 -0
- package/src/features/history-store.ts +19 -0
- package/src/features/msgid-cache.ts +55 -0
- package/src/features/onboarding.ts +38 -0
- package/src/{proactive.ts → features/proactive.ts} +68 -49
- package/src/features/ref-index-store.ts +282 -0
- package/src/{update-checker.ts → features/update-checker.ts} +15 -35
- package/src/gateway/event-handlers.ts +241 -0
- package/src/gateway/index.ts +3 -0
- package/src/gateway/lifecycle.ts +221 -0
- package/src/gateway/middleware-setup.ts +139 -0
- package/src/gateway/qqbot-gateway.ts +342 -0
- package/src/middleware/access-control.ts +130 -0
- package/src/middleware/attachment.ts +314 -0
- package/src/middleware/policy-injector.ts +66 -0
- package/src/openclaw-plugin-sdk.d.ts +81 -10
- package/src/outbound/cron-scheduler.ts +130 -0
- package/src/outbound/debounce.ts +102 -0
- package/src/outbound/deliver-pipeline.ts +235 -0
- package/src/outbound/image-size.ts +123 -0
- package/src/outbound/index.ts +3 -0
- package/src/outbound/local-file-router.ts +145 -0
- package/src/outbound/media-send.ts +377 -0
- package/src/outbound/outbound-service.ts +222 -0
- package/src/outbound/reply-limiter.ts +128 -0
- package/src/outbound/sanitize.ts +32 -0
- package/src/outbound/streaming-controller.ts +228 -0
- package/src/outbound/target.ts +63 -0
- package/src/outbound/tts-provider.ts +84 -0
- package/src/request-context.ts +9 -8
- package/src/runtime.ts +31 -6
- package/src/setup/account-key.ts +41 -0
- package/src/setup/finalize.ts +110 -0
- package/src/setup/login.ts +197 -0
- package/src/setup/surface.ts +40 -0
- package/src/tools/platform.ts +149 -0
- package/src/tools/remind.ts +2 -0
- package/src/types-augment.d.ts +54 -0
- package/src/types.ts +51 -9
- package/src/utils/mention.ts +52 -0
- package/src/utils/pkg-version.ts +84 -47
- package/src/utils/platform.ts +31 -7
- package/src/utils/plugin-logger.ts +104 -0
- package/src/utils/ssrf-guard.ts +32 -2
- package/src/utils/stt.ts +137 -0
- package/src/utils/voice-text.ts +61 -0
- package/tsconfig.json +2 -1
- package/tsup.config.ts +57 -0
- package/dist/index.d.ts +0 -18
- package/dist/index.js +0 -27
- package/dist/src/admin-resolver.d.ts +0 -33
- package/dist/src/admin-resolver.js +0 -157
- package/dist/src/api.d.ts +0 -309
- package/dist/src/api.js +0 -923
- package/dist/src/approval-handler.d.ts +0 -47
- package/dist/src/approval-handler.js +0 -372
- package/dist/src/channel.d.ts +0 -29
- package/dist/src/channel.js +0 -528
- package/dist/src/config.d.ts +0 -60
- package/dist/src/config.js +0 -288
- package/dist/src/credential-backup.d.ts +0 -31
- package/dist/src/credential-backup.js +0 -66
- package/dist/src/deliver-debounce.d.ts +0 -74
- package/dist/src/deliver-debounce.js +0 -174
- package/dist/src/gateway.d.ts +0 -18
- package/dist/src/gateway.js +0 -2025
- package/dist/src/group-history.d.ts +0 -136
- package/dist/src/group-history.js +0 -226
- package/dist/src/image-server.d.ts +0 -87
- package/dist/src/image-server.js +0 -570
- package/dist/src/inbound-attachments.d.ts +0 -60
- package/dist/src/inbound-attachments.js +0 -248
- package/dist/src/known-users.d.ts +0 -100
- package/dist/src/known-users.js +0 -263
- package/dist/src/message-gating.d.ts +0 -53
- package/dist/src/message-gating.js +0 -107
- package/dist/src/message-queue.d.ts +0 -91
- package/dist/src/message-queue.js +0 -257
- package/dist/src/onboarding.d.ts +0 -10
- package/dist/src/onboarding.js +0 -203
- package/dist/src/outbound-deliver.d.ts +0 -48
- package/dist/src/outbound-deliver.js +0 -392
- package/dist/src/outbound.d.ts +0 -220
- package/dist/src/outbound.js +0 -975
- package/dist/src/proactive.d.ts +0 -170
- package/dist/src/proactive.js +0 -399
- package/dist/src/ref-index-store.d.ts +0 -101
- package/dist/src/ref-index-store.js +0 -298
- package/dist/src/reply-dispatcher.d.ts +0 -35
- package/dist/src/reply-dispatcher.js +0 -311
- package/dist/src/request-context.d.ts +0 -25
- package/dist/src/request-context.js +0 -37
- package/dist/src/runtime.d.ts +0 -3
- package/dist/src/runtime.js +0 -13
- package/dist/src/session-store.d.ts +0 -52
- package/dist/src/session-store.js +0 -254
- package/dist/src/slash-commands.d.ts +0 -82
- package/dist/src/slash-commands.js +0 -2233
- package/dist/src/startup-greeting.d.ts +0 -30
- package/dist/src/startup-greeting.js +0 -97
- package/dist/src/streaming.d.ts +0 -247
- package/dist/src/streaming.js +0 -899
- package/dist/src/stt.d.ts +0 -21
- package/dist/src/stt.js +0 -70
- package/dist/src/tools/channel.d.ts +0 -16
- package/dist/src/tools/channel.js +0 -231
- package/dist/src/tools/remind.d.ts +0 -2
- package/dist/src/tools/remind.js +0 -255
- package/dist/src/transport/index.d.ts +0 -10
- package/dist/src/transport/index.js +0 -9
- package/dist/src/transport/webhook-transport.d.ts +0 -67
- package/dist/src/transport/webhook-transport.js +0 -245
- package/dist/src/transport/webhook-verify.d.ts +0 -48
- package/dist/src/transport/webhook-verify.js +0 -98
- package/dist/src/types.d.ts +0 -462
- package/dist/src/types.js +0 -22
- package/dist/src/typing-keepalive.d.ts +0 -27
- package/dist/src/typing-keepalive.js +0 -64
- package/dist/src/update-checker.d.ts +0 -36
- package/dist/src/update-checker.js +0 -171
- package/dist/src/utils/audio-convert.d.ts +0 -98
- package/dist/src/utils/audio-convert.js +0 -783
- package/dist/src/utils/chunked-upload.d.ts +0 -68
- package/dist/src/utils/chunked-upload.js +0 -341
- package/dist/src/utils/file-utils.d.ts +0 -61
- package/dist/src/utils/file-utils.js +0 -172
- package/dist/src/utils/image-size.d.ts +0 -51
- package/dist/src/utils/image-size.js +0 -234
- package/dist/src/utils/media-send.d.ts +0 -158
- package/dist/src/utils/media-send.js +0 -502
- package/dist/src/utils/media-tags.d.ts +0 -14
- package/dist/src/utils/media-tags.js +0 -165
- package/dist/src/utils/payload.d.ts +0 -112
- package/dist/src/utils/payload.js +0 -186
- package/dist/src/utils/pkg-version.d.ts +0 -5
- package/dist/src/utils/pkg-version.js +0 -61
- package/dist/src/utils/platform.d.ts +0 -137
- package/dist/src/utils/platform.js +0 -390
- package/dist/src/utils/ssrf-guard.d.ts +0 -25
- package/dist/src/utils/ssrf-guard.js +0 -91
- package/dist/src/utils/text-parsing.d.ts +0 -31
- package/dist/src/utils/text-parsing.js +0 -74
- package/dist/src/utils/upload-cache.d.ts +0 -34
- package/dist/src/utils/upload-cache.js +0 -93
- package/node_modules/@eshaz/web-worker/LICENSE +0 -201
- package/node_modules/@eshaz/web-worker/README.md +0 -134
- package/node_modules/@eshaz/web-worker/browser.js +0 -17
- package/node_modules/@eshaz/web-worker/cjs/browser.js +0 -16
- package/node_modules/@eshaz/web-worker/cjs/node.js +0 -219
- package/node_modules/@eshaz/web-worker/index.d.ts +0 -4
- package/node_modules/@eshaz/web-worker/node.js +0 -223
- package/node_modules/@eshaz/web-worker/package.json +0 -54
- package/node_modules/@wasm-audio-decoders/common/index.js +0 -5
- package/node_modules/@wasm-audio-decoders/common/package.json +0 -36
- package/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderCommon.js +0 -231
- package/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderWorker.js +0 -129
- package/node_modules/@wasm-audio-decoders/common/src/puff/README +0 -67
- package/node_modules/@wasm-audio-decoders/common/src/puff/build_puff.js +0 -31
- package/node_modules/@wasm-audio-decoders/common/src/puff/puff.c +0 -863
- package/node_modules/@wasm-audio-decoders/common/src/puff/puff.h +0 -35
- package/node_modules/@wasm-audio-decoders/common/src/utilities.js +0 -3
- package/node_modules/@wasm-audio-decoders/common/types.d.ts +0 -7
- package/node_modules/mpg123-decoder/README.md +0 -265
- package/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js +0 -185
- package/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js.map +0 -1
- package/node_modules/mpg123-decoder/index.js +0 -8
- package/node_modules/mpg123-decoder/package.json +0 -58
- package/node_modules/mpg123-decoder/src/EmscriptenWasm.js +0 -464
- package/node_modules/mpg123-decoder/src/MPEGDecoder.js +0 -200
- package/node_modules/mpg123-decoder/src/MPEGDecoderWebWorker.js +0 -21
- package/node_modules/mpg123-decoder/types.d.ts +0 -30
- package/node_modules/silk-wasm/LICENSE +0 -21
- package/node_modules/silk-wasm/README.md +0 -85
- package/node_modules/silk-wasm/lib/index.cjs +0 -16
- package/node_modules/silk-wasm/lib/index.d.ts +0 -70
- package/node_modules/silk-wasm/lib/index.mjs +0 -16
- package/node_modules/silk-wasm/lib/silk.wasm +0 -0
- package/node_modules/silk-wasm/lib/utils.d.ts +0 -4
- package/node_modules/silk-wasm/package.json +0 -39
- package/node_modules/simple-yenc/.github/FUNDING.yml +0 -1
- package/node_modules/simple-yenc/.prettierignore +0 -1
- package/node_modules/simple-yenc/LICENSE +0 -7
- package/node_modules/simple-yenc/README.md +0 -163
- package/node_modules/simple-yenc/dist/esm.js +0 -1
- package/node_modules/simple-yenc/dist/index.js +0 -1
- package/node_modules/simple-yenc/package.json +0 -50
- package/node_modules/simple-yenc/rollup.config.js +0 -27
- package/node_modules/simple-yenc/src/simple-yenc.js +0 -302
- package/node_modules/ws/LICENSE +0 -20
- package/node_modules/ws/README.md +0 -548
- package/node_modules/ws/browser.js +0 -8
- package/node_modules/ws/index.js +0 -13
- package/node_modules/ws/lib/buffer-util.js +0 -131
- package/node_modules/ws/lib/constants.js +0 -19
- package/node_modules/ws/lib/event-target.js +0 -292
- package/node_modules/ws/lib/extension.js +0 -203
- package/node_modules/ws/lib/limiter.js +0 -55
- package/node_modules/ws/lib/permessage-deflate.js +0 -528
- package/node_modules/ws/lib/receiver.js +0 -706
- package/node_modules/ws/lib/sender.js +0 -602
- package/node_modules/ws/lib/stream.js +0 -161
- package/node_modules/ws/lib/subprotocol.js +0 -62
- package/node_modules/ws/lib/validation.js +0 -152
- package/node_modules/ws/lib/websocket-server.js +0 -554
- package/node_modules/ws/lib/websocket.js +0 -1393
- package/node_modules/ws/package.json +0 -69
- package/node_modules/ws/wrapper.mjs +0 -8
- package/scripts/postinstall-link-sdk.js +0 -170
- package/skills/qqbot-media/SKILL.md +0 -60
- package/src/admin-resolver.ts +0 -181
- package/src/api.ts +0 -1333
- package/src/credential-backup.ts +0 -72
- package/src/deliver-debounce.ts +0 -229
- package/src/gateway.ts +0 -2272
- package/src/group-history.ts +0 -328
- package/src/image-server.ts +0 -675
- package/src/inbound-attachments.ts +0 -321
- package/src/known-users.ts +0 -353
- package/src/message-gating.ts +0 -190
- package/src/message-queue.ts +0 -354
- package/src/onboarding.ts +0 -282
- package/src/outbound-deliver.ts +0 -486
- package/src/outbound.ts +0 -1179
- package/src/ref-index-store.ts +0 -412
- package/src/reply-dispatcher.ts +0 -334
- package/src/session-store.ts +0 -303
- package/src/slash-commands.ts +0 -2431
- package/src/startup-greeting.ts +0 -120
- package/src/streaming.ts +0 -1077
- package/src/stt.ts +0 -86
- package/src/tools/channel.ts +0 -275
- package/src/transport/index.ts +0 -11
- package/src/transport/webhook-transport.ts +0 -332
- package/src/transport/webhook-verify.ts +0 -119
- package/src/typing-keepalive.ts +0 -59
- package/src/utils/audio-convert.ts +0 -887
- package/src/utils/chunked-upload.ts +0 -483
- package/src/utils/file-utils.ts +0 -193
- package/src/utils/image-size.ts +0 -266
- package/src/utils/media-send.ts +0 -636
- package/src/utils/media-tags.ts +0 -183
- package/src/utils/payload.ts +0 -265
- package/src/utils/text-parsing.ts +0 -85
- package/src/utils/upload-cache.ts +0 -128
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Webhook signature verification — Ed25519.
|
|
3
|
-
*
|
|
4
|
-
* QQ Open Platform uses Ed25519 for webhook callback verification:
|
|
5
|
-
* 1. Bot secret is padded/truncated to 32 bytes as the Ed25519 seed.
|
|
6
|
-
* 2. The public key verifies `timestamp + body` against `X-Signature-Ed25519`.
|
|
7
|
-
* 3. For callback URL validation (op:13), signs `event_ts + plain_token`.
|
|
8
|
-
*
|
|
9
|
-
* Reference: https://bot.q.qq.com/wiki/develop/api-v2/dev-prepare/interface-framework/event-emit.html
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import * as crypto from "node:crypto";
|
|
13
|
-
|
|
14
|
-
// ============ Seed derivation ============
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Derive an Ed25519 seed (32 bytes) from the bot secret.
|
|
18
|
-
* QQ's spec: repeat the secret until >= 32 chars, then truncate to 32.
|
|
19
|
-
*/
|
|
20
|
-
function deriveSeed(botSecret: string): Buffer {
|
|
21
|
-
let seed = botSecret;
|
|
22
|
-
while (seed.length < 32) {
|
|
23
|
-
seed = seed + seed;
|
|
24
|
-
}
|
|
25
|
-
return Buffer.from(seed.slice(0, 32), "utf-8");
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Generate Ed25519 key pair from bot secret.
|
|
30
|
-
*/
|
|
31
|
-
function getKeyPair(botSecret: string): { privateKey: crypto.KeyObject; publicKey: crypto.KeyObject } {
|
|
32
|
-
const seed = deriveSeed(botSecret);
|
|
33
|
-
// Node.js Ed25519: create private key from raw 32-byte seed
|
|
34
|
-
const privateKey = crypto.createPrivateKey({
|
|
35
|
-
key: Buffer.concat([
|
|
36
|
-
// Ed25519 PKCS8 DER prefix for 32-byte seed
|
|
37
|
-
Buffer.from("302e020100300506032b657004220420", "hex"),
|
|
38
|
-
seed,
|
|
39
|
-
]),
|
|
40
|
-
format: "der",
|
|
41
|
-
type: "pkcs8",
|
|
42
|
-
});
|
|
43
|
-
const publicKey = crypto.createPublicKey(privateKey);
|
|
44
|
-
return { privateKey, publicKey };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// ============ Signature generation ============
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Sign a message using the bot's Ed25519 private key.
|
|
51
|
-
* Returns hex-encoded signature.
|
|
52
|
-
*/
|
|
53
|
-
export function ed25519Sign(botSecret: string, message: Buffer): string {
|
|
54
|
-
const { privateKey } = getKeyPair(botSecret);
|
|
55
|
-
const signature = crypto.sign(null, message, privateKey);
|
|
56
|
-
return signature.toString("hex");
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// ============ Signature verification ============
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Verify an Ed25519 signature from a QQ webhook callback request.
|
|
63
|
-
*
|
|
64
|
-
* @param params.body - Raw request body (Buffer)
|
|
65
|
-
* @param params.timestamp - Value of `X-Signature-Timestamp` header
|
|
66
|
-
* @param params.signature - Value of `X-Signature-Ed25519` header (hex string)
|
|
67
|
-
* @param params.botSecret - The bot's AppSecret
|
|
68
|
-
* @returns `true` if signature is valid
|
|
69
|
-
*/
|
|
70
|
-
export function verifyWebhookSignature(params: {
|
|
71
|
-
body: Buffer;
|
|
72
|
-
timestamp: string;
|
|
73
|
-
signature: string;
|
|
74
|
-
botSecret: string;
|
|
75
|
-
}): boolean {
|
|
76
|
-
const { body, timestamp, signature, botSecret } = params;
|
|
77
|
-
|
|
78
|
-
try {
|
|
79
|
-
const { publicKey } = getKeyPair(botSecret);
|
|
80
|
-
const message = Buffer.concat([
|
|
81
|
-
Buffer.from(timestamp, "utf-8"),
|
|
82
|
-
body,
|
|
83
|
-
]);
|
|
84
|
-
const sigBuffer = Buffer.from(signature, "hex");
|
|
85
|
-
return crypto.verify(null, message, publicKey, sigBuffer);
|
|
86
|
-
} catch (err) {
|
|
87
|
-
console.warn(`[qqbot:webhook-verify] Ed25519 verification threw: ${err instanceof Error ? err.message : String(err)}`);
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// ============ Callback URL validation (op:13) ============
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Generate the response for callback URL validation (op:13).
|
|
96
|
-
*
|
|
97
|
-
* QQ sends `{ op: 13, d: { plain_token, event_ts } }` to verify
|
|
98
|
-
* the callback URL. We must return `{ plain_token, signature }`.
|
|
99
|
-
*
|
|
100
|
-
* @param params.plainToken - The `plain_token` from the validation request
|
|
101
|
-
* @param params.eventTs - The `event_ts` from the validation request
|
|
102
|
-
* @param params.botSecret - The bot's AppSecret
|
|
103
|
-
*/
|
|
104
|
-
export function signValidationResponse(params: {
|
|
105
|
-
plainToken: string;
|
|
106
|
-
eventTs: string;
|
|
107
|
-
botSecret: string;
|
|
108
|
-
}): { plain_token: string; signature: string } {
|
|
109
|
-
const { plainToken, eventTs, botSecret } = params;
|
|
110
|
-
|
|
111
|
-
// Sign: event_ts + plain_token
|
|
112
|
-
const message = Buffer.from(eventTs + plainToken, "utf-8");
|
|
113
|
-
const signature = ed25519Sign(botSecret, message);
|
|
114
|
-
|
|
115
|
-
return {
|
|
116
|
-
plain_token: plainToken,
|
|
117
|
-
signature,
|
|
118
|
-
};
|
|
119
|
-
}
|
package/src/typing-keepalive.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 输入状态自动续期
|
|
3
|
-
* 在消息处理期间定时续发 "正在输入" 状态通知,确保用户持续看到 bot 在处理中。
|
|
4
|
-
* 仅 C2C 私聊有效(QQ 群聊 API 不支持输入状态通知)。
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { sendC2CInputNotify } from "./api.js";
|
|
8
|
-
|
|
9
|
-
// 每 50 秒续发一次(QQ API input_second=60,留 10s 余量)
|
|
10
|
-
export const TYPING_INTERVAL_MS = 50_000;
|
|
11
|
-
export const TYPING_INPUT_SECOND = 60;
|
|
12
|
-
|
|
13
|
-
export class TypingKeepAlive {
|
|
14
|
-
private timer: ReturnType<typeof setInterval> | null = null;
|
|
15
|
-
private stopped = false;
|
|
16
|
-
|
|
17
|
-
constructor(
|
|
18
|
-
private readonly getToken: () => Promise<string>,
|
|
19
|
-
private readonly clearCache: () => void,
|
|
20
|
-
private readonly openid: string,
|
|
21
|
-
private readonly msgId: string | undefined,
|
|
22
|
-
private readonly log?: { info: (msg: string) => void; error: (msg: string) => void; debug?: (msg: string) => void },
|
|
23
|
-
private readonly logPrefix = "[qqbot]",
|
|
24
|
-
) {}
|
|
25
|
-
|
|
26
|
-
/** 启动定时续期(首次发送由调用方自行处理,这里只负责后续续期) */
|
|
27
|
-
start(): void {
|
|
28
|
-
if (this.stopped) return;
|
|
29
|
-
this.timer = setInterval(() => {
|
|
30
|
-
if (this.stopped) { this.stop(); return; }
|
|
31
|
-
this.send().catch(() => {});
|
|
32
|
-
}, TYPING_INTERVAL_MS);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** 停止续期 */
|
|
36
|
-
stop(): void {
|
|
37
|
-
this.stopped = true;
|
|
38
|
-
if (this.timer) {
|
|
39
|
-
clearInterval(this.timer);
|
|
40
|
-
this.timer = null;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
private async send(): Promise<void> {
|
|
45
|
-
try {
|
|
46
|
-
const token = await this.getToken();
|
|
47
|
-
await sendC2CInputNotify(token, this.openid, this.msgId, TYPING_INPUT_SECOND);
|
|
48
|
-
this.log?.debug?.(`${this.logPrefix} Typing keep-alive sent to ${this.openid}`);
|
|
49
|
-
} catch (err) {
|
|
50
|
-
try {
|
|
51
|
-
this.clearCache();
|
|
52
|
-
const token = await this.getToken();
|
|
53
|
-
await sendC2CInputNotify(token, this.openid, this.msgId, TYPING_INPUT_SECOND);
|
|
54
|
-
} catch {
|
|
55
|
-
this.log?.debug?.(`${this.logPrefix} Typing keep-alive failed for ${this.openid}: ${err}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|