ForcePilot/backend/package/yuxi/channels/adapters/zalo_user/dedup.py
Kris 9285da5c55 feat(zalo-user): 实现完整的Zalo用户频道适配器
新增了Zalo用户频道的完整适配器实现,包括:
- 基础的适配器初始化与导出结构
- 群组同步与成员获取功能
- 请求限流与退避重试机制
- 健康检查与状态探针
- 消息反应/表情处理工具
- 贴纸缓存与消息去重功能
- 消息ID格式化与追踪
- TTS语音合成支持
- 消息发送权限校验
- 长文本分块发送
- 操作审批流程
- 常量配置与国际化支持
- 图像视觉分析功能
- 贴纸消息处理
- 登录与配置向导
- 群组上下文缓存
- 网关连接管理
- 配置Schema校验
- 状态问题与安全审计
- 内联按钮与交互组件
- 交互式回调分发
- 联系人与群组目录管理
- 富媒体卡片消息支持
2026-05-12 00:53:13 +08:00

50 lines
1.3 KiB
Python

from __future__ import annotations
import time
from collections import OrderedDict
_MsgId = str
class MessageDedup:
def __init__(self, max_size: int = 500, ttl: int = 300):
self._max_size = max_size
self._ttl = ttl
self._seen: OrderedDict[_MsgId, float] = OrderedDict()
def is_duplicate(self, msg_id: _MsgId) -> bool:
self._evict_expired()
if msg_id in self._seen:
self._seen.move_to_end(msg_id)
return True
return False
def mark_seen(self, msg_id: _MsgId) -> None:
self._evict_expired()
self._seen[msg_id] = time.monotonic()
self._seen.move_to_end(msg_id)
while len(self._seen) > self._max_size:
self._seen.popitem(last=False)
def check_and_mark(self, msg_id: _MsgId) -> bool:
if self.is_duplicate(msg_id):
return True
self.mark_seen(msg_id)
return False
def _evict_expired(self) -> None:
now = time.monotonic()
expired = [k for k, ts in self._seen.items() if now - ts > self._ttl]
for k in expired:
del self._seen[k]
def clear(self) -> None:
self._seen.clear()
def __len__(self) -> int:
self._evict_expired()
return len(self._seen)
dedup = MessageDedup()