mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
✨ 适配新赛季 list
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
from typing import Literal, overload
|
||||
from uuid import UUID
|
||||
|
||||
from msgspec import to_builtins
|
||||
from nonebot.compat import type_validate_json
|
||||
from yarl import URL
|
||||
|
||||
@@ -87,4 +86,4 @@ async def records(
|
||||
|
||||
|
||||
async def get(url: URL, parameter: Parameter, extra_headers: dict | None = None) -> bytes:
|
||||
return await Cache.get(url % to_builtins(parameter), extra_headers)
|
||||
return await Cache.get(url % parameter.to_params(), extra_headers)
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
from datetime import datetime
|
||||
from typing import Literal
|
||||
|
||||
from pydantic import BaseModel
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from ...typing import Prisecter
|
||||
|
||||
|
||||
class AggregateStats(BaseModel):
|
||||
@@ -39,11 +41,29 @@ class Garbage(BaseModel):
|
||||
cleared: int
|
||||
|
||||
|
||||
class P(BaseModel): # what is P
|
||||
class P(BaseModel):
|
||||
pri: float
|
||||
sec: float
|
||||
ter: float
|
||||
|
||||
def to_prisecter(self) -> Prisecter:
|
||||
return Prisecter(f'{self.pri}:{self.sec}:{self.ter}')
|
||||
|
||||
|
||||
class ArCounts(BaseModel):
|
||||
bronze: int | None = Field(default=None, alias='1')
|
||||
silver: int | None = Field(default=None, alias='2')
|
||||
gold: int | None = Field(default=None, alias='3')
|
||||
platinum: int | None = Field(default=None, alias='4')
|
||||
diamond: int | None = Field(default=None, alias='5')
|
||||
issued: int | None = Field(default=None, alias='100')
|
||||
top3: int | None = Field(default=None, alias='t3')
|
||||
top5: int | None = Field(default=None, alias='t5')
|
||||
top10: int | None = Field(default=None, alias='t10')
|
||||
top25: int | None = Field(default=None, alias='t25')
|
||||
top50: int | None = Field(default=None, alias='t50')
|
||||
top100: int | None = Field(default=None, alias='t100')
|
||||
|
||||
|
||||
class Cache(BaseModel):
|
||||
status: str
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
from typing import Annotated
|
||||
from typing import Any
|
||||
|
||||
from msgspec import Meta, Struct
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from ...typing import Prisecter
|
||||
|
||||
|
||||
class Parameter(Struct, omit_defaults=True):
|
||||
after: str | None = None
|
||||
before: str | None = None
|
||||
limit: Annotated[int, Meta(ge=1, le=100)] = 25
|
||||
class Parameter(BaseModel):
|
||||
after: Prisecter | None = None
|
||||
before: Prisecter | None = None
|
||||
limit: int = Field(default=25, ge=1, le=100)
|
||||
country: str | None = None
|
||||
|
||||
def to_params(self) -> dict[str, Any]:
|
||||
return self.model_dump(exclude_defaults=True)
|
||||
|
||||
@@ -4,22 +4,7 @@ from typing import Literal
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from ...typing import Rank, ValidRank
|
||||
from ..base import FailedModel, P, SuccessModel
|
||||
|
||||
|
||||
class ArCounts(BaseModel):
|
||||
bronze: int | None = Field(default=None, alias='1')
|
||||
silver: int | None = Field(default=None, alias='2')
|
||||
gold: int | None = Field(default=None, alias='3')
|
||||
platinum: int | None = Field(default=None, alias='4')
|
||||
diamond: int | None = Field(default=None, alias='5')
|
||||
issued: int | None = Field(default=None, alias='100')
|
||||
top3: int | None = Field(default=None, alias='t3')
|
||||
top5: int | None = Field(default=None, alias='t5')
|
||||
top10: int | None = Field(default=None, alias='t10')
|
||||
top25: int | None = Field(default=None, alias='t25')
|
||||
top50: int | None = Field(default=None, alias='t50')
|
||||
top100: int | None = Field(default=None, alias='t100')
|
||||
from ..base import ArCounts, FailedModel, P, SuccessModel
|
||||
|
||||
|
||||
class League(BaseModel):
|
||||
|
||||
@@ -7,5 +7,4 @@ class User(BaseModel):
|
||||
avatar_revision: int | None
|
||||
banner_revision: int | None
|
||||
country: str | None
|
||||
verified: int | None = None
|
||||
supporter: int
|
||||
|
||||
@@ -3,7 +3,7 @@ from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from .base import FailedModel
|
||||
from .base import ArCounts, FailedModel
|
||||
from .base import SuccessModel as BaseSuccessModel
|
||||
|
||||
|
||||
@@ -14,13 +14,19 @@ class Badge(BaseModel):
|
||||
ts: datetime | Literal[False] | None = None
|
||||
|
||||
|
||||
class Discord(BaseModel):
|
||||
class Connection(BaseModel):
|
||||
id: str
|
||||
username: str
|
||||
display_username: str
|
||||
|
||||
|
||||
class Connections(BaseModel):
|
||||
discord: Discord | None = None
|
||||
discord: Connection | None = None
|
||||
twitch: Connection | None = None
|
||||
twitter: Connection | None = None
|
||||
reddit: Connection | None = None
|
||||
youtube: Connection | None = None
|
||||
steam: Connection | None = None
|
||||
|
||||
|
||||
class Distinguishment(BaseModel):
|
||||
@@ -28,9 +34,9 @@ class Distinguishment(BaseModel):
|
||||
|
||||
|
||||
class Data(BaseModel):
|
||||
id: str = Field(..., alias='_id')
|
||||
id: str = Field(default=..., alias='_id')
|
||||
username: str
|
||||
role: Literal['anon', 'user', 'bot', 'halfmod', 'mod', 'admin', 'sysop', 'banned']
|
||||
role: Literal['anon', 'user', 'bot', 'halfmod', 'mod', 'admin', 'sysop', 'hidden', 'banned']
|
||||
ts: datetime | None = None
|
||||
botmaster: str | None = None
|
||||
badges: list[Badge]
|
||||
@@ -42,7 +48,6 @@ class Data(BaseModel):
|
||||
badstanding: bool | None = None
|
||||
supporter: bool | None = None # osk说是必有, 但实际上不是 fkosk
|
||||
supporter_tier: int
|
||||
verified: bool | None = None
|
||||
avatar_revision: int | None = None
|
||||
"""This user's avatar ID. Get their avatar at
|
||||
|
||||
@@ -57,6 +62,9 @@ class Data(BaseModel):
|
||||
connections: Connections
|
||||
friend_count: int | None = None
|
||||
distinguishment: Distinguishment | None = None
|
||||
achievements: list[int]
|
||||
ar: int
|
||||
ar_counts: ArCounts
|
||||
|
||||
|
||||
class UserInfoSuccess(BaseSuccessModel):
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from typing import Literal
|
||||
from typing import Literal, NewType
|
||||
|
||||
S1ValidRank = Literal[
|
||||
'x+',
|
||||
@@ -43,3 +43,5 @@ Records = Literal[
|
||||
'blitz_recent',
|
||||
'blitz_progression',
|
||||
]
|
||||
|
||||
Prisecter = NewType('Prisecter', str)
|
||||
|
||||
Reference in New Issue
Block a user