Files
RaptDramaDump/server/services/profile_poller.py
T

62 lines
1.9 KiB
Python

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()