diff --git a/simnet/client/components/chronicle/starrail.py b/simnet/client/components/chronicle/starrail.py index 355a16a..8ba1695 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.act_calendar import StarRailActCalendar from simnet.models.starrail.chronicle.activity import StarRailActivity from simnet.models.starrail.chronicle.challenge import StarRailChallenge from simnet.models.starrail.chronicle.challenge_boss import StarRailChallengeBoss @@ -367,6 +368,27 @@ class StarRailBattleChronicleClient(BaseChronicleClient): data = await self._request_starrail_record("activity", uid, lang=lang) return StarRailActivity(**data) + async def get_starrail_act_calendar( + self, + uid: Optional[int] = None, + lang: Optional[str] = None, + ) -> StarRailActCalendar: + """Get starrail act calendar. + + Args: + uid (Optional[int], optional): The player ID. Defaults to None. + lang (Optional[str], optional): The language of the data. Defaults to None. + + Returns: + StarRailActCalendar: The requested act calendar info. + + Raises: + BadRequest: If the request is invalid. + DataNotPublic: If the requested data is not public. + """ + data = await self._request_starrail_record("get_act_calender", uid, lang=lang) + return StarRailActCalendar(**data) + async def get_starrail_resident( self, uid: Optional[int] = None, diff --git a/simnet/models/starrail/chronicle/act_calendar.py b/simnet/models/starrail/chronicle/act_calendar.py new file mode 100644 index 0000000..5ff2e0a --- /dev/null +++ b/simnet/models/starrail/chronicle/act_calendar.py @@ -0,0 +1,164 @@ +import datetime +from enum import Enum +from typing import List, Optional + +from simnet.models.base import APIModel + + +class EquipListItem(APIModel): + """A model representing an equipment item in the StarRail act calendar.""" + + item_id: str + item_name: str + item_url: Optional[str] = "" + rarity: int + avatar_base_type: str + is_forward: bool + wiki_url: str + + +class AvatarListItem(EquipListItem): + """A model representing an avatar item in the StarRail act calendar.""" + + icon_url: str + damage_type: int + damage_type_name: str + item_avatar_icon_path: str + + +class TimeInfo(APIModel): + """A model representing time information in the StarRail act calendar.""" + + start_ts: datetime.datetime + end_ts: datetime.datetime + start_time: datetime.datetime + end_time: datetime.datetime + now: datetime.datetime + + +class CardPoolTypeEnum(str, Enum): + """An enumeration class representing the type of card pool in the StarRail act calendar.""" + + Role = "CardPoolRole" + Equipment = "CardPoolEquipment" + + +class CardPoolListItem(APIModel): + """A model representing an item in the card pool list in the StarRail act calendar.""" + + id: str + name: str + type: CardPoolTypeEnum + avatar_list: List[AvatarListItem] + equip_list: List[EquipListItem] + is_after_version: bool + time_info: TimeInfo + version: str + + +class RewardItem(APIModel): + """A model representing a reward item in the StarRail act calendar.""" + + item_id: int + name: str + icon: str + wiki_url: str + num: int + rarity: str + + +class ActTypeEnum(str, Enum): + """An enumeration class representing the type of act in the StarRail act calendar.""" + + Sign = "ActivityTypeSign" + Double = "ActivityTypeDouble" + Other = "ActivityTypeOther" + + +class ActStatusEnum(str, Enum): + """An enumeration class representing the status of an act in the StarRail act calendar.""" + + SignStatusUnopened = "SignStatusUnopened" + SignStatusUnSignedToday = "SignStatusUnSignedToday" + SignStatusSignedToday = "SignStatusSignedToday" + SignStatusUnclaimed = "SignStatusUnclaimed" + SignStatusFinish = "SignStatusFinish" + + DoubleRewardActStatusUnopened = "DoubleRewardActStatusUnopened" + DoubleRewardActStatusProgress = "DoubleRewardActStatusProgress" + DoubleRewardActStatusFinish = "DoubleRewardActStatusFinish" + + OtherActStatusUnopened = "OtherActStatusUnopened" + OtherActStatusUnFinish = "OtherActStatusUnFinish" + OtherActStatusFinish = "OtherActStatusFinish" + + +class ActListItem(APIModel): + """A model representing an item in the StarRail act calendar.""" + + id: int + version: str + name: str + act_type: ActTypeEnum + act_status: ActStatusEnum + reward_list: List[RewardItem] + total_progress: int + current_progress: int + time_info: TimeInfo + panel_id: int + panel_desc: str + strategy: str + multiple_drop_type: int + multiple_drop_type_list: List[int] + count_refresh_type: int + count_value: int + drop_multiple: int + is_after_version: bool + sort_weight: int + special_reward: RewardItem + all_finished: bool + show_text: str + + +class ChallengeTypeEnum(str, Enum): + """An enumeration class representing the type of challenge in the StarRail act calendar.""" + + Chasm = "ChallengeTypeChasm" + Story = "ChallengeTypeStory" + Boss = "ChallengeTypeBoss" + + +class ChallengeStatusEnum(str, Enum): + """An enumeration class representing the status of a challenge in the StarRail act calendar.""" + + Unopened = "challengeStatusUnopened" + Progress = "challengeStatusInProgress" + Finish = "challengeStatusFinish" + + +class ChallengeListItem(APIModel): + """A model representing a challenge item in the StarRail act calendar.""" + + group_id: int + name_mi18n: str + challenge_type: ChallengeTypeEnum + + total_progress: int + current_progress: int + status: ChallengeStatusEnum + + time_info: TimeInfo + reward_list: List[RewardItem] + special_reward: RewardItem + show_text: str + + +class StarRailActCalendar(APIModel): + """A model representing the StarRail act calendar.""" + + avatar_card_pool_list: List[CardPoolListItem] + equip_card_pool_list: List[CardPoolListItem] + act_list: List[ActListItem] + challenge_list: List[ChallengeListItem] + now: datetime.datetime + cur_game_version: str