58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
from server.services.adb import Adb
|
|
from server.services.device import DeviceProfile
|
|
from server.services.profile_poller import profile_poller
|
|
from server.services.rapt import rapt
|
|
from server.services.sessions import sessions
|
|
|
|
|
|
class LoginService:
|
|
def guest(self, raw_device: dict | None) -> dict:
|
|
device = DeviceProfile.merge(raw_device)
|
|
token = rapt.guest_token(device)
|
|
return self._finish(token, device)
|
|
|
|
def password(self, email: str, password: str, raw_device: dict | None) -> dict:
|
|
device = DeviceProfile.merge(raw_device)
|
|
token = rapt.email_token(email.strip(), password, device)
|
|
return self._finish(token, device)
|
|
|
|
def adb(self, serial: str, adb_path: str, source: str, raw_device: dict | None) -> dict:
|
|
if not serial.strip():
|
|
raise RuntimeError("请选择设备")
|
|
adb = Adb.locate(adb_path.strip())
|
|
if source == "device":
|
|
device = adb.read_profile(serial.strip())
|
|
chosen = DeviceProfile.merge(raw_device) if raw_device else None
|
|
if chosen is not None and raw_device:
|
|
if (raw_device.get("fingerprint") or "").strip():
|
|
device.fingerprint = chosen.fingerprint
|
|
if (raw_device.get("language") or "").strip():
|
|
device.language = chosen.language
|
|
else:
|
|
device = DeviceProfile.merge(raw_device)
|
|
token = adb.read_token(serial.strip())
|
|
return self._finish(token, device)
|
|
|
|
def current(self, token: str, raw_device: dict | None) -> dict:
|
|
token = token.strip()
|
|
if not token:
|
|
raise RuntimeError("请先登录")
|
|
device = sessions.bind(token, DeviceProfile.merge(raw_device))
|
|
profile = rapt.user_info(token, device)
|
|
self._watch(token, profile)
|
|
return {"token": token, "profile": profile, "device": device.as_dict()}
|
|
|
|
def _finish(self, token: str, device: DeviceProfile) -> dict:
|
|
bound = sessions.bind(token, device, replace=True)
|
|
profile = rapt.user_info(token, bound)
|
|
self._watch(token, profile)
|
|
return {"token": token, "profile": profile, "device": bound.as_dict()}
|
|
|
|
@staticmethod
|
|
def _watch(token: str, profile: dict) -> None:
|
|
sessions.remember(token, profile)
|
|
profile_poller.ensure(token)
|
|
|
|
|
|
login = LoginService()
|