57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
"""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 |