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_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 } ), 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 := ( with input_data := >> >$calculations for tupel_data in array_unpack(input_data) insert Calculations { turn := tupel_data.turn, data := tupel_data.data } ) } ) }""", 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=', '.join(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=[ tuple([ele["turn"], [json.dumps(calc) for calc in ele["data"]]]) 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()