from server.GameBoard import GameBoard from datetime import datetime import edgedb, json class EdgeDB: def __init__(self, **kwargs): self.client = edgedb.create_client( tls_security="insecure" ) def insert_game_type(self, name:str, is_ladder:bool): return self.client.query_required_single(""" insert GameType { name := $name, is_ladder := $is_ladder }""", name=name, is_ladder=is_ladder ) def create_moves_with_calculations(self, game_board:GameBoard): data = [] moves = game_board.turns snake_calulations = [[calc for calc in ele["data"]] for ele in game_board.snake_class.get_history() ] for i in range(len(moves)): data.append({"turn": moves[i]["turn"], "move": moves[i]["move"], "game_board": moves[i]["game_board"], "calculations": snake_calulations[i]}) return data def insert(self, game_board:GameBoard): game_type = game_board.get_type_of_game() self.client.query(""" insert GameBoard { id := $id, url := $url, created_at := $created_at, turns := $turns, map := $map, winner := $winner, moves := ( with input_data := >>>$moves for data in array_unpack(input_data) insert Moves { turn := data.turn, snake_move := data.`move`, game_board := data.game_board, calculations := data.calculations } ), type := ( insert GameType { name := $game_type, is_ladder := $is_ladder } ), ruleset := ( insert Ruleset { name := $ruleset, version := $version, settings := to_json($settings) } ), snake := ( insert Snake { type := $snake_type } unless conflict on .type else Snake ) }""", id=game_board.id, url=game_board.url if game_board.url else "", created_at=datetime.fromtimestamp(game_board.now_date.timestamp(), game_board.now_date.astimezone().tzinfo), turns=game_board.turn, map=game_board.map if game_board.map else "standard", winner=', '.join(game_board.winner_snake_names) if game_board.winner_snake_names else "", moves=[ tuple([x["turn"], x["move"], json.dumps(x["game_board"]), [ json.dumps(ele) for ele in x["calculations"] ] ]) for x in self.create_moves_with_calculations(game_board) ], game_type=game_type["name"], is_ladder=game_type["is_ladder"], ruleset=game_board.ruleset["name"], version=game_board.ruleset["version"], settings=json.dumps(game_board.ruleset["settings"]), snake_type=game_board.snake_class.__class__.__name__, ) def save(self, game_board:GameBoard): self.insert(game_board) def __del__(self): self.client.close()