From c333706b75e27e00c1ce1fdecc0b2f38160c3fb2 Mon Sep 17 00:00:00 2001 From: Daniel Dolezal Date: Sun, 5 May 2024 20:54:56 +0200 Subject: [PATCH] add class to store the data in the EdgeDB --- statestorage/EdgeDB.py | 86 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 statestorage/EdgeDB.py diff --git a/statestorage/EdgeDB.py b/statestorage/EdgeDB.py new file mode 100644 index 0000000..bc16c30 --- /dev/null +++ b/statestorage/EdgeDB.py @@ -0,0 +1,86 @@ +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 insert(self, game_board:GameBoard): + game_type = game_board._get_type_of_gameboard() + + 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 + } + ), + 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, + calculations := >$calculations + } + ) + }""", + + 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, + winner=game_board.winner_snake_names if game_board.winner_snake_names else "", + moves=[ tuple([ele["turn"], ele["move"], json.dumps(ele["game_board"])]) for ele in game_board.turns ], + + 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__, + calculations=[ json.dumps(ele) for ele in game_board.snake_class.get_history() ], + ) + + def save(self, game_board:GameBoard): + self.insert(game_board) + + def __del__(self): + self.client.close()