From 83bcf4f19425ff09b03ca7dca2f5a9b6d9983afb Mon Sep 17 00:00:00 2001 From: Daniel Dolezal Date: Sun, 5 May 2024 17:02:18 +0200 Subject: [PATCH] make new LocalStorage Class and move save functions into it --- server/GameBoard.py | 62 ++++++------------------------------ server/Server.py | 4 ++- statestorage/LocalStorage.py | 56 ++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 53 deletions(-) create mode 100644 statestorage/LocalStorage.py diff --git a/server/GameBoard.py b/server/GameBoard.py index 9299d30..727b5c9 100644 --- a/server/GameBoard.py +++ b/server/GameBoard.py @@ -1,14 +1,6 @@ -from server.Files import save_file from datetime import datetime -import os 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): self.id = game_id self.width = width @@ -19,10 +11,11 @@ class GameBoard: # What will get Stored self.winner_snake_names = None self.now_date = datetime.now() - self.turns = {} + self.turns = [] self.is_ladder = True if source == "ladder" else False self.ruleset = ruleset self.map = map + self.url = self._get_game_url(True if ruleset["version"] == "cli" else False) # Setter Functions def _set_snakes(self, snakes:list[dict]): @@ -109,10 +102,13 @@ class GameBoard: # Function get Called from Server def snake_neat_make_a_move(self): move = self.snake_class.choose_move(self) - self.turns[self.turn] = { + + self.turns.append({ + "turn": self.turn, "move": move, "game_board": self.get_game_board_as_dict() - } + }) + return move # Save functions @@ -139,44 +135,6 @@ class GameBoard: return {"name": "constrictor", "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): - storage_folder = 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, 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) + def save(self, store_class, **kwargs): + store = store_class(**kwargs) + store.save(self) diff --git a/server/Server.py b/server/Server.py index 879e8ad..0f4ee9b 100644 --- a/server/Server.py +++ b/server/Server.py @@ -2,6 +2,8 @@ from server.Files import read_file from server.GameBoard import GameBoard from server.SnakeBuilder import SnakeBuilder +from statestorage.LocalStorage import LocalStorage + from flask import Flask from flask import request import logging, json, os, re @@ -133,8 +135,8 @@ class Server: 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: game_board.save( + LocalStorage, 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']]) diff --git a/statestorage/LocalStorage.py b/statestorage/LocalStorage.py new file mode 100644 index 0000000..85daf34 --- /dev/null +++ b/statestorage/LocalStorage.py @@ -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)