From 18c5716d10013d88df0c99fcfe252cd507996982 Mon Sep 17 00:00:00 2001 From: linuztx Date: Thu, 26 Mar 2026 15:43:01 +0800 Subject: [PATCH] fix: clear typing indicator after sending reply in self-chat mode --- plugins/_whatsapp_integration/helpers/handler.py | 3 +++ plugins/_whatsapp_integration/helpers/wa_client.py | 7 +++++-- plugins/_whatsapp_integration/whatsapp-bridge/bridge.js | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/plugins/_whatsapp_integration/helpers/handler.py b/plugins/_whatsapp_integration/helpers/handler.py index 8a92f85a4..7b109ba0b 100644 --- a/plugins/_whatsapp_integration/helpers/handler.py +++ b/plugins/_whatsapp_integration/helpers/handler.py @@ -258,6 +258,9 @@ async def send_wa_reply( except Exception as e: PrintStyle.warning(f"WhatsApp: attachment error: {e}") + # Clear typing indicator + await wa_client.send_typing(base_url, chat_id, paused=True) + return None diff --git a/plugins/_whatsapp_integration/helpers/wa_client.py b/plugins/_whatsapp_integration/helpers/wa_client.py index 463d59203..fce70b46f 100644 --- a/plugins/_whatsapp_integration/helpers/wa_client.py +++ b/plugins/_whatsapp_integration/helpers/wa_client.py @@ -56,12 +56,15 @@ async def send_media( return await resp.json() -async def send_typing(base_url: str, chat_id: str) -> None: +async def send_typing(base_url: str, chat_id: str, paused: bool = False) -> None: try: + payload: dict = {"chatId": chat_id} + if paused: + payload["status"] = "paused" async with aiohttp.ClientSession() as session: async with session.post( f"{base_url}/typing", - json={"chatId": chat_id}, + json=payload, timeout=aiohttp.ClientTimeout(total=5), ) as resp: await resp.json() diff --git a/plugins/_whatsapp_integration/whatsapp-bridge/bridge.js b/plugins/_whatsapp_integration/whatsapp-bridge/bridge.js index bf645f8e7..81f00db20 100644 --- a/plugins/_whatsapp_integration/whatsapp-bridge/bridge.js +++ b/plugins/_whatsapp_integration/whatsapp-bridge/bridge.js @@ -547,11 +547,11 @@ app.post('/typing', async (req, res) => { return res.status(503).json({ error: 'Not connected' }); } - const { chatId } = req.body; + const { chatId, status } = req.body; if (!chatId) return res.status(400).json({ error: 'chatId required' }); try { - await sock.sendPresenceUpdate('composing', chatId); + await sock.sendPresenceUpdate(status === 'paused' ? 'paused' : 'composing', chatId); res.json({ success: true }); } catch (err) { res.json({ success: false });