diff --git a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/achievements.py b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/achievements.py index 166c528..7a13ee7 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/achievements.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/api/schemas/summaries/achievements.py @@ -1,25 +1,93 @@ -from typing import TypeAlias +from datetime import datetime +from enum import IntEnum +from typing import Literal, TypeAlias -from pydantic import BaseModel +from pydantic import BaseModel, Field from ..base import FailedModel, SuccessModel +class RankType(IntEnum): + PERCENTILE = 1 + ISSUE = 2 + ZENITH = 3 + PERCENTILELAX = 4 + PERCENTILEVLAX = 5 + PERCENTILEMLAX = 6 + + +class ValueType(IntEnum): + NONE = 0 + NUMBER = 1 + TIME = 2 + TIME_INV = 3 + FLOOR = 4 + ISSUE = 5 + NUMBER_INV = 6 + + +class ArType(IntEnum): + UNRANKED = 0 + RANKED = 1 + COMPETITIVE = 2 + + +class Rank(IntEnum): + NONE = 0 + BRONZE = 1 + SILVER = 2 + GOLD = 3 + PLATINUM = 4 + DIAMOND = 5 + ISSUED = 100 + + +class Ally(BaseModel): + id: str = Field(alias='_id') + username: str + role: Literal['anon', 'user', 'bot', 'halfmod', 'mod', 'admin', 'sysop', 'hidden', 'banned'] + country: str | None = None + supporter: bool + avatar_revision: int | None = None + + +class X(BaseModel): + ally: Ally | None = None + + class Achievement(BaseModel): # 这**都是些啥 - k: int - o: int - rt: int - vt: int + achievement_id: int = Field(alias='k') + category: str + primary_name: str = Field(alias='name') + objective: str = Field(alias='object') + flavor_text: str = Field(alias='desc') + order: int = Field(alias='o') + rank_type: RankType = Field(alias='rt') + value_type: ValueType = Field(alias='vt') + ar_type: ArType = Field(alias='art') min: int deci: int - name: str - object: str - category: str hidden: bool - desc: str + nolb: bool + event: str | None = None + event_past: bool | None = None + disabled: bool | None = None + pair: bool | None = None + achieved_score: float | None = Field(None, alias='v') + a: float | None = None + t: datetime | None = None + pos: int | None = None + total: int | None = None + rank: Rank | None = None + x: X | None = None n: str - stub: bool + + tiebreak: int + notifypb: bool + id: str | None = Field(None, alias='_id') + progress: float | None = None + stub: bool | None = None class AchievementsSuccessModel(SuccessModel): diff --git a/nonebot_plugin_tetris_stats/games/tetrio/query/v2.py b/nonebot_plugin_tetris_stats/games/tetrio/query/v2.py index 389b239..a2a199f 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/query/v2.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/query/v2.py @@ -11,6 +11,7 @@ from ....utils.render import render from ....utils.render.schemas.base import Avatar from ....utils.render.schemas.v2.tetrio.user.info import ( + Achievement, Badge, Best, Blitz, @@ -33,7 +34,7 @@ async def make_query_image_v2(player: Player) -> bytes: ( (user, user_info, league, sprint, blitz, zen), - (avatar_revision, banner_revision, leagueflow, zenith, zenithex), + (avatar_revision, banner_revision, leagueflow, zenith, zenithex, achievements), ) = await gather( gather( player.user, @@ -49,6 +50,7 @@ async def make_query_image_v2(player: Player) -> bytes: player.get_leagueflow(), player.get_summaries('zenith'), player.get_summaries('zenithex'), + player.get_summaries('achievements'), ), ) if sprint.data.record is not None: @@ -110,7 +112,20 @@ async def make_query_image_v2(player: Player) -> bytes: ], xp=user_info.data.xp, ar=user_info.data.ar, - achievements=user_info.data.achievements, + achievements=[ + Achievement( + key=i.achievement_id, + rank_type=i.rank_type, + ar_type=i.ar_type, + stub=i.stub, + rank=i.rank, + achieved_score=i.achieved_score, + pos=i.pos, + progress=i.progress, + total=i.total, + ) + for i in achievements.data + ], playtime=play_time, join_at=user_info.data.ts, ), diff --git a/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/info.py b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/info.py index 086404c..65f03ff 100644 --- a/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/info.py +++ b/nonebot_plugin_tetris_stats/utils/render/schemas/v2/tetrio/user/info.py @@ -3,6 +3,8 @@ from pydantic import BaseModel +from .......games.tetrio.api.schemas.summaries.achievements import ArType, RankType +from .......games.tetrio.api.schemas.summaries.achievements import Rank as AchievementRank from .......games.tetrio.api.typedefs import Rank from ......typedefs import Number from ....base import Avatar, Base, HistoryData @@ -15,6 +17,18 @@ class Badge(BaseModel): receive_at: datetime | None +class Achievement(BaseModel): + key: int + rank_type: RankType + ar_type: ArType + stub: bool | None + rank: AchievementRank | None + achieved_score: float | None + pos: int | None + progress: float | None + total: int | None + + class User(BaseModel): id: str name: str @@ -37,7 +51,7 @@ class User(BaseModel): xp: Number ar: Number - achievements: list[int] + achievements: list[Achievement] playtime: str | None join_at: datetime | None