ForcePilot/backend/package/yuxi/channel/extensions/helpscout/scheduler.py
Kris 432d5db970 feat(helpscout): 新增Help Scout客服工单渠道插件
完成Help Scout渠道的完整功能实现,包含API客户端、webhook处理、轮询同步、自动回复、工单标签分配、客户资料管理等核心能力,附带完整的配置Schema与插件元信息
2026-05-21 10:49:56 +08:00

48 lines
1.4 KiB
Python

from __future__ import annotations
import asyncio
import logging
logger = logging.getLogger(__name__)
class PollingScheduler:
def __init__(self, poll_func, interval: int = 30):
self._poll_func = poll_func
self._interval = interval
self._task: asyncio.Task | None = None
self._running = False
async def start(self) -> None:
self._running = True
self._task = asyncio.create_task(self._run_loop())
logger.info("Help Scout polling scheduler started: interval=%ds", self._interval)
async def stop(self) -> None:
self._running = False
if self._task:
self._task.cancel()
try:
await self._task
except asyncio.CancelledError:
pass
logger.info("Help Scout polling scheduler stopped")
async def _run_loop(self) -> None:
backoff = 1
max_backoff = 300
while self._running:
try:
await self._poll_func()
backoff = 1
except asyncio.CancelledError:
break
except Exception:
logger.exception("Help Scout polling error — backing off %ds", backoff)
await asyncio.sleep(backoff)
backoff = min(backoff * 2, max_backoff)
continue
await asyncio.sleep(self._interval)