Skip to content

Commit

Permalink
feat: Add mimo lottery support
Browse files Browse the repository at this point in the history
  • Loading branch information
seriaati committed Dec 16, 2024
1 parent 215dd7d commit 4cf0235
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 1 deletion.
35 changes: 35 additions & 0 deletions genshin/client/components/hoyolab.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
52 changes: 51 additions & 1 deletion genshin/models/hoyolab/mimo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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

0 comments on commit 4cf0235

Please sign in to comment.