同步新模板 schemas

This commit is contained in:
2025-04-15 01:58:19 +08:00
parent b78032b868
commit 1679576fb4
19 changed files with 267 additions and 167 deletions

View File

@@ -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(

View File

@@ -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'

View File

@@ -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

View File

@@ -1,10 +0,0 @@
from datetime import datetime
from pydantic import BaseModel
from .....typedefs import Number
class TetraLeagueHistoryData(BaseModel):
record_at: datetime
tr: Number

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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):

View File

@@ -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

View File

@@ -3,7 +3,7 @@ from typing import Literal
from pydantic import BaseModel
from ...base import People
from ....base import People
class User(People):

View File

@@ -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

View File

@@ -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

View File

@@ -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]