From 9a16e2fa21e4ec59c7fa542d1c221018368eb7a7 Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Thu, 8 Aug 2024 21:44:01 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=96=B0=E8=B5=9B=E5=AD=A3=20recor?= =?UTF-8?q?ds=20=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../games/tetrio/api/schemas/base.py | 26 ------ .../games/tetrio/api/schemas/base/__init__.py | 61 +++++++++++++ .../games/tetrio/api/schemas/base/solo.py | 65 ++++++++++++++ .../games/tetrio/api/schemas/records/solo.py | 12 +++ .../tetrio/api/schemas/summaries/base.py | 12 --- .../tetrio/api/schemas/summaries/solo.py | 90 ++----------------- .../tetrio/api/schemas/summaries/zenith.py | 27 ++---- 7 files changed, 150 insertions(+), 143 deletions(-) delete mode 100644 nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base.py create mode 100644 nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base/__init__.py create mode 100644 nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base/solo.py create mode 100644 nonebot_plugin_tetris_stats/games/tetrio/api/schemas/records/solo.py diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base.py b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base.py deleted file mode 100644 index da809f6..0000000 --- a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base.py +++ /dev/null @@ -1,26 +0,0 @@ -from datetime import datetime -from typing import Literal - -from pydantic import BaseModel - - -class P(BaseModel): # what is P - pri: float - sec: float - ter: float - - -class Cache(BaseModel): - status: str - cached_at: datetime - cached_until: datetime - - -class SuccessModel(BaseModel): - success: Literal[True] - cache: Cache - - -class FailedModel(BaseModel): - success: Literal[False] - error: str diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base/__init__.py b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base/__init__.py new file mode 100644 index 0000000..4c4b970 --- /dev/null +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base/__init__.py @@ -0,0 +1,61 @@ +from datetime import datetime +from typing import Literal + +from pydantic import BaseModel + + +class AggregateStats(BaseModel): + apm: float + pps: float + vsscore: float + + +class Finesse(BaseModel): + combo: int + faults: int + perfectpieces: int + + +class Clears(BaseModel): + singles: int + doubles: int + triples: int + quads: int + realtspins: int + minitspins: int + minitspinsingles: int + tspinsingles: int + minitspindoubles: int + tspindoubles: int + tspintriples: int + tspinquads: int + allclear: int + + +class Garbage(BaseModel): + sent: int + received: int + attack: int | None + cleared: int + + +class P(BaseModel): # what is P + pri: float + sec: float + ter: float + + +class Cache(BaseModel): + status: str + cached_at: datetime + cached_until: datetime + + +class SuccessModel(BaseModel): + success: Literal[True] + cache: Cache + + +class FailedModel(BaseModel): + success: Literal[False] + error: str diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base/solo.py b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base/solo.py new file mode 100644 index 0000000..37a3c9d --- /dev/null +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/base/solo.py @@ -0,0 +1,65 @@ +from datetime import datetime +from typing import Literal + +from pydantic import BaseModel, Field + +from ..base import P +from . import AggregateStats, Clears, Finesse, Garbage + + +class Time(BaseModel): + start: int + zero: bool + locked: bool + prev: int + frameoffset: int + + +class Stats(BaseModel): + seed: int | None = None # ?: 不知道是之后都没有了还是还会有 + lines: int + level_lines: int + level_lines_needed: int + inputs: int + holds: int + time: Time | None = None # ?: 不知道是之后都没有了还是还会有 + score: int + zenlevel: int + zenprogress: int + level: int + combo: int + currentcombopower: int | None = None + topcombo: int + btb: int + topbtb: int + currentbtbchainpower: int | None = None + tspins: int + piecesplaced: int + clears: Clears + garbage: Garbage + kills: int + finesse: Finesse + finaltime: float + + +class Results(BaseModel): + aggregatestats: AggregateStats + stats: Stats + gameoverreason: str + + +class Record(BaseModel): + id: str = Field(..., alias='_id') + replayid: str + stub: bool + gamemode: Literal['40l', 'blitz'] + pb: bool + oncepb: bool + ts: datetime + revolution: None + otherusers: list + leaderboards: list[str] + results: Results + extras: dict + disputed: bool + p: P diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/records/solo.py b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/records/solo.py new file mode 100644 index 0000000..52903b3 --- /dev/null +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/records/solo.py @@ -0,0 +1,12 @@ +from pydantic import BaseModel + +from ..base import SuccessModel +from ..base.solo import Record + + +class Data(BaseModel): + entries: list[Record] + + +class Model(SuccessModel): + data: Data diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/base.py b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/base.py index 210ecce..5aed764 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/base.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/base.py @@ -9,15 +9,3 @@ class User(BaseModel): country: str | None verified: int supporter: int - - -class AggregateStats(BaseModel): - apm: float - pps: float - vsscore: float - - -class Finesse(BaseModel): - combo: int - faults: int - perfectpieces: int diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/solo.py b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/solo.py index c2300a7..6335726 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/solo.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/solo.py @@ -1,92 +1,14 @@ -from datetime import datetime -from typing import Literal, TypeAlias +from typing import TypeAlias -from pydantic import BaseModel, Field +from pydantic import BaseModel -from ..base import FailedModel, P, SuccessModel -from .base import AggregateStats, Finesse, User +from ..base import FailedModel, SuccessModel +from ..base.solo import Record as BaseRecord +from .base import User -class Time(BaseModel): - start: int - zero: bool - locked: bool - prev: int - frameoffset: int - - -class Clears(BaseModel): - singles: int - doubles: int - triples: int - quads: int - realtspins: int - minitspins: int - minitspinsingles: int - tspinsingles: int - minitspindoubles: int - tspindoubles: int - tspintriples: int - tspinquads: int - allclear: int - - -class Garbage(BaseModel): - sent: int - received: int - attack: int | None - cleared: int - - -class Stats(BaseModel): - seed: int | None = None # ?: 不知道是之后都没有了还是还会有 - lines: int - level_lines: int - level_lines_needed: int - inputs: int - holds: int - time: Time | None = None # ?: 不知道是之后都没有了还是还会有 - score: int - zenlevel: int - zenprogress: int - level: int - combo: int - currentcombopower: int | None = None - topcombo: int - btb: int - topbtb: int - currentbtbchainpower: int | None = None - tspins: int - piecesplaced: int - clears: Clears - garbage: Garbage - kills: int - finesse: Finesse - finaltime: float - - -class Results(BaseModel): - aggregatestats: AggregateStats - stats: Stats - gameoverreason: str - - -class Record(BaseModel): - id: str = Field(..., alias='_id') - replayid: str - stub: bool - gamemode: Literal['40l', 'blitz'] - pb: bool - oncepb: bool - ts: datetime - revolution: None +class Record(BaseRecord): user: User - otherusers: list - leaderboards: list[str] - results: Results - extras: dict - disputed: bool - p: P class Data(BaseModel): diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/zenith.py b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/zenith.py index 050b5cf..337fc3a 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/zenith.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/zenith.py @@ -3,38 +3,23 @@ from typing import Literal, TypeAlias from pydantic import BaseModel, Field -from ..base import FailedModel, P, SuccessModel -from .base import AggregateStats, Finesse, User +from ..base import AggregateStats, FailedModel, Finesse, P, SuccessModel +from ..base import Clears as BaseClears +from ..base import Garbage as BaseGarbage +from .base import User -class Clears(BaseModel): - singles: int - doubles: int - triples: int - quads: int +class Clears(BaseClears): pentas: int - realtspins: int - minitspins: int - minitspinsingles: int - tspinsingles: int - minitspindoubles: int - tspindoubles: int minitspintriples: int - tspintriples: int minitspinquads: int - tspinquads: int tspinpentas: int - allclear: int -class Garbage(BaseModel): - sent: int +class Garbage(BaseGarbage): sent_nomult: int maxspike: int maxspike_nomult: int - received: int - attack: int - cleared: int class _Zenith(BaseModel):