Module genshin.client.components.chronicle.starrail
StarRail battle chronicle component.
Classes
class StarRailBattleChronicleClient (cookies: ForwardRef('http.cookies.BaseCookie[Any]') | Mapping[Any, Any] | str | Sequence[ForwardRef('http.cookies.BaseCookie[Any]') | Mapping[Any, Any] | str] | None = None,
*,
authkey: str | None = None,
lang: Literal['zh-cn', 'zh-tw', 'de-de', 'en-us', 'es-es', 'fr-fr', 'id-id', 'it-it', 'ja-jp', 'ko-kr', 'pt-pt', 'ru-ru', 'th-th', 'vi-vn', 'tr-tr'] = 'en-us',
region: Region = Region.OVERSEAS,
proxy: str | None = None,
game: Game | None = None,
uid: int | None = None,
hoyolab_id: int | None = None,
device_id: str | None = None,
device_fp: str | None = None,
headers: Mapping[str, str] | Mapping[multidict._multidict.istr, str] | multidict._multidict.CIMultiDict | multidict._multidict.CIMultiDictProxy | Iterable[Tuple[str | multidict._multidict.istr, str]] | None = None,
cache: BaseCache | None = None,
debug: bool = False,
on_cookie_update: Callable[[Mapping[str, str]], Awaitable[None] | None] | None = None)-
Expand source code
class StarRailBattleChronicleClient(base.BaseBattleChronicleClient): """StarRail battle chronicle component.""" async def _request_starrail_record( self, endpoint: str, uid: typing.Optional[int] = None, *, method: str = "GET", lang: typing.Optional[str] = None, payload: typing.Optional[typing.Mapping[str, typing.Any]] = None, cache: bool = False, ) -> typing.Mapping[str, typing.Any]: """Get an arbitrary starrail object.""" payload = dict(payload or {}) original_payload = payload.copy() uid = uid or await self._get_uid(types.Game.STARRAIL) payload = dict(role_id=uid, server=utility.recognize_starrail_server(uid), **payload) data, params = None, None if method == "POST": data = payload else: params = payload cache_key: typing.Optional[base.ChronicleCacheKey] = None if cache: cache_key = base.ChronicleCacheKey( types.Game.STARRAIL, endpoint, uid, lang=lang or self.lang, params=tuple(original_payload.values()), ) return await self.request_game_record( endpoint, lang=lang, game=types.Game.STARRAIL, region=utility.recognize_region(uid, game=types.Game.STARRAIL), params=params, data=data, cache=cache_key, ) @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[False] = ..., ) -> models.StarRailNote: ... @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_notes( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, autoauth: bool = True, return_raw_data: bool = False, ) -> typing.Union[models.StarRailNote, typing.Mapping[str, typing.Any]]: """Get starrail real-time notes.""" try: data = await self._request_starrail_record("note", uid, lang=lang) except errors.DataNotPublic as e: # error raised only when real-time notes are not enabled if uid and (await self._get_uid(types.Game.STARRAIL)) != uid: raise errors.GenshinException(e.response, "Cannot view real-time notes of other users.") from e if not autoauth: raise errors.GenshinException(e.response, "Real-time notes are not enabled.") from e await self.update_settings(3, True, game=types.Game.STARRAIL) data = await self._request_starrail_record("note", uid, lang=lang) if return_raw_data: return data return models.StarRailNote(**data) async def get_starrail_user( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.StarRailUserStats: """Get starrail user.""" index_data, basic_info = await asyncio.gather( self._request_starrail_record("index", uid, lang=lang), self._request_starrail_record("role/basicInfo", uid, lang=lang), ) basic_data = models.StarRailUserInfo(**basic_info) return models.StarRailUserStats(**index_data, info=basic_data) @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[False] = ..., ) -> models.StarRailDetailCharacterResponse: ... @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[True] = ..., ) -> models.StarRailSimpleCharacterResponse: ... async def get_starrail_characters( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, simple: bool = False, ) -> typing.Union[models.StarRailSimpleCharacterResponse, models.StarRailDetailCharacterResponse]: """Get starrail characters.""" payload = {"need_wiki": "true"} data = await self._request_starrail_record("avatar/info", uid, lang=lang, payload=payload) if simple: return models.StarRailSimpleCharacterResponse(**data) return models.StarRailDetailCharacterResponse(**data) @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailChallenge: ... @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_challenge( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailChallenge, typing.Mapping[str, typing.Any]]: """Get starrail challenge runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailChallenge(**data) async def get_starrail_rogue( self, uid: typing.Optional[int] = None, *, schedule_type: int = 3, lang: typing.Optional[str] = None, ) -> models.StarRailRogue: """Get starrail rogue runs.""" payload = dict(schedule_type=schedule_type, need_detail="true") data = await self._request_starrail_record("rogue", uid, lang=lang, payload=payload) return models.StarRailRogue(**data) @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailPureFiction: ... @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailPureFiction, typing.Mapping[str, typing.Any]]: """Get starrail pure fiction runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_story", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailPureFiction(**data) @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailAPCShadow: ... @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailAPCShadow, typing.Mapping[str, typing.Any]]: """Get starrail apocalyptic shadow runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_boss", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time", "last_update_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailAPCShadow(**data) async def get_starrail_event_calendar( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.HSREventCalendar: """Get HSR event calendar.""" data = await self._request_starrail_record("get_act_calender", uid, lang=lang, cache=True) return models.HSREventCalendar(**data) get_apocalyptic_shadow = get_starrail_apc_shadow """Alias for :meth:`get_starrail_apc_shadow`.""" @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> models.AnomalyArbitration: ... @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_anomaly_arbitration( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, schedule_type: typing.Literal[1, 3] = 3, ) -> typing.Union[models.AnomalyArbitration, typing.Mapping[str, typing.Any]]: """Get starrail anomaly arbitration runs. schedule_type=1 returns the current run, schedule_type=3 returns three most recent runs. """ # 2026-04-24: API changed to use schedule_type=3 and returns three most recent runs, # previous parameter is kept for backward compatibility but has no effect. payload = dict(schedule_type=schedule_type) data = await self._request_starrail_record("challenge_peak", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.AnomalyArbitration(**data)StarRail battle chronicle component.
Ancestors
- BaseBattleChronicleClient
- BaseClient
- abc.ABC
Subclasses
Class variables
var logger : logging.Logger
Instance variables
var authkeys : dict[Game, str]-
Expand source code
class StarRailBattleChronicleClient(base.BaseBattleChronicleClient): """StarRail battle chronicle component.""" async def _request_starrail_record( self, endpoint: str, uid: typing.Optional[int] = None, *, method: str = "GET", lang: typing.Optional[str] = None, payload: typing.Optional[typing.Mapping[str, typing.Any]] = None, cache: bool = False, ) -> typing.Mapping[str, typing.Any]: """Get an arbitrary starrail object.""" payload = dict(payload or {}) original_payload = payload.copy() uid = uid or await self._get_uid(types.Game.STARRAIL) payload = dict(role_id=uid, server=utility.recognize_starrail_server(uid), **payload) data, params = None, None if method == "POST": data = payload else: params = payload cache_key: typing.Optional[base.ChronicleCacheKey] = None if cache: cache_key = base.ChronicleCacheKey( types.Game.STARRAIL, endpoint, uid, lang=lang or self.lang, params=tuple(original_payload.values()), ) return await self.request_game_record( endpoint, lang=lang, game=types.Game.STARRAIL, region=utility.recognize_region(uid, game=types.Game.STARRAIL), params=params, data=data, cache=cache_key, ) @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[False] = ..., ) -> models.StarRailNote: ... @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_notes( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, autoauth: bool = True, return_raw_data: bool = False, ) -> typing.Union[models.StarRailNote, typing.Mapping[str, typing.Any]]: """Get starrail real-time notes.""" try: data = await self._request_starrail_record("note", uid, lang=lang) except errors.DataNotPublic as e: # error raised only when real-time notes are not enabled if uid and (await self._get_uid(types.Game.STARRAIL)) != uid: raise errors.GenshinException(e.response, "Cannot view real-time notes of other users.") from e if not autoauth: raise errors.GenshinException(e.response, "Real-time notes are not enabled.") from e await self.update_settings(3, True, game=types.Game.STARRAIL) data = await self._request_starrail_record("note", uid, lang=lang) if return_raw_data: return data return models.StarRailNote(**data) async def get_starrail_user( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.StarRailUserStats: """Get starrail user.""" index_data, basic_info = await asyncio.gather( self._request_starrail_record("index", uid, lang=lang), self._request_starrail_record("role/basicInfo", uid, lang=lang), ) basic_data = models.StarRailUserInfo(**basic_info) return models.StarRailUserStats(**index_data, info=basic_data) @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[False] = ..., ) -> models.StarRailDetailCharacterResponse: ... @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[True] = ..., ) -> models.StarRailSimpleCharacterResponse: ... async def get_starrail_characters( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, simple: bool = False, ) -> typing.Union[models.StarRailSimpleCharacterResponse, models.StarRailDetailCharacterResponse]: """Get starrail characters.""" payload = {"need_wiki": "true"} data = await self._request_starrail_record("avatar/info", uid, lang=lang, payload=payload) if simple: return models.StarRailSimpleCharacterResponse(**data) return models.StarRailDetailCharacterResponse(**data) @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailChallenge: ... @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_challenge( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailChallenge, typing.Mapping[str, typing.Any]]: """Get starrail challenge runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailChallenge(**data) async def get_starrail_rogue( self, uid: typing.Optional[int] = None, *, schedule_type: int = 3, lang: typing.Optional[str] = None, ) -> models.StarRailRogue: """Get starrail rogue runs.""" payload = dict(schedule_type=schedule_type, need_detail="true") data = await self._request_starrail_record("rogue", uid, lang=lang, payload=payload) return models.StarRailRogue(**data) @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailPureFiction: ... @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailPureFiction, typing.Mapping[str, typing.Any]]: """Get starrail pure fiction runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_story", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailPureFiction(**data) @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailAPCShadow: ... @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailAPCShadow, typing.Mapping[str, typing.Any]]: """Get starrail apocalyptic shadow runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_boss", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time", "last_update_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailAPCShadow(**data) async def get_starrail_event_calendar( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.HSREventCalendar: """Get HSR event calendar.""" data = await self._request_starrail_record("get_act_calender", uid, lang=lang, cache=True) return models.HSREventCalendar(**data) get_apocalyptic_shadow = get_starrail_apc_shadow """Alias for :meth:`get_starrail_apc_shadow`.""" @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> models.AnomalyArbitration: ... @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_anomaly_arbitration( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, schedule_type: typing.Literal[1, 3] = 3, ) -> typing.Union[models.AnomalyArbitration, typing.Mapping[str, typing.Any]]: """Get starrail anomaly arbitration runs. schedule_type=1 returns the current run, schedule_type=3 returns three most recent runs. """ # 2026-04-24: API changed to use schedule_type=3 and returns three most recent runs, # previous parameter is kept for backward compatibility but has no effect. payload = dict(schedule_type=schedule_type) data = await self._request_starrail_record("challenge_peak", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.AnomalyArbitration(**data) var cache : BaseCache-
Expand source code
class StarRailBattleChronicleClient(base.BaseBattleChronicleClient): """StarRail battle chronicle component.""" async def _request_starrail_record( self, endpoint: str, uid: typing.Optional[int] = None, *, method: str = "GET", lang: typing.Optional[str] = None, payload: typing.Optional[typing.Mapping[str, typing.Any]] = None, cache: bool = False, ) -> typing.Mapping[str, typing.Any]: """Get an arbitrary starrail object.""" payload = dict(payload or {}) original_payload = payload.copy() uid = uid or await self._get_uid(types.Game.STARRAIL) payload = dict(role_id=uid, server=utility.recognize_starrail_server(uid), **payload) data, params = None, None if method == "POST": data = payload else: params = payload cache_key: typing.Optional[base.ChronicleCacheKey] = None if cache: cache_key = base.ChronicleCacheKey( types.Game.STARRAIL, endpoint, uid, lang=lang or self.lang, params=tuple(original_payload.values()), ) return await self.request_game_record( endpoint, lang=lang, game=types.Game.STARRAIL, region=utility.recognize_region(uid, game=types.Game.STARRAIL), params=params, data=data, cache=cache_key, ) @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[False] = ..., ) -> models.StarRailNote: ... @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_notes( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, autoauth: bool = True, return_raw_data: bool = False, ) -> typing.Union[models.StarRailNote, typing.Mapping[str, typing.Any]]: """Get starrail real-time notes.""" try: data = await self._request_starrail_record("note", uid, lang=lang) except errors.DataNotPublic as e: # error raised only when real-time notes are not enabled if uid and (await self._get_uid(types.Game.STARRAIL)) != uid: raise errors.GenshinException(e.response, "Cannot view real-time notes of other users.") from e if not autoauth: raise errors.GenshinException(e.response, "Real-time notes are not enabled.") from e await self.update_settings(3, True, game=types.Game.STARRAIL) data = await self._request_starrail_record("note", uid, lang=lang) if return_raw_data: return data return models.StarRailNote(**data) async def get_starrail_user( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.StarRailUserStats: """Get starrail user.""" index_data, basic_info = await asyncio.gather( self._request_starrail_record("index", uid, lang=lang), self._request_starrail_record("role/basicInfo", uid, lang=lang), ) basic_data = models.StarRailUserInfo(**basic_info) return models.StarRailUserStats(**index_data, info=basic_data) @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[False] = ..., ) -> models.StarRailDetailCharacterResponse: ... @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[True] = ..., ) -> models.StarRailSimpleCharacterResponse: ... async def get_starrail_characters( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, simple: bool = False, ) -> typing.Union[models.StarRailSimpleCharacterResponse, models.StarRailDetailCharacterResponse]: """Get starrail characters.""" payload = {"need_wiki": "true"} data = await self._request_starrail_record("avatar/info", uid, lang=lang, payload=payload) if simple: return models.StarRailSimpleCharacterResponse(**data) return models.StarRailDetailCharacterResponse(**data) @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailChallenge: ... @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_challenge( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailChallenge, typing.Mapping[str, typing.Any]]: """Get starrail challenge runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailChallenge(**data) async def get_starrail_rogue( self, uid: typing.Optional[int] = None, *, schedule_type: int = 3, lang: typing.Optional[str] = None, ) -> models.StarRailRogue: """Get starrail rogue runs.""" payload = dict(schedule_type=schedule_type, need_detail="true") data = await self._request_starrail_record("rogue", uid, lang=lang, payload=payload) return models.StarRailRogue(**data) @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailPureFiction: ... @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailPureFiction, typing.Mapping[str, typing.Any]]: """Get starrail pure fiction runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_story", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailPureFiction(**data) @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailAPCShadow: ... @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailAPCShadow, typing.Mapping[str, typing.Any]]: """Get starrail apocalyptic shadow runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_boss", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time", "last_update_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailAPCShadow(**data) async def get_starrail_event_calendar( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.HSREventCalendar: """Get HSR event calendar.""" data = await self._request_starrail_record("get_act_calender", uid, lang=lang, cache=True) return models.HSREventCalendar(**data) get_apocalyptic_shadow = get_starrail_apc_shadow """Alias for :meth:`get_starrail_apc_shadow`.""" @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> models.AnomalyArbitration: ... @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_anomaly_arbitration( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, schedule_type: typing.Literal[1, 3] = 3, ) -> typing.Union[models.AnomalyArbitration, typing.Mapping[str, typing.Any]]: """Get starrail anomaly arbitration runs. schedule_type=1 returns the current run, schedule_type=3 returns three most recent runs. """ # 2026-04-24: API changed to use schedule_type=3 and returns three most recent runs, # previous parameter is kept for backward compatibility but has no effect. payload = dict(schedule_type=schedule_type) data = await self._request_starrail_record("challenge_peak", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.AnomalyArbitration(**data) -
Expand source code
class StarRailBattleChronicleClient(base.BaseBattleChronicleClient): """StarRail battle chronicle component.""" async def _request_starrail_record( self, endpoint: str, uid: typing.Optional[int] = None, *, method: str = "GET", lang: typing.Optional[str] = None, payload: typing.Optional[typing.Mapping[str, typing.Any]] = None, cache: bool = False, ) -> typing.Mapping[str, typing.Any]: """Get an arbitrary starrail object.""" payload = dict(payload or {}) original_payload = payload.copy() uid = uid or await self._get_uid(types.Game.STARRAIL) payload = dict(role_id=uid, server=utility.recognize_starrail_server(uid), **payload) data, params = None, None if method == "POST": data = payload else: params = payload cache_key: typing.Optional[base.ChronicleCacheKey] = None if cache: cache_key = base.ChronicleCacheKey( types.Game.STARRAIL, endpoint, uid, lang=lang or self.lang, params=tuple(original_payload.values()), ) return await self.request_game_record( endpoint, lang=lang, game=types.Game.STARRAIL, region=utility.recognize_region(uid, game=types.Game.STARRAIL), params=params, data=data, cache=cache_key, ) @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[False] = ..., ) -> models.StarRailNote: ... @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_notes( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, autoauth: bool = True, return_raw_data: bool = False, ) -> typing.Union[models.StarRailNote, typing.Mapping[str, typing.Any]]: """Get starrail real-time notes.""" try: data = await self._request_starrail_record("note", uid, lang=lang) except errors.DataNotPublic as e: # error raised only when real-time notes are not enabled if uid and (await self._get_uid(types.Game.STARRAIL)) != uid: raise errors.GenshinException(e.response, "Cannot view real-time notes of other users.") from e if not autoauth: raise errors.GenshinException(e.response, "Real-time notes are not enabled.") from e await self.update_settings(3, True, game=types.Game.STARRAIL) data = await self._request_starrail_record("note", uid, lang=lang) if return_raw_data: return data return models.StarRailNote(**data) async def get_starrail_user( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.StarRailUserStats: """Get starrail user.""" index_data, basic_info = await asyncio.gather( self._request_starrail_record("index", uid, lang=lang), self._request_starrail_record("role/basicInfo", uid, lang=lang), ) basic_data = models.StarRailUserInfo(**basic_info) return models.StarRailUserStats(**index_data, info=basic_data) @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[False] = ..., ) -> models.StarRailDetailCharacterResponse: ... @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[True] = ..., ) -> models.StarRailSimpleCharacterResponse: ... async def get_starrail_characters( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, simple: bool = False, ) -> typing.Union[models.StarRailSimpleCharacterResponse, models.StarRailDetailCharacterResponse]: """Get starrail characters.""" payload = {"need_wiki": "true"} data = await self._request_starrail_record("avatar/info", uid, lang=lang, payload=payload) if simple: return models.StarRailSimpleCharacterResponse(**data) return models.StarRailDetailCharacterResponse(**data) @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailChallenge: ... @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_challenge( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailChallenge, typing.Mapping[str, typing.Any]]: """Get starrail challenge runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailChallenge(**data) async def get_starrail_rogue( self, uid: typing.Optional[int] = None, *, schedule_type: int = 3, lang: typing.Optional[str] = None, ) -> models.StarRailRogue: """Get starrail rogue runs.""" payload = dict(schedule_type=schedule_type, need_detail="true") data = await self._request_starrail_record("rogue", uid, lang=lang, payload=payload) return models.StarRailRogue(**data) @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailPureFiction: ... @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailPureFiction, typing.Mapping[str, typing.Any]]: """Get starrail pure fiction runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_story", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailPureFiction(**data) @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailAPCShadow: ... @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailAPCShadow, typing.Mapping[str, typing.Any]]: """Get starrail apocalyptic shadow runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_boss", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time", "last_update_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailAPCShadow(**data) async def get_starrail_event_calendar( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.HSREventCalendar: """Get HSR event calendar.""" data = await self._request_starrail_record("get_act_calender", uid, lang=lang, cache=True) return models.HSREventCalendar(**data) get_apocalyptic_shadow = get_starrail_apc_shadow """Alias for :meth:`get_starrail_apc_shadow`.""" @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> models.AnomalyArbitration: ... @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_anomaly_arbitration( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, schedule_type: typing.Literal[1, 3] = 3, ) -> typing.Union[models.AnomalyArbitration, typing.Mapping[str, typing.Any]]: """Get starrail anomaly arbitration runs. schedule_type=1 returns the current run, schedule_type=3 returns three most recent runs. """ # 2026-04-24: API changed to use schedule_type=3 and returns three most recent runs, # previous parameter is kept for backward compatibility but has no effect. payload = dict(schedule_type=schedule_type) data = await self._request_starrail_record("challenge_peak", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.AnomalyArbitration(**data) var custom_headers : multidict._multidict.CIMultiDict[str]-
Expand source code
class StarRailBattleChronicleClient(base.BaseBattleChronicleClient): """StarRail battle chronicle component.""" async def _request_starrail_record( self, endpoint: str, uid: typing.Optional[int] = None, *, method: str = "GET", lang: typing.Optional[str] = None, payload: typing.Optional[typing.Mapping[str, typing.Any]] = None, cache: bool = False, ) -> typing.Mapping[str, typing.Any]: """Get an arbitrary starrail object.""" payload = dict(payload or {}) original_payload = payload.copy() uid = uid or await self._get_uid(types.Game.STARRAIL) payload = dict(role_id=uid, server=utility.recognize_starrail_server(uid), **payload) data, params = None, None if method == "POST": data = payload else: params = payload cache_key: typing.Optional[base.ChronicleCacheKey] = None if cache: cache_key = base.ChronicleCacheKey( types.Game.STARRAIL, endpoint, uid, lang=lang or self.lang, params=tuple(original_payload.values()), ) return await self.request_game_record( endpoint, lang=lang, game=types.Game.STARRAIL, region=utility.recognize_region(uid, game=types.Game.STARRAIL), params=params, data=data, cache=cache_key, ) @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[False] = ..., ) -> models.StarRailNote: ... @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_notes( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, autoauth: bool = True, return_raw_data: bool = False, ) -> typing.Union[models.StarRailNote, typing.Mapping[str, typing.Any]]: """Get starrail real-time notes.""" try: data = await self._request_starrail_record("note", uid, lang=lang) except errors.DataNotPublic as e: # error raised only when real-time notes are not enabled if uid and (await self._get_uid(types.Game.STARRAIL)) != uid: raise errors.GenshinException(e.response, "Cannot view real-time notes of other users.") from e if not autoauth: raise errors.GenshinException(e.response, "Real-time notes are not enabled.") from e await self.update_settings(3, True, game=types.Game.STARRAIL) data = await self._request_starrail_record("note", uid, lang=lang) if return_raw_data: return data return models.StarRailNote(**data) async def get_starrail_user( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.StarRailUserStats: """Get starrail user.""" index_data, basic_info = await asyncio.gather( self._request_starrail_record("index", uid, lang=lang), self._request_starrail_record("role/basicInfo", uid, lang=lang), ) basic_data = models.StarRailUserInfo(**basic_info) return models.StarRailUserStats(**index_data, info=basic_data) @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[False] = ..., ) -> models.StarRailDetailCharacterResponse: ... @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[True] = ..., ) -> models.StarRailSimpleCharacterResponse: ... async def get_starrail_characters( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, simple: bool = False, ) -> typing.Union[models.StarRailSimpleCharacterResponse, models.StarRailDetailCharacterResponse]: """Get starrail characters.""" payload = {"need_wiki": "true"} data = await self._request_starrail_record("avatar/info", uid, lang=lang, payload=payload) if simple: return models.StarRailSimpleCharacterResponse(**data) return models.StarRailDetailCharacterResponse(**data) @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailChallenge: ... @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_challenge( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailChallenge, typing.Mapping[str, typing.Any]]: """Get starrail challenge runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailChallenge(**data) async def get_starrail_rogue( self, uid: typing.Optional[int] = None, *, schedule_type: int = 3, lang: typing.Optional[str] = None, ) -> models.StarRailRogue: """Get starrail rogue runs.""" payload = dict(schedule_type=schedule_type, need_detail="true") data = await self._request_starrail_record("rogue", uid, lang=lang, payload=payload) return models.StarRailRogue(**data) @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailPureFiction: ... @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailPureFiction, typing.Mapping[str, typing.Any]]: """Get starrail pure fiction runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_story", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailPureFiction(**data) @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailAPCShadow: ... @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailAPCShadow, typing.Mapping[str, typing.Any]]: """Get starrail apocalyptic shadow runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_boss", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time", "last_update_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailAPCShadow(**data) async def get_starrail_event_calendar( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.HSREventCalendar: """Get HSR event calendar.""" data = await self._request_starrail_record("get_act_calender", uid, lang=lang, cache=True) return models.HSREventCalendar(**data) get_apocalyptic_shadow = get_starrail_apc_shadow """Alias for :meth:`get_starrail_apc_shadow`.""" @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> models.AnomalyArbitration: ... @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_anomaly_arbitration( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, schedule_type: typing.Literal[1, 3] = 3, ) -> typing.Union[models.AnomalyArbitration, typing.Mapping[str, typing.Any]]: """Get starrail anomaly arbitration runs. schedule_type=1 returns the current run, schedule_type=3 returns three most recent runs. """ # 2026-04-24: API changed to use schedule_type=3 and returns three most recent runs, # previous parameter is kept for backward compatibility but has no effect. payload = dict(schedule_type=schedule_type) data = await self._request_starrail_record("challenge_peak", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.AnomalyArbitration(**data) var uids : dict[Game, int]-
Expand source code
class StarRailBattleChronicleClient(base.BaseBattleChronicleClient): """StarRail battle chronicle component.""" async def _request_starrail_record( self, endpoint: str, uid: typing.Optional[int] = None, *, method: str = "GET", lang: typing.Optional[str] = None, payload: typing.Optional[typing.Mapping[str, typing.Any]] = None, cache: bool = False, ) -> typing.Mapping[str, typing.Any]: """Get an arbitrary starrail object.""" payload = dict(payload or {}) original_payload = payload.copy() uid = uid or await self._get_uid(types.Game.STARRAIL) payload = dict(role_id=uid, server=utility.recognize_starrail_server(uid), **payload) data, params = None, None if method == "POST": data = payload else: params = payload cache_key: typing.Optional[base.ChronicleCacheKey] = None if cache: cache_key = base.ChronicleCacheKey( types.Game.STARRAIL, endpoint, uid, lang=lang or self.lang, params=tuple(original_payload.values()), ) return await self.request_game_record( endpoint, lang=lang, game=types.Game.STARRAIL, region=utility.recognize_region(uid, game=types.Game.STARRAIL), params=params, data=data, cache=cache_key, ) @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[False] = ..., ) -> models.StarRailNote: ... @typing.overload async def get_starrail_notes( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., autoauth: bool = ..., return_raw_data: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_notes( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, autoauth: bool = True, return_raw_data: bool = False, ) -> typing.Union[models.StarRailNote, typing.Mapping[str, typing.Any]]: """Get starrail real-time notes.""" try: data = await self._request_starrail_record("note", uid, lang=lang) except errors.DataNotPublic as e: # error raised only when real-time notes are not enabled if uid and (await self._get_uid(types.Game.STARRAIL)) != uid: raise errors.GenshinException(e.response, "Cannot view real-time notes of other users.") from e if not autoauth: raise errors.GenshinException(e.response, "Real-time notes are not enabled.") from e await self.update_settings(3, True, game=types.Game.STARRAIL) data = await self._request_starrail_record("note", uid, lang=lang) if return_raw_data: return data return models.StarRailNote(**data) async def get_starrail_user( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.StarRailUserStats: """Get starrail user.""" index_data, basic_info = await asyncio.gather( self._request_starrail_record("index", uid, lang=lang), self._request_starrail_record("role/basicInfo", uid, lang=lang), ) basic_data = models.StarRailUserInfo(**basic_info) return models.StarRailUserStats(**index_data, info=basic_data) @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[False] = ..., ) -> models.StarRailDetailCharacterResponse: ... @typing.overload async def get_starrail_characters( self, uid: typing.Optional[int] = ..., *, lang: typing.Optional[str] = ..., simple: typing.Literal[True] = ..., ) -> models.StarRailSimpleCharacterResponse: ... async def get_starrail_characters( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, simple: bool = False, ) -> typing.Union[models.StarRailSimpleCharacterResponse, models.StarRailDetailCharacterResponse]: """Get starrail characters.""" payload = {"need_wiki": "true"} data = await self._request_starrail_record("avatar/info", uid, lang=lang, payload=payload) if simple: return models.StarRailSimpleCharacterResponse(**data) return models.StarRailDetailCharacterResponse(**data) @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailChallenge: ... @typing.overload async def get_starrail_challenge( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_challenge( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailChallenge, typing.Mapping[str, typing.Any]]: """Get starrail challenge runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailChallenge(**data) async def get_starrail_rogue( self, uid: typing.Optional[int] = None, *, schedule_type: int = 3, lang: typing.Optional[str] = None, ) -> models.StarRailRogue: """Get starrail rogue runs.""" payload = dict(schedule_type=schedule_type, need_detail="true") data = await self._request_starrail_record("rogue", uid, lang=lang, payload=payload) return models.StarRailRogue(**data) @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailPureFiction: ... @typing.overload async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailPureFiction, typing.Mapping[str, typing.Any]]: """Get starrail pure fiction runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_story", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailPureFiction(**data) @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., ) -> models.StarRailAPCShadow: ... @typing.overload async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailAPCShadow, typing.Mapping[str, typing.Any]]: """Get starrail apocalyptic shadow runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_boss", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time", "last_update_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailAPCShadow(**data) async def get_starrail_event_calendar( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.HSREventCalendar: """Get HSR event calendar.""" data = await self._request_starrail_record("get_act_calender", uid, lang=lang, cache=True) return models.HSREventCalendar(**data) get_apocalyptic_shadow = get_starrail_apc_shadow """Alias for :meth:`get_starrail_apc_shadow`.""" @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[False] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> models.AnomalyArbitration: ... @typing.overload async def get_anomaly_arbitration( self, uid: typing.Optional[int] = ..., *, previous: bool = ..., lang: typing.Optional[str] = ..., raw: typing.Literal[True] = ..., schedule_type: typing.Literal[1, 3] = ..., ) -> typing.Mapping[str, typing.Any]: ... async def get_anomaly_arbitration( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, schedule_type: typing.Literal[1, 3] = 3, ) -> typing.Union[models.AnomalyArbitration, typing.Mapping[str, typing.Any]]: """Get starrail anomaly arbitration runs. schedule_type=1 returns the current run, schedule_type=3 returns three most recent runs. """ # 2026-04-24: API changed to use schedule_type=3 and returns three most recent runs, # previous parameter is kept for backward compatibility but has no effect. payload = dict(schedule_type=schedule_type) data = await self._request_starrail_record("challenge_peak", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.AnomalyArbitration(**data)
Methods
async def get_anomaly_arbitration(self,
uid: int | None = None,
*,
previous: bool = False,
lang: str | None = None,
raw: bool = False,
schedule_type: Literal[1, 3] = 3) ‑> AnomalyArbitration | Mapping[str, Any]-
Expand source code
async def get_anomaly_arbitration( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, schedule_type: typing.Literal[1, 3] = 3, ) -> typing.Union[models.AnomalyArbitration, typing.Mapping[str, typing.Any]]: """Get starrail anomaly arbitration runs. schedule_type=1 returns the current run, schedule_type=3 returns three most recent runs. """ # 2026-04-24: API changed to use schedule_type=3 and returns three most recent runs, # previous parameter is kept for backward compatibility but has no effect. payload = dict(schedule_type=schedule_type) data = await self._request_starrail_record("challenge_peak", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.AnomalyArbitration(**data)Get starrail anomaly arbitration runs.
schedule_type=1 returns the current run, schedule_type=3 returns three most recent runs.
async def get_apocalyptic_shadow(self,
uid: int | None = None,
*,
previous: bool = False,
lang: str | None = None,
raw: bool = False) ‑> StarRailAPCShadow | Mapping[str, Any]-
Expand source code
async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailAPCShadow, typing.Mapping[str, typing.Any]]: """Get starrail apocalyptic shadow runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_boss", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time", "last_update_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailAPCShadow(**data)Get starrail apocalyptic shadow runs.
async def get_starrail_apc_shadow(self,
uid: int | None = None,
*,
previous: bool = False,
lang: str | None = None,
raw: bool = False) ‑> StarRailAPCShadow | Mapping[str, Any]-
Expand source code
async def get_starrail_apc_shadow( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailAPCShadow, typing.Mapping[str, typing.Any]]: """Get starrail apocalyptic shadow runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_boss", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time", "last_update_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailAPCShadow(**data)Get starrail apocalyptic shadow runs.
async def get_starrail_challenge(self,
uid: int | None = None,
*,
previous: bool = False,
lang: str | None = None,
raw: bool = False) ‑> StarRailChallenge | Mapping[str, Any]-
Expand source code
async def get_starrail_challenge( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailChallenge, typing.Mapping[str, typing.Any]]: """Get starrail challenge runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailChallenge(**data)Get starrail challenge runs.
async def get_starrail_characters(self, uid: int | None = None, *, lang: str | None = None, simple: bool = False) ‑> StarRailSimpleCharacterResponse | StarRailDetailCharacterResponse-
Expand source code
async def get_starrail_characters( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, simple: bool = False, ) -> typing.Union[models.StarRailSimpleCharacterResponse, models.StarRailDetailCharacterResponse]: """Get starrail characters.""" payload = {"need_wiki": "true"} data = await self._request_starrail_record("avatar/info", uid, lang=lang, payload=payload) if simple: return models.StarRailSimpleCharacterResponse(**data) return models.StarRailDetailCharacterResponse(**data)Get starrail characters.
async def get_starrail_event_calendar(self, uid: int | None = None, *, lang: str | None = None) ‑> HSREventCalendar-
Expand source code
async def get_starrail_event_calendar( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.HSREventCalendar: """Get HSR event calendar.""" data = await self._request_starrail_record("get_act_calender", uid, lang=lang, cache=True) return models.HSREventCalendar(**data)Get HSR event calendar.
async def get_starrail_notes(self,
uid: int | None = None,
*,
lang: str | None = None,
autoauth: bool = True,
return_raw_data: bool = False) ‑> StarRailNote | Mapping[str, Any]-
Expand source code
async def get_starrail_notes( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, autoauth: bool = True, return_raw_data: bool = False, ) -> typing.Union[models.StarRailNote, typing.Mapping[str, typing.Any]]: """Get starrail real-time notes.""" try: data = await self._request_starrail_record("note", uid, lang=lang) except errors.DataNotPublic as e: # error raised only when real-time notes are not enabled if uid and (await self._get_uid(types.Game.STARRAIL)) != uid: raise errors.GenshinException(e.response, "Cannot view real-time notes of other users.") from e if not autoauth: raise errors.GenshinException(e.response, "Real-time notes are not enabled.") from e await self.update_settings(3, True, game=types.Game.STARRAIL) data = await self._request_starrail_record("note", uid, lang=lang) if return_raw_data: return data return models.StarRailNote(**data)Get starrail real-time notes.
async def get_starrail_pure_fiction(self,
uid: int | None = None,
*,
previous: bool = False,
lang: str | None = None,
raw: bool = False) ‑> StarRailPureFiction | Mapping[str, Any]-
Expand source code
async def get_starrail_pure_fiction( self, uid: typing.Optional[int] = None, *, previous: bool = False, lang: typing.Optional[str] = None, raw: bool = False, ) -> typing.Union[models.StarRailPureFiction, typing.Mapping[str, typing.Any]]: """Get starrail pure fiction runs.""" payload = dict(schedule_type=2 if previous else 1, need_all="true") data = await self._request_starrail_record("challenge_story", uid, lang=lang, payload=payload) if raw: return data data = self._add_timezone_to_data( data, ("begin_time", "end_time", "challenge_time"), game=types.Game.STARRAIL, uid=uid ) return models.StarRailPureFiction(**data)Get starrail pure fiction runs.
async def get_starrail_rogue(self, uid: int | None = None, *, schedule_type: int = 3, lang: str | None = None) ‑> StarRailRogue-
Expand source code
async def get_starrail_rogue( self, uid: typing.Optional[int] = None, *, schedule_type: int = 3, lang: typing.Optional[str] = None, ) -> models.StarRailRogue: """Get starrail rogue runs.""" payload = dict(schedule_type=schedule_type, need_detail="true") data = await self._request_starrail_record("rogue", uid, lang=lang, payload=payload) return models.StarRailRogue(**data)Get starrail rogue runs.
async def get_starrail_user(self, uid: int | None = None, *, lang: str | None = None) ‑> StarRailUserStats-
Expand source code
async def get_starrail_user( self, uid: typing.Optional[int] = None, *, lang: typing.Optional[str] = None, ) -> models.StarRailUserStats: """Get starrail user.""" index_data, basic_info = await asyncio.gather( self._request_starrail_record("index", uid, lang=lang), self._request_starrail_record("role/basicInfo", uid, lang=lang), ) basic_data = models.StarRailUserInfo(**basic_info) return models.StarRailUserStats(**index_data, info=basic_data)Get starrail user.
Inherited members
BaseBattleChronicleClient:authkeydebugdefault_gamedevice_fpdevice_idgamegenshin_accountsget_account_timezoneget_game_accountsget_record_cardget_record_cardshoyolab_idlangon_cookie_updateproxyregionrequestrequest_bbsrequest_game_recordrequest_hoyolabrequest_webstaticset_authkeyset_browser_cookiesset_cacheset_cookiesset_redis_cacheset_visibilityuidupdate_settings