PamGram/modules/gacha_log/models.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

173 lines
4.3 KiB
Python
Raw Normal View History

import datetime
from enum import Enum
from typing import Any, Dict, List, Union
from pydantic import BaseModel, validator
2023-04-27 12:25:06 +00:00
from metadata.shortname import not_real_roles, roleToId, lightConeToId
from modules.gacha_log.const import UIWF_VERSION
class ImportType(Enum):
2023-03-31 06:01:03 +00:00
PaiGram = "PaiGram"
2023-04-27 12:25:06 +00:00
UIWF = "UIWF"
UNKNOWN = "UNKNOWN"
class FiveStarItem(BaseModel):
name: str
icon: str
count: int
type: str
isUp: bool
isBig: bool
time: datetime.datetime
class FourStarItem(BaseModel):
name: str
icon: str
count: int
type: str
time: datetime.datetime
class GachaItem(BaseModel):
id: str
name: str
gacha_type: str
item_type: str
rank_type: str
time: datetime.datetime
@validator("name")
def name_validator(cls, v):
2023-04-27 12:25:06 +00:00
if item_id := (roleToId(v) or lightConeToId(v)):
if item_id not in not_real_roles:
return v
raise ValueError("Invalid name")
@validator("gacha_type")
def check_gacha_type(cls, v):
2023-04-27 12:25:06 +00:00
if v not in {"1", "2", "11", "12"}:
raise ValueError("gacha_type must be 1, 2, 11 or 12")
return v
@validator("item_type")
def check_item_type(cls, item):
2023-04-27 12:25:06 +00:00
if item not in {"角色", "光锥"}:
raise ValueError("error item type")
return item
@validator("rank_type")
def check_rank_type(cls, rank):
if rank not in {"5", "4", "3"}:
raise ValueError("error rank type")
return rank
class GachaLogInfo(BaseModel):
user_id: str
uid: str
update_time: datetime.datetime
import_type: str = ""
item_list: Dict[str, List[GachaItem]] = {
2023-04-27 12:25:06 +00:00
"角色跃迁": [],
"光锥跃迁": [],
"常驻跃迁": [],
"新手跃迁": [],
}
@property
def get_import_type(self) -> ImportType:
try:
return ImportType(self.import_type)
except ValueError:
return ImportType.UNKNOWN
class Pool:
def __init__(self, five: List[str], four: List[str], name: str, to: str, **kwargs):
self.five = five
self.real_name = name
self.name = "".join(self.five)
self.four = four
self.from_ = kwargs.get("from")
self.to = to
self.from_time = datetime.datetime.strptime(self.from_, "%Y-%m-%d %H:%M:%S")
self.to_time = datetime.datetime.strptime(self.to, "%Y-%m-%d %H:%M:%S")
self.start = self.from_time
self.start_init = False
self.end = self.to_time
self.dict = {}
self.count = 0
def parse(self, item: Union[FiveStarItem, FourStarItem]):
if self.from_time <= item.time <= self.to_time:
if self.dict.get(item.name):
self.dict[item.name]["count"] += 1
else:
self.dict[item.name] = {
"name": item.name,
"icon": item.icon,
"count": 1,
"rank_type": 5 if isinstance(item, FiveStarItem) else 4,
}
def count_item(self, item: List[GachaItem]):
for i in item:
if self.from_time <= i.time <= self.to_time:
self.count += 1
if not self.start_init:
self.start = i.time
2022-10-29 07:39:06 +00:00
self.start_init = True
self.end = i.time
def to_list(self):
return list(self.dict.values())
class ItemType(Enum):
CHARACTER = "角色"
2023-04-27 12:25:06 +00:00
LIGHTCONE = "光锥"
2023-04-27 12:25:06 +00:00
class UIWFGachaType(Enum):
BEGINNER = "2"
STANDARD = "1"
CHARACTER = "11"
LIGHTCONE = "12"
2023-04-27 12:25:06 +00:00
class UIWFItem(BaseModel):
id: str
name: str
count: str = "1"
2023-04-27 12:25:06 +00:00
gacha_type: UIWFGachaType
item_id: str = ""
item_type: ItemType
rank_type: str
time: str
2023-04-27 12:25:06 +00:00
uigf_gacha_type: UIWFGachaType
2023-04-27 12:25:06 +00:00
class UIWFInfo(BaseModel):
uid: str = "0"
lang: str = "zh-cn"
export_time: str = ""
export_timestamp: int = 0
export_app: str = ""
export_app_version: str = ""
2023-04-27 12:25:06 +00:00
uigf_version: str = UIWF_VERSION
def __init__(self, **data: Any):
super().__init__(**data)
if not self.export_time:
self.export_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.export_timestamp = int(datetime.datetime.now().timestamp())
2023-04-27 12:25:06 +00:00
class UIWFModel(BaseModel):
info: UIWFInfo
list: List[UIWFItem]