StarRailDamageCal/starrail_damage_cal/mihomo/requests.py
baiqwerdvd 09b9c63c0b
update
2024-09-17 23:19:48 +08:00

48 lines
1.4 KiB
Python

from __future__ import annotations
import json
from pathlib import Path
import msgspec
from httpx import AsyncClient
from msgspec import convert
from starrail_damage_cal.exception import (
InvalidUidError,
MihomoModelError,
MihomoQueueTimeoutError,
)
from starrail_damage_cal.mihomo.models import MihomoData
_HEADER = {"User-Agent": "StarRailDamageCal/"}
async def get_char_card_info(
uid: str,
save_path: Path | None = None,
) -> MihomoData:
async with AsyncClient(
base_url="http://api.mihomo.me",
headers=_HEADER,
timeout=30,
) as client:
req = await client.get(f"/sr_info/{uid}")
if save_path:
path = save_path / str(uid)
path.mkdir(parents=True, exist_ok=True)
with Path.open(path / f"{uid!s}.json", "w") as file:
_= file.write(req.text)
try:
return convert(req.json(), type=MihomoData)
except msgspec.ValidationError as e:
if (
req.text
== '{"detail":"Queue timeout,please refer to https://discord.gg/pkdTJ9svEh for more infomation"}'
):
raise MihomoQueueTimeoutError from e
if req.text == '{"detail":"Invalid uid"}':
raise InvalidUidError(uid) from e
raise MihomoModelError(e) from e
except json.decoder.JSONDecodeError as e:
raise MihomoModelError(e) from e