"""Card data models""" from datetime import datetime from enum import Enum from typing import Optional from pydantic import BaseModel, Field class CardRarity(str, Enum): """カードのレアリティ""" NORMAL = "normal" RARE = "rare" SUPER_RARE = "super_rare" KIRA = "kira" # キラカード(0.1%) UNIQUE = "unique" # uniqueカード(0.0001%) class CardBase(BaseModel): """カードの基本情報""" id: int = Field(..., ge=0, le=15, description="カード種類ID (0-15)") cp: int = Field(..., ge=1, le=999, description="カードパワー") status: CardRarity = Field(default=CardRarity.NORMAL, description="レアリティ") skill: Optional[str] = Field(None, description="スキル情報") class Card(CardBase): """所有カード情報""" owner_did: str = Field(..., description="所有者のatproto DID") obtained_at: datetime = Field(default_factory=datetime.utcnow, description="取得日時") is_unique: bool = Field(default=False, description="uniqueカードフラグ") unique_id: Optional[str] = Field(None, description="unique時のグローバルID") class Config: json_encoders = { datetime: lambda v: v.isoformat() } class CardDraw(BaseModel): """カード抽選リクエスト""" user_did: str = Field(..., description="ユーザーのDID") is_paid: bool = Field(default=False, description="課金ガチャかどうか") class CardDrawResult(BaseModel): """カード抽選結果""" card: Card is_new: bool = Field(..., description="新規取得かどうか") animation_type: str = Field(..., description="演出タイプ") class UniqueCardRegistry(BaseModel): """uniqueカードの登録情報""" card_id: int unique_id: str owner_did: str obtained_at: datetime verse_skill_id: Optional[str] = None