2023-10-30 06:31:15 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
2023-12-27 05:43:17 +00:00
|
|
|
import json
|
2023-10-30 07:52:39 +00:00
|
|
|
from pathlib import Path
|
|
|
|
|
2023-12-27 05:43:17 +00:00
|
|
|
import msgspec
|
2023-10-30 06:31:15 +00:00
|
|
|
from httpx import AsyncClient
|
|
|
|
from msgspec import convert
|
|
|
|
|
2024-03-06 12:46:35 +00:00
|
|
|
from starrail_damage_cal.exception import (
|
|
|
|
InvalidUidError,
|
|
|
|
MihomoModelError,
|
|
|
|
MihomoQueueTimeoutError,
|
|
|
|
)
|
2023-10-30 06:31:15 +00:00
|
|
|
from starrail_damage_cal.mihomo.models import MihomoData
|
|
|
|
|
|
|
|
_HEADER = {"User-Agent": "StarRailDamageCal/"}
|
|
|
|
|
|
|
|
|
2023-10-30 07:52:39 +00:00
|
|
|
async def get_char_card_info(
|
|
|
|
uid: str,
|
|
|
|
save_path: Path | None = None,
|
|
|
|
) -> MihomoData:
|
2023-10-30 06:31:15 +00:00
|
|
|
async with AsyncClient(
|
|
|
|
base_url="http://api.mihomo.me",
|
|
|
|
headers=_HEADER,
|
|
|
|
timeout=30,
|
|
|
|
) as client:
|
|
|
|
req = await client.get(f"/sr_info/{uid}")
|
2023-10-30 07:52:39 +00:00
|
|
|
if save_path:
|
2023-10-30 08:11:38 +00:00
|
|
|
path = save_path / str(uid)
|
|
|
|
path.mkdir(parents=True, exist_ok=True)
|
|
|
|
with Path.open(path / f"{uid!s}.json", "w") as file:
|
2024-09-17 15:19:48 +00:00
|
|
|
_= file.write(req.text)
|
2023-12-27 05:43:17 +00:00
|
|
|
try:
|
|
|
|
return convert(req.json(), type=MihomoData)
|
|
|
|
except msgspec.ValidationError as e:
|
2024-05-17 06:56:36 +00:00
|
|
|
if (
|
|
|
|
req.text
|
|
|
|
== '{"detail":"Queue timeout,please refer to https://discord.gg/pkdTJ9svEh for more infomation"}'
|
|
|
|
):
|
2023-12-27 05:43:17 +00:00
|
|
|
raise MihomoQueueTimeoutError from e
|
2024-03-06 12:46:35 +00:00
|
|
|
if req.text == '{"detail":"Invalid uid"}':
|
|
|
|
raise InvalidUidError(uid) from e
|
2023-12-27 05:43:17 +00:00
|
|
|
raise MihomoModelError(e) from e
|
|
|
|
except json.decoder.JSONDecodeError as e:
|
|
|
|
raise MihomoModelError(e) from e
|