make new LocalStorage Class and move save functions into it

This commit is contained in:
2024-05-05 17:02:18 +02:00
parent ef4dca447f
commit 83bcf4f194
3 changed files with 69 additions and 53 deletions
+10 -52
View File
@@ -1,14 +1,6 @@
from server.Files import save_file
from datetime import datetime from datetime import datetime
import os
class GameBoard: class GameBoard:
save_folder_dict = {
"standart": "01_Standart",
"duel": "02_Duels",
"constrictor": "04_Constrictor",
}
def __init__(self, game_id:str, width:int, height:int, ruleset:dict, source:str, map:str, snake_class): def __init__(self, game_id:str, width:int, height:int, ruleset:dict, source:str, map:str, snake_class):
self.id = game_id self.id = game_id
self.width = width self.width = width
@@ -19,10 +11,11 @@ class GameBoard:
# What will get Stored # What will get Stored
self.winner_snake_names = None self.winner_snake_names = None
self.now_date = datetime.now() self.now_date = datetime.now()
self.turns = {} self.turns = []
self.is_ladder = True if source == "ladder" else False self.is_ladder = True if source == "ladder" else False
self.ruleset = ruleset self.ruleset = ruleset
self.map = map self.map = map
self.url = self._get_game_url(True if ruleset["version"] == "cli" else False)
# Setter Functions # Setter Functions
def _set_snakes(self, snakes:list[dict]): def _set_snakes(self, snakes:list[dict]):
@@ -109,10 +102,13 @@ class GameBoard:
# Function get Called from Server # Function get Called from Server
def snake_neat_make_a_move(self): def snake_neat_make_a_move(self):
move = self.snake_class.choose_move(self) move = self.snake_class.choose_move(self)
self.turns[self.turn] = {
self.turns.append({
"turn": self.turn,
"move": move, "move": move,
"game_board": self.get_game_board_as_dict() "game_board": self.get_game_board_as_dict()
} })
return move return move
# Save functions # Save functions
@@ -139,44 +135,6 @@ class GameBoard:
return {"name": "constrictor", "is_ladder": self.is_ladder} return {"name": "constrictor", "is_ladder": self.is_ladder}
return {"name": "standart", "is_ladder": self.is_ladder} return {"name": "standart", "is_ladder": self.is_ladder}
def _get_correct_folder_for_save_file(self, file_path:str, file_name:str, game_type:str, leader_board:bool, winner:bool): def save(self, store_class, **kwargs):
storage_folder = file_path store = store_class(**kwargs)
if leader_board: store.save(self)
storage_folder = os.path.join(storage_folder, "00_Leaderboards")
storage_folder = os.path.join(storage_folder, self.save_folder_dict[game_type])
storage_folder = os.path.join(storage_folder, self.now_date.strftime('%Y'), self.now_date.strftime('%m_%B'), self.now_date.strftime('%d'))
if winner:
storage_folder = os.path.join(storage_folder, "Winner")
else:
storage_folder = os.path.join(storage_folder, "Lost")
return os.path.join(storage_folder, file_name)
def save(self, file_path:str, callback=None, **kwargs):
game_type = self._get_type_of_gameboard()
save_file_path = self._get_correct_folder_for_save_file(
file_path,
f"{self.snake_class.__class__.__name__}_{datetime.now().strftime('%H-%M-%S')}_{self.id}.json",
game_type["name"],
game_type["is_ladder"],
True if self.winner_snake_names == "me" else False
)
save_file(save_file_path, {
"winner": self.winner_snake_names,
"game": {
"url": self._get_game_url(True if self.ruleset["version"] == "cli" else False),
"id": self.id,
"final_turns": self.turn,
"map": self.map,
"type": game_type,
"ruleset": self.ruleset,
},
"moves": self.turns,
"snake": {
"type": self.snake_class.__class__.__name__,
"calculations": self.snake_class.get_history(),
},
}, callback=callback, **kwargs)
+3 -1
View File
@@ -2,6 +2,8 @@ from server.Files import read_file
from server.GameBoard import GameBoard from server.GameBoard import GameBoard
from server.SnakeBuilder import SnakeBuilder from server.SnakeBuilder import SnakeBuilder
from statestorage.LocalStorage import LocalStorage
from flask import Flask from flask import Flask
from flask import request from flask import request
import logging, json, os, re import logging, json, os, re
@@ -133,8 +135,8 @@ class Server:
game_board = self._get_game_board(game_state, end=True) game_board = self._get_game_board(game_state, end=True)
if not game_board.get_winner() == "me" and not game_board.get_turn() <= self.store_game_when_win_and_moves_are_bigger_as: if not game_board.get_winner() == "me" and not game_board.get_turn() <= self.store_game_when_win_and_moves_are_bigger_as:
game_board.save( game_board.save(
LocalStorage,
file_path=os.path.join(self.data_path, 'data'), file_path=os.path.join(self.data_path, 'data'),
callback=json.dump, indent=2, ensure_ascii=False
) )
print("GAME ENDED: Winner is", [ x["name"] for x in game_state["board"]['snakes']]) print("GAME ENDED: Winner is", [ x["name"] for x in game_state["board"]['snakes']])
+56
View File
@@ -0,0 +1,56 @@
from server.GameBoard import GameBoard
from server.Files import save_file
import json, os
class LocalStorage:
def __init__(self, file_path:str):
self.save_folder_dict = {
"standart": "01_Standart",
"duel": "02_Duels",
"constrictor": "04_Constrictor",
}
self.file_path = file_path
def _get_correct_folder_for_save_file(self, game_board:GameBoard, file_name:str, game_type:str, leader_board:bool, winner:bool):
storage_folder = self.file_path
if leader_board:
storage_folder = os.path.join(storage_folder, "00_Leaderboards")
storage_folder = os.path.join(storage_folder, self.save_folder_dict[game_type])
storage_folder = os.path.join(storage_folder, game_board.now_date.strftime('%Y'), game_board.now_date.strftime('%m_%B'), game_board.now_date.strftime('%d'))
if winner:
storage_folder = os.path.join(storage_folder, "Winner")
else:
storage_folder = os.path.join(storage_folder, "Lost")
return os.path.join(storage_folder, file_name)
def save(self, game_board:GameBoard):
game_type = game_board._get_type_of_gameboard()
save_file_path = self._get_correct_folder_for_save_file(
game_board,
f"{game_board.snake_class.__class__.__name__}_{game_board.now_date.strftime('%H-%M-%S')}_{game_board.id}.json",
game_type["name"],
game_type["is_ladder"],
True if game_board.winner_snake_names == "me" else False
)
save_file(save_file_path, {
"winner": game_board.winner_snake_names,
"game": {
"url": game_board.url,
"id": game_board.id,
"final_turns": game_board.turn,
"map": game_board.map,
"type": game_type,
"ruleset": game_board.ruleset,
},
"moves": game_board.turns,
"snake": {
"type": game_board.snake_class.__class__.__name__,
"calculations": game_board.snake_class.get_history(),
},
}, callback=json.dump, indent=2, ensure_ascii=False)