From d5e07880fd6736fcc4c70ddf98d778ca2667919e Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Fri, 14 Jun 2024 07:57:48 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20TETR.IO=20api=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=B1=9E=E6=80=A7=20=E5=BF=AB=E6=8D=B7?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=EF=BC=88x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../games/tetrio/api/player.py | 14 +++++++- .../games/tetrio/query.py | 32 +++++++------------ 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/player.py b/nonebot_plugin_tetris_stats/games/tetrio/api/player.py index b1a7186..2dcd066 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/api/player.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/player.py @@ -11,7 +11,7 @@ from .models import TETRIOHistoricalData from .schemas.base import FailedModel from .schemas.user import User from .schemas.user_info import UserInfo, UserInfoSuccess -from .schemas.user_records import UserRecords, UserRecordsSuccess +from .schemas.user_records import SoloModeRecord, UserRecords, UserRecordsSuccess, Zen class Player: @@ -100,3 +100,15 @@ class Player: ), ) return self._user_records + + @property + async def sprint(self) -> SoloModeRecord: + return (await self.get_records()).data.records.sprint + + @property + async def blitz(self) -> SoloModeRecord: + return (await self.get_records()).data.records.blitz + + @property + async def zen(self) -> Zen: + return (await self.get_records()).data.zen diff --git a/nonebot_plugin_tetris_stats/games/tetrio/query.py b/nonebot_plugin_tetris_stats/games/tetrio/query.py index d78253f..511286f 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/query.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/query.py @@ -10,7 +10,7 @@ from zoneinfo import ZoneInfo from aiofiles import open from nonebot import get_driver from nonebot.adapters import Event -from nonebot.compat import model_dump, type_validate_json +from nonebot.compat import type_validate_json from nonebot.matcher import Matcher from nonebot_plugin_alconna import At from nonebot_plugin_alconna.uniseg import UniMessage @@ -33,7 +33,7 @@ from ...utils.render.schemas.base import Avatar, Ranking from ...utils.render.schemas.tetrio_info import Data, Radar, TetraLeague, TetraLeagueHistory from ...utils.render.schemas.tetrio_info import Info as V1TemplateInfo from ...utils.render.schemas.tetrio_info import User as V1TemplateUser -from ...utils.render.schemas.tetrio_info_v2 import Badge, Blitz, Sprint, Statistic, TetraLeagueStatistic, Zen +from ...utils.render.schemas.tetrio_info_v2 import Badge, Blitz, Sprint, Statistic, TetraLeagueStatistic from ...utils.render.schemas.tetrio_info_v2 import Info as V2TemplateInfo from ...utils.render.schemas.tetrio_info_v2 import TetraLeague as V2TemplateTetraLeague from ...utils.render.schemas.tetrio_info_v2 import User as V2TemplateUser @@ -45,7 +45,6 @@ from .api import Player, User, UserInfoSuccess from .api.models import TETRIOHistoricalData from .api.schemas.tetra_league import TetraLeagueSuccess from .api.schemas.user_info import NeverPlayedLeague, NeverRatedLeague, RatedLeague -from .api.schemas.user_records import SoloModeRecord, UserRecordsSuccess from .constant import GAME_TYPE, TR_MAX, TR_MIN from .models import IORank, TETRIOUserConfig from .typing import Template @@ -244,29 +243,20 @@ def get_league( raise FallbackError -def get_sprint(user_records: UserRecordsSuccess) -> SoloModeRecord: - return user_records.data.records.sprint - - -def get_blitz(user_records: UserRecordsSuccess) -> SoloModeRecord: - return user_records.data.records.blitz - - async def make_query_image_v1(player: Player) -> bytes: - user, user_info, user_records = await gather(player.user, player.get_info(), player.get_records()) + user, user_info, sprint, blitz = await gather(player.user, player.get_info(), player.sprint, player.blitz) league = get_league(user_info, RatedLeague) - sprint, blitz = get_sprint(user_records).record, get_blitz(user_records).record if league.vs is None: raise FallbackError histories = await query_historical_data(user, user_info) value_max, value_min = get_value_bounds([i.tr for i in histories]) split_value, offset = get_split(value_max, value_min) - if sprint is not None: - duration = timedelta(milliseconds=sprint.endcontext.final_time).total_seconds() + if sprint.record is not None: + duration = timedelta(milliseconds=sprint.record.endcontext.final_time).total_seconds() sprint_value = f'{duration:.3f}s' if duration < 60 else f'{duration // 60:.0f}m {duration % 60:.3f}s' # noqa: PLR2004 else: sprint_value = 'N/A' - blitz_value = f'{blitz.endcontext.score:,}' if blitz is not None else 'N/A' + blitz_value = f'{blitz.record.endcontext.score:,}' if blitz.record is not None else 'N/A' netloc = get_self_netloc() async with HostPage( page=await render( @@ -328,9 +318,10 @@ def handling_special_value(value: N) -> N | None: async def make_query_image_v2(player: Player) -> bytes: - user, user_info, user_records = await gather(player.user, player.get_info(), player.get_records()) + user, user_info, sprint, blitz, zen = await gather( + player.user, player.get_info(), player.sprint, player.blitz, player.zen + ) league = get_league(user_info) - sprint, blitz = get_sprint(user_records), get_blitz(user_records) if sprint.record is not None: duration = timedelta(milliseconds=sprint.record.endcontext.final_time).total_seconds() @@ -427,7 +418,7 @@ async def make_query_image_v2(player: Player) -> bytes: ) if blitz.record is not None else None, - zen=Zen.model_validate(model_dump(user_records.data.zen)), + zen=zen, ), ), ) as page_hash: @@ -435,9 +426,8 @@ async def make_query_image_v2(player: Player) -> bytes: async def make_query_text(player: Player) -> UniMessage: - user, user_info, user_records = await gather(player.user, player.get_info(), player.get_records()) + user, user_info, sprint, blitz = await gather(player.user, player.get_info(), player.sprint, player.blitz) league = get_league(user_info) - sprint, blitz = get_sprint(user_records), get_blitz(user_records) user_name = user.name.upper()