import logging import threading from server.services.rapt import rapt from server.services.sessions import sessions log = logging.getLogger(__name__) class ProfilePoller: def __init__(self, interval: float = 15) -> None: self.interval = interval self._lock = threading.Lock() self._token = "" self._stop: threading.Event | None = None self._thread: threading.Thread | None = None def ensure(self, token: str) -> None: with self._lock: if self._token == token and self._thread is not None and self._thread.is_alive(): return if self._stop is not None: self._stop.set() stop = threading.Event() thread = threading.Thread( target=self._loop, args=(token, stop), name="profile-poller", daemon=True, ) self._token = token self._stop = stop self._thread = thread thread.start() def stop_if(self, token: str) -> None: with self._lock: if self._token != token: return if self._stop is not None: self._stop.set() self._token = "" self._stop = None self._thread = None def _loop(self, token: str, stop: threading.Event) -> None: while not stop.wait(self.interval): if sessions.active_token() != token: return device = sessions.device_for(token) if device is None: return try: profile = rapt.user_info(token, device) except Exception: log.warning("刷新个人信息失败", exc_info=True) continue sessions.set_profile(token, profile) profile_poller = ProfilePoller()