Module genshin.client.components.hsr_warp_records

HSR warp records statistics component.

Classes

class HSRWarpRecordsClient (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 HSRWarpRecordsClient(badge.BadgeLoginClient):
    """HSR warp records statistics client."""

    async def _request_warp_records(
        self,
        endpoint: str,
        uid: typing.Optional[int] = None,
        *,
        lang: typing.Optional[str] = None,
        params: typing.Optional[typing.Mapping[str, typing.Any]] = None,
    ) -> typing.Mapping[str, typing.Any]:
        """Make a request towards the warp records API."""
        uid = uid or await self._get_uid(types.Game.STARRAIL)
        region = utility.recognize_region(uid, game=types.Game.STARRAIL) or types.Region.OVERSEAS
        params = {
            "game_biz": utility.get_prod_game_biz(region, types.Game.STARRAIL),
            "region": utility.recognize_starrail_server(uid),
            "uid": uid,
            **(params or {}),
        }
        url = routes.HKRPG_GACHA_RECORD_URL.get_url(region) / endpoint
        return await self._request_with_badge(types.Game.STARRAIL, url, uid, lang=lang, params=params)

    async def get_starrail_warp_brief(
        self,
        uid: typing.Optional[int] = None,
        *,
        lang: typing.Optional[str] = None,
    ) -> models.StarRailWarpBrief:
        """Get an overview of the most recently obtained 5-star items across all banners."""
        data = await self._request_warp_records("brief", uid, lang=lang)
        return models.StarRailWarpBrief(**data)

    async def get_starrail_warp_pool_stats(
        self,
        banner_type: gacha_models.StarRailBannerType,
        uid: typing.Optional[int] = None,
        *,
        lang: typing.Optional[str] = None,
    ) -> typing.Sequence[models.StarRailWarpPoolStat]:
        """Get per-banner warp statistics for a banner type."""
        gacha_type = GACHA_TYPES[gacha_models.StarRailBannerType(banner_type)]
        data = await self._request_warp_records("pool_stat", uid, lang=lang, params={"gacha_type": gacha_type})
        return [models.StarRailWarpPoolStat(**card) for card in data["cards"]]

    async def get_starrail_five_star_warps(
        self,
        banner_type: gacha_models.StarRailBannerType,
        uid: typing.Optional[int] = None,
        *,
        lang: typing.Optional[str] = None,
    ) -> models.StarRailFiveStarWarps:
        """Get all 5-star items obtained from a banner type along with the current pity."""
        params: typing.Dict[str, typing.Any] = {"gacha_type": GACHA_TYPES[gacha_models.StarRailBannerType(banner_type)]}

        rows: typing.List[typing.Mapping[str, typing.Any]] = []
        while True:
            data = await self._request_warp_records("five_star_list", uid, lang=lang, params=params)
            rows.extend(data["list"])
            if not data["has_more"]:
                break
            params = {**params, "version_id": data["version_id"], "max_id": data["next_max_id"]}

        # The row without an item is the ongoing streak towards the next 5-star.
        pity = next((row["gacha_count"] for row in rows if not row["got_item"]), 0)
        warps = [models.StarRailFiveStarWarp(**row) for row in rows if row["got_item"]]
        return models.StarRailFiveStarWarps(version_id=data["version_id"], pity=pity, warps=warps)

HSR warp records statistics client.

Ancestors

Subclasses

Methods

async def get_starrail_five_star_warps(self,
banner_type: StarRailBannerType,
uid: int | None = None,
*,
lang: str | None = None) ‑> StarRailFiveStarWarps
Expand source code
async def get_starrail_five_star_warps(
    self,
    banner_type: gacha_models.StarRailBannerType,
    uid: typing.Optional[int] = None,
    *,
    lang: typing.Optional[str] = None,
) -> models.StarRailFiveStarWarps:
    """Get all 5-star items obtained from a banner type along with the current pity."""
    params: typing.Dict[str, typing.Any] = {"gacha_type": GACHA_TYPES[gacha_models.StarRailBannerType(banner_type)]}

    rows: typing.List[typing.Mapping[str, typing.Any]] = []
    while True:
        data = await self._request_warp_records("five_star_list", uid, lang=lang, params=params)
        rows.extend(data["list"])
        if not data["has_more"]:
            break
        params = {**params, "version_id": data["version_id"], "max_id": data["next_max_id"]}

    # The row without an item is the ongoing streak towards the next 5-star.
    pity = next((row["gacha_count"] for row in rows if not row["got_item"]), 0)
    warps = [models.StarRailFiveStarWarp(**row) for row in rows if row["got_item"]]
    return models.StarRailFiveStarWarps(version_id=data["version_id"], pity=pity, warps=warps)

Get all 5-star items obtained from a banner type along with the current pity.

async def get_starrail_warp_brief(self, uid: int | None = None, *, lang: str | None = None) ‑> StarRailWarpBrief
Expand source code
async def get_starrail_warp_brief(
    self,
    uid: typing.Optional[int] = None,
    *,
    lang: typing.Optional[str] = None,
) -> models.StarRailWarpBrief:
    """Get an overview of the most recently obtained 5-star items across all banners."""
    data = await self._request_warp_records("brief", uid, lang=lang)
    return models.StarRailWarpBrief(**data)

Get an overview of the most recently obtained 5-star items across all banners.

async def get_starrail_warp_pool_stats(self,
banner_type: StarRailBannerType,
uid: int | None = None,
*,
lang: str | None = None) ‑> Sequence[StarRailWarpPoolStat]
Expand source code
async def get_starrail_warp_pool_stats(
    self,
    banner_type: gacha_models.StarRailBannerType,
    uid: typing.Optional[int] = None,
    *,
    lang: typing.Optional[str] = None,
) -> typing.Sequence[models.StarRailWarpPoolStat]:
    """Get per-banner warp statistics for a banner type."""
    gacha_type = GACHA_TYPES[gacha_models.StarRailBannerType(banner_type)]
    data = await self._request_warp_records("pool_stat", uid, lang=lang, params={"gacha_type": gacha_type})
    return [models.StarRailWarpPoolStat(**card) for card in data["cards"]]

Get per-banner warp statistics for a banner type.

Inherited members