适配新成就模板 (#540)

*  完善Achievement模型

*  添加一些alias

*  更新模板 schemas

* 🐛 修复类型错误
This commit is contained in:
呵呵です
2025-05-07 23:51:13 +08:00
committed by GitHub
parent 13f005179f
commit 56fe45efcf
3 changed files with 111 additions and 14 deletions

View File

@@ -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 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): class Achievement(BaseModel):
# 这**都是些啥 # 这**都是些啥
k: int achievement_id: int = Field(alias='k')
o: int category: str
rt: int primary_name: str = Field(alias='name')
vt: int 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 min: int
deci: int deci: int
name: str
object: str
category: str
hidden: bool 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 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): class AchievementsSuccessModel(SuccessModel):

View File

@@ -11,6 +11,7 @@ from ....utils.metrics import get_metrics
from ....utils.render import render from ....utils.render import render
from ....utils.render.schemas.base import Avatar from ....utils.render.schemas.base import Avatar
from ....utils.render.schemas.v2.tetrio.user.info import ( from ....utils.render.schemas.v2.tetrio.user.info import (
Achievement,
Badge, Badge,
Best, Best,
Blitz, Blitz,
@@ -33,7 +34,7 @@ from .tools import flow_to_history, handling_special_value
async def make_query_image_v2(player: Player) -> bytes: async def make_query_image_v2(player: Player) -> bytes:
( (
(user, user_info, league, sprint, blitz, zen), (user, user_info, league, sprint, blitz, zen),
(avatar_revision, banner_revision, leagueflow, zenith, zenithex), (avatar_revision, banner_revision, leagueflow, zenith, zenithex, achievements),
) = await gather( ) = await gather(
gather( gather(
player.user, player.user,
@@ -49,6 +50,7 @@ async def make_query_image_v2(player: Player) -> bytes:
player.get_leagueflow(), player.get_leagueflow(),
player.get_summaries('zenith'), player.get_summaries('zenith'),
player.get_summaries('zenithex'), player.get_summaries('zenithex'),
player.get_summaries('achievements'),
), ),
) )
if sprint.data.record is not None: 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, xp=user_info.data.xp,
ar=user_info.data.ar, 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, playtime=play_time,
join_at=user_info.data.ts, join_at=user_info.data.ts,
), ),

View File

@@ -3,6 +3,8 @@ from typing import Literal
from pydantic import BaseModel 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 .......games.tetrio.api.typedefs import Rank
from ......typedefs import Number from ......typedefs import Number
from ....base import Avatar, Base, HistoryData from ....base import Avatar, Base, HistoryData
@@ -15,6 +17,18 @@ class Badge(BaseModel):
receive_at: datetime | None 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): class User(BaseModel):
id: str id: str
name: str name: str
@@ -37,7 +51,7 @@ class User(BaseModel):
xp: Number xp: Number
ar: Number ar: Number
achievements: list[int] achievements: list[Achievement]
playtime: str | None playtime: str | None
join_at: datetime | None join_at: datetime | None