新增了Zalo用户频道的完整适配器实现,包括: - 基础的适配器初始化与导出结构 - 群组同步与成员获取功能 - 请求限流与退避重试机制 - 健康检查与状态探针 - 消息反应/表情处理工具 - 贴纸缓存与消息去重功能 - 消息ID格式化与追踪 - TTS语音合成支持 - 消息发送权限校验 - 长文本分块发送 - 操作审批流程 - 常量配置与国际化支持 - 图像视觉分析功能 - 贴纸消息处理 - 登录与配置向导 - 群组上下文缓存 - 网关连接管理 - 配置Schema校验 - 状态问题与安全审计 - 内联按钮与交互组件 - 交互式回调分发 - 联系人与群组目录管理 - 富媒体卡片消息支持
44 lines
1.1 KiB
Python
44 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
import asyncio
|
|
import random
|
|
import time
|
|
|
|
|
|
class BackoffManager:
|
|
def __init__(
|
|
self,
|
|
base_delay: float = 1.0,
|
|
max_delay: float = 60.0,
|
|
multiplier: float = 2.0,
|
|
jitter: float = 0.1,
|
|
):
|
|
self._base_delay = base_delay
|
|
self._max_delay = max_delay
|
|
self._multiplier = multiplier
|
|
self._jitter = jitter
|
|
self._attempt = 0
|
|
self._last_attempt_at: float = 0
|
|
|
|
def reset(self) -> None:
|
|
self._attempt = 0
|
|
|
|
@property
|
|
def attempts(self) -> int:
|
|
return self._attempt
|
|
|
|
def should_reconnect(self, max_attempts: int = 10) -> bool:
|
|
return self._attempt < max_attempts
|
|
|
|
async def wait(self) -> bool:
|
|
self._attempt += 1
|
|
delay = min(
|
|
self._base_delay * (self._multiplier ** (self._attempt - 1)),
|
|
self._max_delay,
|
|
)
|
|
jitter_amount = delay * self._jitter * random.random()
|
|
actual_delay = delay + jitter_amount
|
|
self._last_attempt_at = time.monotonic()
|
|
await asyncio.sleep(actual_delay)
|
|
return True
|