From 4cf0235b89e1868ced6423f5cebbbc72d7b8542d Mon Sep 17 00:00:00 2001 From: seria Date: Mon, 16 Dec 2024 14:01:30 +0900 Subject: [PATCH] feat: Add mimo lottery support --- genshin/client/components/hoyolab.py | 35 +++++++++++++++++++ genshin/models/hoyolab/mimo.py | 52 +++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/genshin/client/components/hoyolab.py b/genshin/client/components/hoyolab.py index 28a4fa55..5121d08d 100644 --- a/genshin/client/components/hoyolab.py +++ b/genshin/client/components/hoyolab.py @@ -380,3 +380,38 @@ async def get_mimo_point_count( if mimo_game is None: raise ValueError(f"Game {game!r} not found in the list of Traveling Mimo games.") return mimo_game.point + + @base.region_specific(types.Region.OVERSEAS) + async def get_mimo_lottery_info( + self, + *, + game_id: typing.Optional[int] = None, + version_id: typing.Optional[int] = None, + game: typing.Optional[typing.Union[typing.Literal["hoyolab"], types.Game]] = None, + lang: typing.Optional[str] = None, + ) -> models.MimoLotteryInfo: + """Get Traveling Mimo lottery info.""" + game_id, version_id = await self._parse_mimo_args(game_id, version_id, game) + data = await self.request( + routes.MIMO_URL.get_url() / "lottery-info", + params=dict(game_id=game_id, lang=lang or self.lang, version_id=version_id), + ) + return models.MimoLotteryInfo(**data) + + @base.region_specific(types.Region.OVERSEAS) + async def draw_mimo_lottery( + self, + *, + game_id: typing.Optional[int] = None, + version_id: typing.Optional[int] = None, + game: typing.Optional[typing.Union[typing.Literal["hoyolab"], types.Game]] = None, + lang: typing.Optional[str] = None, + ) -> models.MimoLotteryResult: + """Draw a Traveling Mimo lottery.""" + game_id, version_id = await self._parse_mimo_args(game_id, version_id, game) + data = await self.request( + routes.MIMO_URL.get_url() / "lottery", + data=dict(game_id=game_id, lang=lang or self.lang, version_id=version_id), + method="POST", + ) + return models.MimoLotteryResult(**data) diff --git a/genshin/models/hoyolab/mimo.py b/genshin/models/hoyolab/mimo.py index 4b491168..59831ee0 100644 --- a/genshin/models/hoyolab/mimo.py +++ b/genshin/models/hoyolab/mimo.py @@ -7,7 +7,18 @@ from genshin import types from genshin.models.model import Aliased, APIModel, DateTimeField -__all__ = ("MimoGame", "MimoShopItem", "MimoShopItemStatus", "MimoTask", "MimoTaskStatus", "MimoTaskType") +__all__ = ( + "MimoGame", + "MimoLotteryInfo", + "MimoLotteryResult", + "MimoLotteryReward", + "MimoShopItem", + "MimoShopItemStatus", + "MimoTask", + "MimoTaskStatus", + "MimoTaskType", + "PartialMimoLotteryReward", +) class MimoTaskStatus(enum.IntEnum): @@ -94,3 +105,42 @@ class MimoShopItem(APIModel): user_count: int next_refresh_time: datetime.timedelta expire_day: int + + +class PartialMimoLotteryReward(APIModel): + """Partial mimo lottery reward.""" + + type: int + icon: str + name: str + + +class MimoLotteryReward(PartialMimoLotteryReward): + """Mimo lottery reward.""" + + expire_day: int + + +class MimoLotteryInfo(APIModel): + """Mimo lottery info.""" + + current_point: int = Aliased("point") + cost: int + current_count: int = Aliased("count") + limit_count: int + rewards: typing.Sequence[MimoLotteryReward] = Aliased("award_list") + + +class MimoLotteryResult(APIModel): + """Mimo lottery result.""" + + reward: PartialMimoLotteryReward + reward_id: int = Aliased("award_id") + game_id: int + src_type: int + code: str = Aliased("exchange_code") + + @pydantic.model_validator(mode="before") + def __nest_reward(cls, v: typing.Dict[str, typing.Any]) -> typing.Dict[str, typing.Any]: + v["reward"] = {"type": v.pop("type"), "icon": v.pop("icon"), "name": v.pop("name")} + return v