同步新模板 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 ..templates import TEMPLATES_DIR
from .schemas.bind import Bind from .schemas.bind import Bind
from .schemas.tetrio.rank.detail import Data as TETRIORankDetailData from .schemas.v1.tetrio.rank import Data as TETRIORankDataV1
from .schemas.tetrio.rank.v1 import Data as TETRIORankDataV1 from .schemas.v1.tetrio.user.info import Info as TETRIOUserInfoV1
from .schemas.tetrio.rank.v2 import Data as TETRIORankDataV2 from .schemas.v1.top.info import Info as TOPInfoV1
from .schemas.tetrio.record.blitz import Record as TETRIORecordBlitz from .schemas.v1.tos.info import Info as TOSInfoV1
from .schemas.tetrio.record.sprint import Record as TETRIORecordSprint from .schemas.v2.tetrio.rank import Data as TETRIORankDataV2
from .schemas.tetrio.user.info_v1 import Info as TETRIOUserInfoV1 from .schemas.v2.tetrio.rank.detail import Data as TETRIORankDetailDataV2
from .schemas.tetrio.user.info_v2 import Info as TETRIOUserInfoV2 from .schemas.v2.tetrio.record.blitz import Record as TETRIORecordBlitzV2
from .schemas.tetrio.user.list_v2 import List as TETRIOUserListV2 from .schemas.v2.tetrio.record.sprint import Record as TETRIORecordSprintV2
from .schemas.top_info import Info as TOPInfo from .schemas.v2.tetrio.tetra_league import Data as TETRIOTetraLeagueDataV2
from .schemas.tos_info import Info as TOSInfo from .schemas.v2.tetrio.user.info import Info as TETRIOUserInfoV2
from .schemas.v2.tetrio.user.list import Data as TETRIOUserListV2
env = Environment( env = Environment(
loader=FileSystemLoader(TEMPLATES_DIR), loader=FileSystemLoader(TEMPLATES_DIR),
@@ -32,21 +33,23 @@ async def render(render_type: Literal['v1/tetrio/info'], data: TETRIOUserInfoV1)
@overload @overload
async def render(render_type: Literal['v1/tetrio/rank'], data: TETRIORankDataV1) -> str: ... async def render(render_type: Literal['v1/tetrio/rank'], data: TETRIORankDataV1) -> str: ...
@overload @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 @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 @overload
async def render(render_type: Literal['v2/tetrio/user/info'], data: TETRIOUserInfoV2) -> str: ... async def render(render_type: Literal['v2/tetrio/user/info'], data: TETRIOUserInfoV2) -> str: ...
@overload @overload
async def render(render_type: Literal['v2/tetrio/user/list'], data: TETRIOUserListV2) -> str: ... 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( async def render(
@@ -56,24 +59,26 @@ async def render(
'v1/tetrio/rank', 'v1/tetrio/rank',
'v1/top/info', 'v1/top/info',
'v1/tos/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',
'v2/tetrio/rank/detail', '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 data: Bind
| TETRIOUserInfoV1 | TETRIOUserInfoV1
| TETRIORankDataV1 | TETRIORankDataV1
| TOPInfo | TOPInfoV1
| TOSInfo | TOSInfoV1
| TETRIOUserInfoV2
| TETRIOUserListV2
| TETRIORecordSprint
| TETRIORecordBlitz
| TETRIORankDataV2 | TETRIORankDataV2
| TETRIORankDetailData, | TETRIORankDetailDataV2
| TETRIORecordBlitzV2
| TETRIORecordSprintV2
| TETRIOTetraLeagueDataV2
| TETRIOUserInfoV2
| TETRIOUserListV2,
) -> str: ) -> str:
if PYDANTIC_V2: if PYDANTIC_V2:
return await env.get_template('index.html').render_async( return await env.get_template('index.html').render_async(

View File

@@ -1,10 +1,16 @@
from datetime import datetime
from typing import Literal from typing import Literal
from pydantic import BaseModel from pydantic import BaseModel
from strenum import StrEnum
from ...typedefs import Number from ...typedefs import Number
class Base(BaseModel):
_lang: Literal['zh-CN', 'en-US']
class Avatar(BaseModel): class Avatar(BaseModel):
type: Literal['identicon'] type: Literal['identicon']
hash: str hash: str
@@ -18,3 +24,14 @@ class People(BaseModel):
class Ranking(BaseModel): class Ranking(BaseModel):
rating: Number rating: Number
rd: 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 typing import Literal
from pydantic import BaseModel from .base import Base, People
from .base import People
class Bind(BaseModel): class Bind(Base):
platform: Literal['TETR.IO', 'TOP', 'TOS'] platform: Literal['TETR.IO', 'TOP', 'TOS']
status: Literal['error', 'success', 'unknown', 'unlink', 'unverified'] type: Literal['success', 'unknown', 'unlink', 'unverified', 'error']
user: People user: People
bot: 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 pydantic import BaseModel, Field
from ...typedefs import Number from .....typedefs import Number
from .base import People, Ranking from ...base import People, Trending
from ..base import History
class Multiplayer(BaseModel): class Multiplayer(BaseModel):
pps: Number history: History
lpm: Number lpm: Number
pps: Number
lpm_trending: Trending
apm: Number apm: Number
apl: Number apl: Number
vs: Number apm_trending: Trending
adpm: Number adpm: Number
vs: Number
adpl: Number adpl: Number
adpm_trending: Trending
class Radar(BaseModel):
app: Number app: Number
OR: Number = Field(serialization_alias='or')
dspp: Number
ci: Number ci: Number
dspp: Number
or_: Number = Field(serialization_alias='or')
ge: Number ge: Number
class Singleplayer(BaseModel):
sprint: str
challenge: str
marathon: str
class Info(BaseModel): class Info(BaseModel):
user: People user: People
ranking: Ranking
multiplayer: Multiplayer multiplayer: Multiplayer
radar: Radar singleplayer: Singleplayer
sprint: str
challenge: str
marathon: str

View File

@@ -2,22 +2,23 @@ from datetime import datetime
from pydantic import BaseModel 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): class AverageData(BaseModel):
pps: float pps: Number
apm: float apm: Number
apl: float apl: Number
vs: float vs: Number
adpl: float adpl: Number
class ItemData(BaseModel): class ItemData(BaseModel):
require_tr: float require_tr: Number
trending: float trending: Number
average_data: AverageData average_data: AverageData
players: int players: Number
class Data(BaseModel): class Data(BaseModel):

View File

@@ -2,17 +2,18 @@ from datetime import datetime
from pydantic import BaseModel 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): class SpecialData(BaseModel):
apm: float apm: Number
pps: float pps: Number
lpm: float lpm: Number
vs: float vs: Number
adpm: float adpm: Number
apl: float | None = None apl: Number | None = None
adpl: float | None = None adpl: Number | None = None
apm_holder: str | None = None apm_holder: str | None = None
pps_holder: str | None = None pps_holder: str | None = None
vs_holder: str | None = None vs_holder: str | None = None
@@ -20,9 +21,9 @@ class SpecialData(BaseModel):
class Data(BaseModel): class Data(BaseModel):
name: ValidRank name: ValidRank
trending: float trending: Number
require_tr: float require_tr: Number
players: int players: Number
minimum_data: SpecialData minimum_data: SpecialData
average_data: SpecialData average_data: SpecialData

View File

@@ -3,7 +3,7 @@ from typing import Literal
from pydantic import BaseModel from pydantic import BaseModel
from ...base import People from ....base import People
class User(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 pydantic import BaseModel
from ......games.tetrio.api.typedefs import Rank from .......games.tetrio.api.typedefs import Rank
from .....typedefs import Number from ......typedefs import Number
from ...base import Avatar from ....base import Avatar, HistoryData
from .base import TetraLeagueHistoryData
class Badge(BaseModel): class Badge(BaseModel):
@@ -22,6 +21,7 @@ class User(BaseModel):
country: str | None country: str | None
role: Literal['anon', 'user', 'bot', 'halfmod', 'mod', 'admin', 'sysop', 'hidden', 'banned'] role: Literal['anon', 'user', 'bot', 'halfmod', 'mod', 'admin', 'sysop', 'hidden', 'banned']
botmaster: str | None
avatar: str | Avatar avatar: str | Avatar
banner: str | None banner: str | None
@@ -36,6 +36,9 @@ class User(BaseModel):
badges: list[Badge] badges: list[Badge]
xp: Number xp: Number
ar: Number
achievements: list[Number]
playtime: str | None playtime: str | None
join_at: datetime | None join_at: datetime | None
@@ -74,18 +77,20 @@ class TetraLeague(BaseModel):
decaying: bool decaying: bool
history: list[TetraLeagueHistoryData] | None history: list[HistoryData] | None
class Sprint(BaseModel): class Sprint(BaseModel):
time: str time: str
global_rank: int | None global_rank: Number | None
country_rank: Number | None
play_at: datetime play_at: datetime
class Blitz(BaseModel): class Blitz(BaseModel):
score: int score: Number
global_rank: int | None global_rank: int | None
country_rank: int | None
play_at: datetime play_at: datetime
@@ -94,9 +99,29 @@ class Zen(BaseModel):
score: int 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): class Info(BaseModel):
user: User user: User
tetra_league: TetraLeague | None tetra_league: TetraLeague | None
zenith: Zenith | None
zenithex: Zenith | None
statistic: Statistic | None statistic: Statistic | None
sprint: Sprint | None sprint: Sprint | None
blitz: Blitz | None blitz: Blitz | None

View File

@@ -1,24 +1,23 @@
from datetime import datetime
from pydantic import BaseModel from pydantic import BaseModel
from ......games.tetrio.api.typedefs import Rank from .......games.tetrio.api.typedefs import Rank
from .....typedefs import Number from ......typedefs import Number
from ...base import Avatar from ....base import Avatar
class TetraLeague(BaseModel): class TetraLeague(BaseModel):
pps: Number
apm: Number
apl: Number
vs: Number | None
adpl: Number | None
rank: Rank rank: Rank
tr: Number tr: Number
glicko: Number | None glicko: Number | None
rd: Number | None rd: Number | None
decaying: bool decaying: bool
pps: Number
apm: Number
apl: Number
vs: Number | None
adpl: Number | None
class User(BaseModel): class User(BaseModel):
@@ -26,11 +25,14 @@ class User(BaseModel):
name: str name: str
avatar: str | Avatar avatar: str | Avatar
country: str | None country: str | None
tetra_league: TetraLeague
xp: Number xp: Number
join_at: datetime | None
class Data(BaseModel):
user: User
tetra_league: TetraLeague
class List(BaseModel): class List(BaseModel):
show_index: bool show_index: bool
users: list[User] data: list[Data]