Support genshin and starrail achievement info

This commit is contained in:
omg-xtao 2024-10-14 21:13:02 +08:00 committed by GitHub
parent f47d7693c0
commit 4ee5e5d801
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 136 additions and 1 deletions

View File

@ -1,10 +1,10 @@
import asyncio
from typing import Optional, Any, List, Dict, Union
from simnet.client.components.chronicle.base import BaseChronicleClient
from simnet.client.routes import RECORD_URL
from simnet.errors import DataNotPublic, BadRequest
from simnet.models.genshin.chronicle.abyss import SpiralAbyss, SpiralAbyssPair
from simnet.models.genshin.chronicle.achievement import GenshinAchievementInfo
from simnet.models.genshin.chronicle.character_detail import GenshinCharacterListInfo, GenshinDetailCharacters
from simnet.models.genshin.chronicle.characters import Character
from simnet.models.genshin.chronicle.img_theater import ImgTheater
@ -368,3 +368,18 @@ class GenshinBattleChronicleClient(BaseChronicleClient):
"character/detail", player_id, method="POST", lang=lang, payload=payload
)
return GenshinDetailCharacters(**data)
async def get_genshin_achievement_info(
self, player_id: Optional[int] = None, *, lang: Optional[str] = None
) -> GenshinAchievementInfo:
"""Get genshin achievement info.
Args:
player_id (Optional[int], optional): The player ID. Defaults to None.
lang (Optional[str], optional): The language of the data. Defaults to None.
Returns:
GenshinAchievementInfo: The requested achievement info.
"""
data = await self._request_genshin_record("achievement", player_id, method="POST", lang=lang)
return GenshinAchievementInfo(**data)

View File

@ -5,6 +5,7 @@ from simnet.client.components.chronicle.base import BaseChronicleClient
from simnet.client.routes import RECORD_URL
from simnet.errors import BadRequest, DataNotPublic
from simnet.models.lab.record import RecordCard
from simnet.models.starrail.chronicle.achievement import StarRailAchievementInfo
from simnet.models.starrail.chronicle.act_calendar import StarRailActCalendar
from simnet.models.starrail.chronicle.activity import StarRailActivity
from simnet.models.starrail.chronicle.challenge import StarRailChallenge
@ -482,3 +483,24 @@ class StarRailBattleChronicleClient(BaseChronicleClient):
"""
data = await self._request_starrail_record("get_ledger_month_info", uid, lang=lang)
return StarRailLedgerMonthInfo(**data)
async def get_starrail_achievement_info(
self,
uid: Optional[int] = None,
lang: Optional[str] = None,
) -> StarRailAchievementInfo:
"""Get StarRail achievement info.
Args:
uid (Optional[int], optional): The player ID. Defaults to None.
lang (Optional[str], optional): The language of the data. Defaults to None.
Returns:
StarRailAchievementInfo: The requested achievement info.
Raises:
BadRequest: If the request is invalid.
DataNotPublic: If the requested data is not public.
"""
data = await self._request_starrail_record("achievement_info", uid, lang=lang)
return StarRailAchievementInfo(**data)

View File

@ -0,0 +1,47 @@
from typing import List
from simnet.models.base import APIModel
class GenshinAchievementInfoList(APIModel):
"""
Represents a list of achievement information for Genshin.
Attributes:
id (int): The unique identifier of the achievement.
name (str): The name of the achievement.
icon (str): The URL or path to the icon representing the achievement.
finish_num (int): The number of times the achievement has been completed.
percentage (int): The completion percentage of the achievement.
show_percent (bool): Indicates whether the percentage should be displayed.
"""
id: int
name: str
icon: str
finish_num: int
percentage: int
show_percent: bool
@property
def max(self) -> int:
"""
Calculates the maximum number of times the achievement can be completed.
Returns:
int: The maximum completion value if `show_percent` is True, otherwise 0.
"""
return int(self.finish_num / (self.percentage / 100.0)) if self.percentage else 0
class GenshinAchievementInfo(APIModel):
"""
Represents the achievement information for Genshin.
Attributes:
achievement_num (int): The number of owned achievements.
list (List[StarRailAchievementInfoList]): A list of achievement info objects.
"""
achievement_num: int
list: List[GenshinAchievementInfoList]

View File

@ -0,0 +1,51 @@
from typing import List
from simnet.models.base import APIModel
class StarRailAchievementInfoList(APIModel):
"""
Represents a list of achievement information for Star Rail.
Attributes:
series_id (int): The ID of the achievement series.
name (str): The name of the achievement.
icon (str): The icon representing the achievement.
cur (int): The current progress of the achievement.
max (int): The maximum progress required for the achievement.
"""
series_id: int
name: str
icon: str
cur: int
max: int
@property
def percentage(self) -> float:
"""
Calculates the completion percentage of the achievement.
Returns:
float: The completion percentage of the achievement.
"""
return round(self.cur * 1.00 / self.max * 100, 2)
class StarRailAchievementInfo(APIModel):
"""
Represents the achievement information for Star Rail.
Attributes:
gold_num (int): The number of gold achievements.
silver_num (int): The number of silver achievements.
copper_num (int): The number of copper achievements.
list (List[StarRailAchievementInfoList]): A list of achievement info objects.
strategy_url (str): The URL for the achievement strategy.
"""
gold_num: int
silver_num: int
copper_num: int
list: List[StarRailAchievementInfoList]
strategy_url: str