diff --git a/nonebot_plugin_tetris_stats/utils/render/__init__.py b/nonebot_plugin_tetris_stats/utils/render/__init__.py index d30a886..e25a560 100644 --- a/nonebot_plugin_tetris_stats/utils/render/__init__.py +++ b/nonebot_plugin_tetris_stats/utils/render/__init__.py @@ -5,16 +5,17 @@ from nonebot.compat import PYDANTIC_V2 from ..templates import TEMPLATES_DIR from .schemas.bind import Bind -from .schemas.tetrio.rank.detail import Data as TETRIORankDetailData -from .schemas.tetrio.rank.v1 import Data as TETRIORankDataV1 -from .schemas.tetrio.rank.v2 import Data as TETRIORankDataV2 -from .schemas.tetrio.record.blitz import Record as TETRIORecordBlitz -from .schemas.tetrio.record.sprint import Record as TETRIORecordSprint -from .schemas.tetrio.user.info_v1 import Info as TETRIOUserInfoV1 -from .schemas.tetrio.user.info_v2 import Info as TETRIOUserInfoV2 -from .schemas.tetrio.user.list_v2 import List as TETRIOUserListV2 -from .schemas.top_info import Info as TOPInfo -from .schemas.tos_info import Info as TOSInfo +from .schemas.v1.tetrio.rank import Data as TETRIORankDataV1 +from .schemas.v1.tetrio.user.info import Info as TETRIOUserInfoV1 +from .schemas.v1.top.info import Info as TOPInfoV1 +from .schemas.v1.tos.info import Info as TOSInfoV1 +from .schemas.v2.tetrio.rank import Data as TETRIORankDataV2 +from .schemas.v2.tetrio.rank.detail import Data as TETRIORankDetailDataV2 +from .schemas.v2.tetrio.record.blitz import Record as TETRIORecordBlitzV2 +from .schemas.v2.tetrio.record.sprint import Record as TETRIORecordSprintV2 +from .schemas.v2.tetrio.tetra_league import Data as TETRIOTetraLeagueDataV2 +from .schemas.v2.tetrio.user.info import Info as TETRIOUserInfoV2 +from .schemas.v2.tetrio.user.list import Data as TETRIOUserListV2 env = Environment( loader=FileSystemLoader(TEMPLATES_DIR), @@ -32,21 +33,23 @@ async def render(render_type: Literal['v1/tetrio/info'], data: TETRIOUserInfoV1) @overload async def render(render_type: Literal['v1/tetrio/rank'], data: TETRIORankDataV1) -> str: ... @overload -async def render(render_type: Literal['v1/top/info'], data: TOPInfo) -> str: ... +async def render(render_type: Literal['v1/top/info'], data: TOPInfoV1) -> str: ... @overload -async def render(render_type: Literal['v1/tos/info'], data: TOSInfo) -> str: ... +async def render(render_type: Literal['v1/tos/info'], data: TOSInfoV1) -> str: ... +@overload +async def render(render_type: Literal['v2/tetrio/rank'], data: TETRIORankDataV2) -> str: ... +@overload +async def render(render_type: Literal['v2/tetrio/rank/detail'], data: TETRIORankDetailDataV2) -> str: ... +@overload +async def render(render_type: Literal['v2/tetrio/record/blitz'], data: TETRIORecordBlitzV2) -> str: ... +@overload +async def render(render_type: Literal['v2/tetrio/record/sprint'], data: TETRIORecordSprintV2) -> str: ... +@overload +async def render(render_type: Literal['v2/tetrio/tetra-league'], data: TETRIOTetraLeagueDataV2) -> str: ... @overload async def render(render_type: Literal['v2/tetrio/user/info'], data: TETRIOUserInfoV2) -> str: ... @overload async def render(render_type: Literal['v2/tetrio/user/list'], data: TETRIOUserListV2) -> str: ... -@overload -async def render(render_type: Literal['v2/tetrio/record/40l'], data: TETRIORecordSprint) -> str: ... -@overload -async def render(render_type: Literal['v2/tetrio/record/blitz'], data: TETRIORecordBlitz) -> str: ... -@overload -async def render(render_type: Literal['v2/tetrio/rank'], data: TETRIORankDataV2) -> str: ... -@overload -async def render(render_type: Literal['v2/tetrio/rank/detail'], data: TETRIORankDetailData) -> str: ... async def render( @@ -56,24 +59,26 @@ async def render( 'v1/tetrio/rank', 'v1/top/info', 'v1/tos/info', - 'v2/tetrio/user/info', - 'v2/tetrio/user/list', - 'v2/tetrio/record/40l', - 'v2/tetrio/record/blitz', 'v2/tetrio/rank', 'v2/tetrio/rank/detail', + 'v2/tetrio/record/blitz', + 'v2/tetrio/record/sprint', + 'v2/tetrio/tetra-league', + 'v2/tetrio/user/info', + 'v2/tetrio/user/list', ], data: Bind | TETRIOUserInfoV1 | TETRIORankDataV1 - | TOPInfo - | TOSInfo - | TETRIOUserInfoV2 - | TETRIOUserListV2 - | TETRIORecordSprint - | TETRIORecordBlitz + | TOPInfoV1 + | TOSInfoV1 | TETRIORankDataV2 - | TETRIORankDetailData, + | TETRIORankDetailDataV2 + | TETRIORecordBlitzV2 + | TETRIORecordSprintV2 + | TETRIOTetraLeagueDataV2 + | TETRIOUserInfoV2 + | TETRIOUserListV2, ) -> str: if PYDANTIC_V2: return await env.get_template('index.html').render_async( diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/base.py b/nonebot_plugin_tetris_stats/utils/render/schemas/base.py index bd17d19..95e512e 100644 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/base.py +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/base.py @@ -1,10 +1,16 @@ +from datetime import datetime from typing import Literal from pydantic import BaseModel +from strenum import StrEnum from ...typedefs import Number +class Base(BaseModel): + _lang: Literal['zh-CN', 'en-US'] + + class Avatar(BaseModel): type: Literal['identicon'] hash: str @@ -18,3 +24,14 @@ class People(BaseModel): class Ranking(BaseModel): rating: Number rd: Number + + +class HistoryData(BaseModel): + score: Number + record_at: datetime + + +class Trending(StrEnum): + UP = 'up' + KEEP = 'keep' + DOWN = 'down' diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/bind.py b/nonebot_plugin_tetris_stats/utils/render/schemas/bind.py index 6839bdd..e090640 100644 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/bind.py +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/bind.py @@ -1,13 +1,11 @@ from typing import Literal -from pydantic import BaseModel - -from .base import People +from .base import Base, People -class Bind(BaseModel): +class Bind(Base): platform: Literal['TETR.IO', 'TOP', 'TOS'] - status: Literal['error', 'success', 'unknown', 'unlink', 'unverified'] + type: Literal['success', 'unknown', 'unlink', 'unverified', 'error'] user: People bot: People - command: str + prompt: str diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/base.py b/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/base.py deleted file mode 100644 index 01ca854..0000000 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/base.py +++ /dev/null @@ -1,10 +0,0 @@ -from datetime import datetime - -from pydantic import BaseModel - -from .....typedefs import Number - - -class TetraLeagueHistoryData(BaseModel): - record_at: datetime - tr: Number diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/info_v1.py b/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/info_v1.py deleted file mode 100644 index 10325e4..0000000 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/info_v1.py +++ /dev/null @@ -1,49 +0,0 @@ -from pydantic import BaseModel - -from ......games.tetrio.api.typedefs import Rank -from .....typedefs import Number -from ...base import People, Ranking -from .base import TetraLeagueHistoryData - - -class User(People): - bio: str | None - - -class TetraLeague(BaseModel): - rank: Rank - tr: Number - global_rank: Number - pps: Number - lpm: Number - apm: Number - apl: Number - vs: Number - adpm: Number - adpl: Number - - -class TetraLeagueHistory(BaseModel): - data: list[TetraLeagueHistoryData] - split_interval: Number - min_tr: Number - max_tr: Number - offset: Number - - -class Radar(BaseModel): - app: Number - dsps: Number - dspp: Number - ci: Number - ge: Number - - -class Info(BaseModel): - user: User - ranking: Ranking - tetra_league: TetraLeague - tetra_league_history: TetraLeagueHistory - radar: Radar - sprint: str - blitz: str diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/top_info.py b/nonebot_plugin_tetris_stats/utils/render/schemas/top_info.py deleted file mode 100644 index 91fbf39..0000000 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/top_info.py +++ /dev/null @@ -1,17 +0,0 @@ -from pydantic import BaseModel - -from ...typedefs import Number -from .base import People - - -class Data(BaseModel): - pps: Number - lpm: Number - apm: Number - apl: Number - - -class Info(BaseModel): - user: People - today: Data - history: Data diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/v1/base.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v1/base.py new file mode 100644 index 0000000..7f7c30a --- /dev/null +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v1/base.py @@ -0,0 +1,12 @@ +from pydantic import BaseModel + +from ....typedefs import Number +from ..base import HistoryData + + +class History(BaseModel): + data: list[HistoryData] + split_interval: Number + min_tr: Number + max_tr: Number + offset: Number diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/rank/v1.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v1/tetrio/rank.py similarity index 100% rename from nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/rank/v1.py rename to nonebot_plugin_tetris_stats/utils/render/schemas/v1/tetrio/rank.py diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/v1/tetrio/user/info.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v1/tetrio/user/info.py new file mode 100644 index 0000000..0633763 --- /dev/null +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v1/tetrio/user/info.py @@ -0,0 +1,50 @@ +from pydantic import BaseModel + +from .......games.tetrio.api.typedefs import Rank +from ......typedefs import Number +from ....base import Base, People, Trending +from ...base import History + + +class User(People): + bio: str | None + + +class Multiplayer(BaseModel): + glicko: str + rd: Number + rank: Rank + tr: str + global_rank: Number + + history: History + + lpm: Number + pps: Number + lpm_trending: Trending + + apm: Number + apl: Number + apm_trending: Trending + + adpm: Number + vs: Number + adpl: Number + adpm_trending: Trending + + app: Number + ci: Number + dspp: Number + dsps: Number + ge: Number + + +class Singleplayer(BaseModel): + sprint: str + blitz: str + + +class Info(Base): + user: User + multiplayer: Multiplayer + singleplayer: Singleplayer diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/v1/top/info.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v1/top/info.py new file mode 100644 index 0000000..a4083d3 --- /dev/null +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v1/top/info.py @@ -0,0 +1,19 @@ +from pydantic import BaseModel + +from .....typedefs import Number +from ...base import Base, People, Trending + + +class Data(BaseModel): + pps: Number + lpm: Number + lpm_trending: Trending + apm: Number + apl: Number + apm_trending: Trending + + +class Info(Base): + user: People + today: Data + historical: Data diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tos_info.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v1/tos/info.py similarity index 54% rename from nonebot_plugin_tetris_stats/utils/render/schemas/tos_info.py rename to nonebot_plugin_tetris_stats/utils/render/schemas/v1/tos/info.py index 8950120..f1fb718 100644 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/tos_info.py +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v1/tos/info.py @@ -1,32 +1,40 @@ from pydantic import BaseModel, Field -from ...typedefs import Number -from .base import People, Ranking +from .....typedefs import Number +from ...base import People, Trending +from ..base import History class Multiplayer(BaseModel): - pps: Number + history: History + lpm: Number + pps: Number + lpm_trending: Trending + apm: Number apl: Number - vs: Number + apm_trending: Trending + adpm: Number + vs: Number adpl: Number + adpm_trending: Trending - -class Radar(BaseModel): app: Number - OR: Number = Field(serialization_alias='or') - dspp: Number ci: Number + dspp: Number + or_: Number = Field(serialization_alias='or') ge: Number +class Singleplayer(BaseModel): + sprint: str + challenge: str + marathon: str + + class Info(BaseModel): user: People - ranking: Ranking multiplayer: Multiplayer - radar: Radar - sprint: str - challenge: str - marathon: str + singleplayer: Singleplayer diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/rank/v2.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/rank/__init__.py similarity index 50% rename from nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/rank/v2.py rename to nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/rank/__init__.py index 2eb7f51..49337d7 100644 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/rank/v2.py +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/rank/__init__.py @@ -2,22 +2,23 @@ from datetime import datetime from pydantic import BaseModel -from ......games.tetrio.api.typedefs import ValidRank +from .......games.tetrio.api.typedefs import ValidRank +from ......typedefs import Number class AverageData(BaseModel): - pps: float - apm: float - apl: float - vs: float - adpl: float + pps: Number + apm: Number + apl: Number + vs: Number + adpl: Number class ItemData(BaseModel): - require_tr: float - trending: float + require_tr: Number + trending: Number average_data: AverageData - players: int + players: Number class Data(BaseModel): diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/rank/detail.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/rank/detail.py similarity index 54% rename from nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/rank/detail.py rename to nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/rank/detail.py index 0cd4dc0..f1f4c9c 100644 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/rank/detail.py +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/rank/detail.py @@ -2,17 +2,18 @@ from datetime import datetime from pydantic import BaseModel -from ......games.tetrio.api.typedefs import ValidRank +from .......games.tetrio.api.typedefs import ValidRank +from ......typedefs import Number class SpecialData(BaseModel): - apm: float - pps: float - lpm: float - vs: float - adpm: float - apl: float | None = None - adpl: float | None = None + apm: Number + pps: Number + lpm: Number + vs: Number + adpm: Number + apl: Number | None = None + adpl: Number | None = None apm_holder: str | None = None pps_holder: str | None = None vs_holder: str | None = None @@ -20,9 +21,9 @@ class SpecialData(BaseModel): class Data(BaseModel): name: ValidRank - trending: float - require_tr: float - players: int + trending: Number + require_tr: Number + players: Number minimum_data: SpecialData average_data: SpecialData diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/record/base.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/record/base.py similarity index 97% rename from nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/record/base.py rename to nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/record/base.py index b809a85..2560b32 100644 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/record/base.py +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/record/base.py @@ -3,7 +3,7 @@ from typing import Literal from pydantic import BaseModel -from ...base import People +from ....base import People class User(People): diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/record/blitz.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/record/blitz.py similarity index 100% rename from nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/record/blitz.py rename to nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/record/blitz.py diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/record/sprint.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/record/sprint.py similarity index 100% rename from nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/record/sprint.py rename to nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/record/sprint.py diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/tetra_league.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/tetra_league.py new file mode 100644 index 0000000..24663a1 --- /dev/null +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/tetra_league.py @@ -0,0 +1,38 @@ +from datetime import datetime + +from pydantic import BaseModel + +from .....typedefs import Number + + +class StatisticalData(BaseModel): + pps: Number + apm: Number + apl: Number + vs: Number + adpl: Number + + +class User(BaseModel): + id: str + name: str + + +class Handling(BaseModel): + arr: Number + das: Number + sdf: Number + + +class Game(BaseModel): + user: User + points: Number + average_data: StatisticalData + data: list[StatisticalData] + handling: Handling + + +class Data(BaseModel): + replay_id: str + games: list[Game] + play_at: datetime diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/info_v2.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/info.py similarity index 70% rename from nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/info_v2.py rename to nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/info.py index 08ba837..996b1c1 100644 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/info_v2.py +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/info.py @@ -3,10 +3,9 @@ from typing import Literal from pydantic import BaseModel -from ......games.tetrio.api.typedefs import Rank -from .....typedefs import Number -from ...base import Avatar -from .base import TetraLeagueHistoryData +from .......games.tetrio.api.typedefs import Rank +from ......typedefs import Number +from ....base import Avatar, HistoryData class Badge(BaseModel): @@ -22,6 +21,7 @@ class User(BaseModel): country: str | None role: Literal['anon', 'user', 'bot', 'halfmod', 'mod', 'admin', 'sysop', 'hidden', 'banned'] + botmaster: str | None avatar: str | Avatar banner: str | None @@ -36,6 +36,9 @@ class User(BaseModel): badges: list[Badge] xp: Number + ar: Number + achievements: list[Number] + playtime: str | None join_at: datetime | None @@ -74,18 +77,20 @@ class TetraLeague(BaseModel): decaying: bool - history: list[TetraLeagueHistoryData] | None + history: list[HistoryData] | None class Sprint(BaseModel): time: str - global_rank: int | None + global_rank: Number | None + country_rank: Number | None play_at: datetime class Blitz(BaseModel): - score: int + score: Number global_rank: int | None + country_rank: int | None play_at: datetime @@ -94,9 +99,29 @@ class Zen(BaseModel): score: int +class Week(BaseModel): + altitude: int + global_rank: int | None + country_rank: int | None + play_at: datetime + + +class Best(BaseModel): + altitude: int + global_rank: int | None + play_at: datetime + + +class Zenith(BaseModel): + week: Week + best: Best + + class Info(BaseModel): user: User tetra_league: TetraLeague | None + zenith: Zenith | None + zenithex: Zenith | None statistic: Statistic | None sprint: Sprint | None blitz: Blitz | None diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/list_v2.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/list.py similarity index 70% rename from nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/list_v2.py rename to nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/list.py index 75997c5..e502fbc 100644 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/tetrio/user/list_v2.py +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/list.py @@ -1,24 +1,23 @@ -from datetime import datetime - from pydantic import BaseModel -from ......games.tetrio.api.typedefs import Rank -from .....typedefs import Number -from ...base import Avatar +from .......games.tetrio.api.typedefs import Rank +from ......typedefs import Number +from ....base import Avatar class TetraLeague(BaseModel): + pps: Number + apm: Number + apl: Number + vs: Number | None + adpl: Number | None + rank: Rank tr: Number glicko: Number | None rd: Number | None decaying: bool - pps: Number - apm: Number - apl: Number - vs: Number | None - adpl: Number | None class User(BaseModel): @@ -26,11 +25,14 @@ class User(BaseModel): name: str avatar: str | Avatar country: str | None - tetra_league: TetraLeague xp: Number - join_at: datetime | None + + +class Data(BaseModel): + user: User + tetra_league: TetraLeague class List(BaseModel): show_index: bool - users: list[User] + data: list[Data]