diff --git a/gateway/platforms/bluebubbles.py b/gateway/platforms/bluebubbles.py index 31120785c09a..7c84baa0f3aa 100644 --- a/gateway/platforms/bluebubbles.py +++ b/gateway/platforms/bluebubbles.py @@ -13,6 +13,7 @@ import logging import os import re +import time import uuid from datetime import datetime from typing import Any, Dict, List, Optional @@ -129,6 +130,8 @@ def __init__(self, config: PlatformConfig): self._private_api_enabled: Optional[bool] = None self._helper_connected: bool = False self._guid_cache: Dict[str, str] = {} + self._seen_message_guids: Dict[str, float] = {} # guid -> timestamp + self._DEDUP_TTL = 30.0 # seconds # ------------------------------------------------------------------ # API helpers @@ -819,6 +822,22 @@ async def _handle_webhook(self, request): }: return web.Response(text="ok") + # Dedup: BB fires multiple webhooks per message (status updates, etc.) + msg_guid = self._value( + record.get("guid"), + record.get("messageGuid"), + record.get("id"), + ) + now = time.time() + self._seen_message_guids = { + k: v for k, v in self._seen_message_guids.items() + if now - v < self._DEDUP_TTL + } + if msg_guid and msg_guid in self._seen_message_guids: + return web.Response(text="ok") + if msg_guid: + self._seen_message_guids[msg_guid] = now + text = ( self._value( record.get("text"), record.get("message"), record.get("body")