diff --git a/simnet/client/components/chronicle/genshin.py b/simnet/client/components/chronicle/genshin.py index e74437e..ddb4089 100644 --- a/simnet/client/components/chronicle/genshin.py +++ b/simnet/client/components/chronicle/genshin.py @@ -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) diff --git a/simnet/client/components/chronicle/starrail.py b/simnet/client/components/chronicle/starrail.py index 8ba1695..9826cf1 100644 --- a/simnet/client/components/chronicle/starrail.py +++ b/simnet/client/components/chronicle/starrail.py @@ -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) diff --git a/simnet/models/genshin/chronicle/achievement.py b/simnet/models/genshin/chronicle/achievement.py new file mode 100644 index 0000000..ff14844 --- /dev/null +++ b/simnet/models/genshin/chronicle/achievement.py @@ -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] diff --git a/simnet/models/starrail/chronicle/achievement.py b/simnet/models/starrail/chronicle/achievement.py new file mode 100644 index 0000000..64d24d6 --- /dev/null +++ b/simnet/models/starrail/chronicle/achievement.py @@ -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