From 95ffe47e343b6411aa7a20b32cbfaf8aa369f749 Mon Sep 17 00:00:00 2001 From: Re-bin Date: Sat, 28 Feb 2026 08:38:29 +0000 Subject: [PATCH] refactor: use OrderedDict for WhatsApp dedup, consistent with Feishu --- nanobot/channels/whatsapp.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/nanobot/channels/whatsapp.py b/nanobot/channels/whatsapp.py index b171b6c..49d2390 100644 --- a/nanobot/channels/whatsapp.py +++ b/nanobot/channels/whatsapp.py @@ -2,7 +2,7 @@ import asyncio import json -from collections import deque +from collections import OrderedDict from typing import Any from loguru import logger @@ -22,14 +22,13 @@ class WhatsAppChannel(BaseChannel): """ name = "whatsapp" - MAX_PROCESSED_MESSAGE_IDS = 2000 def __init__(self, config: WhatsAppConfig, bus: MessageBus): super().__init__(config, bus) self.config: WhatsAppConfig = config self._ws = None self._connected = False - self._processed_message_ids: deque[str] = deque(maxlen=self.MAX_PROCESSED_MESSAGE_IDS) + self._processed_message_ids: OrderedDict[str, None] = OrderedDict() async def start(self) -> None: """Start the WhatsApp channel by connecting to the bridge.""" @@ -113,13 +112,12 @@ class WhatsAppChannel(BaseChannel): content = data.get("content", "") message_id = data.get("id", "") - # Dedup by message ID to prevent loops - if message_id and message_id in self._processed_message_ids: - logger.debug("Duplicate message {}, skipping", message_id) - return - if message_id: - self._processed_message_ids.append(message_id) + if message_id in self._processed_message_ids: + return + self._processed_message_ids[message_id] = None + while len(self._processed_message_ids) > 1000: + self._processed_message_ids.popitem(last=False) # Extract just the phone number or lid as chat_id user_id = pn if pn else sender