62 lines
1.9 KiB
Python
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()
|