from database.mongodb import get_collection from typing import Optional from pydantic import BaseModel from database.base_database_data import BaseDatabaseData from rail_proto.lib import ( Gender, PlayerBasicInfo, PlayerDetailInfo, PlatformType, PlayerRecordInfo ) players_collection = get_collection("players") class PositionModel(BaseModel): x: int y: int z: int class RotationModel(BaseModel): x: int y: int z: int class PlayerData(BaseDatabaseData): name: str = "" signature: str = "" birthday: int = 0 cur_basic_type: int = 8001 head_icon: int = 208001 phone_theme: int = 221000 chat_bubble: int = 220000 current_bgm: int = 210007 current_gender: Gender = Gender.GenderMan level: int = 70 exp: int = 0 world_level: int = 0 scoin: int = 0 # Credits hcoin: int = 0 # Jade mcoin: int = 0 # Crystals plane_id: int = 10000 floor_id: int = 10000000 entry_id: int = 100000104 cur_lineup: int = 0 pos: Optional[PositionModel] = PositionModel(x=0,y=0,z=0) rot: Optional[RotationModel] = RotationModel(x=0,y=0,z=0) def ToProto(self) -> PlayerBasicInfo: return PlayerBasicInfo( nickname=self.name, level=self.level, exp=self.exp, world_level=self.world_level, scoin=self.scoin, hcoin=self.hcoin, mcoin=self.mcoin, stamina=240 ) def ToDetailProto(self) -> PlayerDetailInfo: return PlayerDetailInfo( nickname=self.Name, level=self.Level, signature=self.Signature, is_banned=False, head_icon=self.HeadIcon, platform=PlatformType.PC, uid=self.uid, world_level=self.WorldLevel, record_info=PlayerRecordInfo() ) def create_player_data(self,name : str): try: self.name = name player_data = self.model_dump() players_collection.insert_one(player_data) return PlayerData(**player_data) except Exception as e: print(f"Error creating player data: {e}") return None def save_player_data(self): try: player_data = self.model_dump() player_data["uid"] = self.uid query = {"uid": self.uid} players_collection.update_one(query, {"$set": player_data}) return True except Exception as e: print(f"Error menyimpan data pemain: {e}") return False def find_player_by_uid(uid: int) -> Optional[PlayerData]: player_data = players_collection.find_one({"uid": uid}) if player_data: del player_data["_id"] return PlayerData(**player_data) return None