diff --git a/nonebot_plugin_tetris_stats/utils/render/__init__.py b/nonebot_plugin_tetris_stats/utils/render/__init__.py index 189e5d9..ef9b143 100644 --- a/nonebot_plugin_tetris_stats/utils/render/__init__.py +++ b/nonebot_plugin_tetris_stats/utils/render/__init__.py @@ -7,6 +7,7 @@ from ..templates import templates_dir from .schemas.bind import Bind from .schemas.tetrio_info import Info as TETRIOInfo from .schemas.tetrio_info_v2 import Info as TETRIOInfoV2 +from .schemas.tetrio_record_sprint import Record as TETRIORecordSprint from .schemas.top_info import Info as TOPInfo from .schemas.tos_info import Info as TOSInfo @@ -27,6 +28,10 @@ async def render(render_type: Literal['v1/tetrio/info'], data: TETRIOInfo) -> st async def render(render_type: Literal['v2/tetrio/info'], data: TETRIOInfoV2) -> str: ... +@overload +async def render(render_type: Literal['v2/tetrio/record/40l'], data: TETRIORecordSprint) -> str: ... + + @overload async def render(render_type: Literal['v1/top/info'], data: TOPInfo) -> str: ... @@ -36,8 +41,15 @@ async def render(render_type: Literal['v1/tos/info'], data: TOSInfo) -> str: ... async def render( - render_type: Literal['v1/binding', 'v1/tetrio/info', 'v2/tetrio/info', 'v1/top/info', 'v1/tos/info'], - data: Bind | TETRIOInfo | TETRIOInfoV2 | TOPInfo | TOSInfo, + render_type: Literal[ + 'v1/binding', + 'v1/tetrio/info', + 'v2/tetrio/info', + 'v1/top/info', + 'v1/tos/info', + 'v2/tetrio/record/40l', + ], + data: Bind | TETRIOInfo | TETRIOInfoV2 | TETRIORecordSprint | TOPInfo | TOSInfo, ) -> str: if PYDANTIC_V2: return await env.get_template('index.html').render_async( diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio_record_sprint.py b/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio_record_sprint.py new file mode 100644 index 0000000..9442ae8 --- /dev/null +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio_record_sprint.py @@ -0,0 +1,80 @@ +from datetime import datetime + +from pydantic import BaseModel + +from ....games.tetrio.api.typing import Rank +from .base import Avatar + + +class TetraLeague(BaseModel): + rank: Rank + tr: float + + +class User(BaseModel): + id: str + name: str + avatar: Avatar | str + tetra_league: TetraLeague | None + + +class Max(BaseModel): + combo: int + btb: int + + +class Mini(BaseModel): + total: int + single: int + double: int + + +class Tspins(BaseModel): + total: int + single: int + double: int + triple: int + + mini: Mini + + +class Finesse(BaseModel): + faults: int + accuracy: float + + +class Statistic(BaseModel): + keys: int + kpp: float + kps: float + + max: Max + + pieces: int + pps: float + lines: int + lpm: float + holds: int | None + score: int + + single: int + double: int + triple: int + quad: int + + tspins: Tspins + + all_clear: int + + finesse: Finesse + + +class Record(BaseModel): + user: User + + time: str + rank: int | None + + statistic: Statistic + + play_at: datetime