from __future__ import annotations import json from typing import Optional, TypeVar from pydantic import Field from pydantic.generics import GenericModel from hopper.api.dto import BaseModel, BoardDto, DestinationDto, PlayerDto, PositionDto from hopper.enums import ObjectType class LayerObjectDto(BaseModel): type: ObjectType = Field(..., alias="type_") position: PositionDto class LayerDto(BaseModel): name: str objects: list[LayerObjectDto] class ProductDto(BaseModel): name: str uuid: str description: Optional[str] = None class GameDumpPlayerDto(PlayerDto): ... class GameDumpDto(BaseModel): board: BoardDto destination: DestinationDto players: list[GameDumpPlayerDto] layers: list[LayerDto] class ProductPurchaseStartDto(BaseModel): products: list[ProductDto] class ProductPurchaseDoneDto(BaseModel): product: Optional[ProductDto] = None TMessageData = TypeVar("TMessageData", bound=BaseModel) class WSMessage(GenericModel): message: str data: Optional[TMessageData] = None def __str__(self) -> str: return self.to_str() def to_str(self) -> str: return json.dumps(self.dict()) class WSGameDumpMessage(WSMessage): message: str = "game_dump" data: GameDumpDto class WSProductPurchaseStart(WSMessage): message: str = "product_purchase_start" data: ProductPurchaseStartDto class WSProductPurchaseDone(WSMessage): message: str = "product_purchase_done" data: ProductPurchaseDoneDto