From c57aa48048c73b5c4313aa15b5d464f4027f3c05 Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Sat, 17 Aug 2024 05:06:59 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20=E4=BF=AE=E6=B2=A1=E6=89=93?= =?UTF-8?q?=E8=BF=87=E7=9A=84=E7=88=86=E7=82=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tetrio/api/schemas/summaries/league.py | 67 ++++++++++++++++--- .../games/tetrio/query.py | 8 ++- 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/league.py b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/league.py index f2ba497..cca48db 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/league.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/league.py @@ -1,6 +1,8 @@ +from typing import Literal + from pydantic import BaseModel, Field -from ...typing import Rank, S1Rank, S1ValidRank, ValidRank +from ...typing import Rank, S1Rank, S1ValidRank from ..base import SuccessModel @@ -27,7 +29,54 @@ class Past(BaseModel): first: PastInner = Field(..., alias='1') -class Data(BaseModel): +class BaseData(BaseModel): + decaying: bool + past: Past + + +class NeverPlayedData(BaseData): + gamesplayed: Literal[0] + gameswon: Literal[0] + glicko: Literal[-1] + rd: Literal[-1] + gxe: Literal[-1] + tr: Literal[-1] + rank: Literal['z'] + apm: None = None + pps: None = None + vs: None = None + standing: Literal[-1] + standing_local: Literal[-1] + prev_rank: None + prev_at: Literal[-1] + next_rank: None + next_at: Literal[-1] + percentile: Literal[-1] + percentile_rank: Literal['z'] + + +class NeverRatedData(BaseData): + gamesplayed: Literal[1, 2, 3, 4, 5, 6, 7, 8, 9] + gameswon: int + glicko: Literal[-1] + rd: Literal[-1] + gxe: Literal[-1] + tr: Literal[-1] + apm: float + pps: float + vs: float + rank: Literal['z'] + standing: Literal[-1] + standing_local: Literal[-1] + prev_rank: None + prev_at: Literal[-1] + next_rank: None + next_at: Literal[-1] + percentile: Literal[-1] + percentile_rank: Literal['z'] + + +class RatedData(BaseData): gamesplayed: int gameswon: int glicko: float @@ -35,21 +84,19 @@ class Data(BaseModel): gxe: float tr: float rank: Rank - bestrank: Rank = Field('z') + bestrank: Rank + standing: int apm: float pps: float vs: float - decaying: bool - standing: int standing_local: int - prev_rank: ValidRank | None = None + prev_rank: Rank | None = None prev_at: int - next_rank: ValidRank | None = None + next_rank: Rank | None = None next_at: int percentile: float - percentile_rank: Rank - past: Past + percentile_rank: str class LeagueSuccessModel(SuccessModel): - data: Data + data: NeverPlayedData | NeverRatedData | RatedData diff --git a/nonebot_plugin_tetris_stats/games/tetrio/query.py b/nonebot_plugin_tetris_stats/games/tetrio/query.py index b25f2e2..1aa8f93 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/query.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/query.py @@ -39,13 +39,13 @@ from .. import add_block_handlers, alc from ..constant import CANT_VERIFY_MESSAGE from . import command, get_player from .api import Player +from .api.schemas.summaries.league import LeagueSuccessModel, NeverPlayedData, NeverRatedData from .constant import GAME_TYPE from .models import TETRIOUserConfig from .typing import Template if TYPE_CHECKING: from .api.schemas.summaries import SoloSuccessModel, ZenSuccessModel - from .api.schemas.summaries.league import LeagueSuccessModel from .api.schemas.user import User from .api.schemas.user_info import UserInfoSuccess @@ -229,7 +229,7 @@ async def make_query_image_v2(player: Player) -> bytes: ), tetra_league=TetraLeague( rank=league.data.rank, - highest_rank=league.data.bestrank, + highest_rank='z' if isinstance(league.data, NeverRatedData) else league.data.bestrank, tr=round(league.data.tr, 2), glicko=round(league.data.glicko, 2), rd=round(league.data.rd, 2), @@ -243,7 +243,9 @@ async def make_query_image_v2(player: Player) -> bytes: statistic=TetraLeagueStatistic(total=league.data.gamesplayed, wins=league.data.gameswon), decaying=league.data.decaying, history=None, - ), + ) + if not isinstance(league.data, NeverPlayedData) + else None, statistic=Statistic( total=handling_special_value(user_info.data.gamesplayed), wins=handling_special_value(user_info.data.gameswon),