ForcePilot/backend/package/yuxi/channel/extensions/signal/dedupe.py
Kris 6713dc2d0d feat(channel): 添加 Signal 渠道扩展
新增 Signal 渠道扩展,支持在 Yuxi 平台中集成 Signal 加密即时通讯渠道。

包含以下功能模块:
- client: Signal 客户端封装
- daemon: signald 守护进程管理
- config_schema: 配置模式
- send: 消息发送
- accounts: 账户管理
- account_management: 账户综合管理
- access_policy: 访问策略
- identity: 身份管理
- profiles: 用户资料
- groups: 群组管理
- format: 消息格式转换
- normalize: 消息规范化
- dedupe: 消息去重
- monitor: 渠道状态监控
- probe: 健康探测
- sse_reconnect: SSE 重连机制
2026-05-21 11:41:55 +08:00

40 lines
1.2 KiB
Python

import time
from collections import OrderedDict
class SignalDedupeStore:
def __init__(self, max_entries: int = 2048, ttl_seconds: int = 300):
self._store: OrderedDict[str, float] = OrderedDict()
self.max_entries = max_entries
self.ttl_seconds = ttl_seconds
def is_duplicate(self, dedupe_key: str) -> bool:
now = time.time()
self._evict_expired(now)
return dedupe_key in self._store
def mark_seen(self, dedupe_key: str) -> None:
now = time.time()
self._store[dedupe_key] = now
while len(self._store) > self.max_entries:
self._store.popitem(last=False)
def reset(self) -> None:
self._store.clear()
def _evict_expired(self, now: float) -> None:
deadline = now - self.ttl_seconds
while self._store:
_key, ts = next(iter(self._store.items()))
if ts < deadline:
self._store.popitem(last=False)
else:
break
def __len__(self) -> int:
return len(self._store)
def build_signal_dedupe_key(account_id: str, timestamp: int, sender_id: str) -> str:
return f"signal:{account_id}:{timestamp}:{sender_id}"