diff --git a/src/main.ts b/src/main.ts index e0bb69b..6c4202f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -270,6 +270,8 @@ async function runDaemon(): Promise { // -- Message queue for serial processing -- const messageQueue: WeixinMessage[] = []; let processingQueue = false; + // 一波忙碌期内只发一次排队提示,避免用户连发消息时被刷屏 + let queueNoticeSent = false; async function drainQueue(): Promise { if (processingQueue) return; @@ -279,6 +281,7 @@ async function runDaemon(): Promise { await handleMessage(msg, account!, session, sessionStore, sender, config, sharedCtx, activeControllers, messageQueue); } processingQueue = false; + queueNoticeSent = false; // 队列已清空,下一波忙碌可再次提示 } // -- Wire the monitor callbacks -- @@ -305,6 +308,16 @@ async function runDaemon(): Promise { const callbacks: MonitorCallbacks = { onMessage: async (msg: WeixinMessage) => { if (handlePriorityCommand(msg)) return; + // 已有任务在处理时,新消息会进队列等待——立刻给一个排队反馈, + // 避免用户对着空白聊天框干等、误以为消息丢了。一波忙碌期只提示一次。 + if (processingQueue && !queueNoticeSent && msg.message_type === MessageType.USER && msg.from_user_id) { + queueNoticeSent = true; + sender.sendText( + msg.from_user_id, + msg.context_token ?? '', + '⏳ 正在处理上一条消息,你后面发的我都收到了,会处理完依次回复。', + ).catch(() => {}); + } messageQueue.push(msg); drainQueue(); },