From 1bcc552756fa69cfbc6e530ddb79379f3fb2cf41 Mon Sep 17 00:00:00 2001 From: Thomas Rubini <74205383+ThomasRubini@users.noreply.github.com> Date: Tue, 29 Nov 2022 12:07:14 +0100 Subject: [PATCH] make GameInfo object manages itself + /joinGame endpoint --- truthseeker/game_functions.py | 33 ++++++++++++++++++++++++++++++++- truthseeker/routes_api.py | 22 ++++++++++++++++++++-- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/truthseeker/game_functions.py b/truthseeker/game_functions.py index 8429a58..b15c44d 100644 --- a/truthseeker/game_functions.py +++ b/truthseeker/game_functions.py @@ -20,16 +20,32 @@ def random_string(length: int) ->str: """ return "".join(random.choice(string.ascii_letters) for _ in range(length)) +class Member: + """ + stores information related to the member of a given game + + Member.username : The username of this member + Member.socker : The reference to the socket to talk to this member + + """ + def __init__(self, username): + self.username = username + self.socket = None + class GameInfo: """ The game info class stores all information linked to a active game GameInfo.id : str, the game identifier of the game + GameInfo.owner : Member, the game identifier of the game + GameInfo.members : Member[], the members of the game """ def __init__(self): self.game_id = None + self.owner = None + self.members = [] - def gen_jwt(self, username, owner): + def _gen_jwt(self, username, owner): return jwt.encode( payload={ "game_id": self.game_id, @@ -41,6 +57,15 @@ class GameInfo: algorithm="HS256" ) + def set_owner(self, username): + self.owner = Member(username) + self.members.append(self.owner) + return self.owner, self._gen_jwt(username, owner=True) + + def add_member(self, username): + member = Member(username) + self.members.append(member) + return member, self._gen_jwt(username, owner=False) def create_game(): """ @@ -57,6 +82,12 @@ def create_game(): #TODO ADD A WEBSOCKET IF THE GAME IS KNOWN TO BE MULTIPLAYER return game +def get_game(game_id): + if game_id in game_lists: + return game_lists[game_id] + else: + return None + def get_game_info(game_id): """ This function retrieve a the GameInfo object linked to the game_id diff --git a/truthseeker/routes_api.py b/truthseeker/routes_api.py index fb0d041..023943c 100644 --- a/truthseeker/routes_api.py +++ b/truthseeker/routes_api.py @@ -8,7 +8,6 @@ api_routes = flask.Blueprint("api", __name__) def create_game(): username = flask.request.args.get("username") if username==None: - response = {} return {"status": "error, username not set"} @@ -16,9 +15,28 @@ def create_game(): response["status"] = "ok" game = game_functions.create_game() response["game_id"] = game.id - response["jwt"] = game.gen_jwt(username=username, owner=True) + owner, owner_jwt = game.set_owner(username=username) + response["jwt"] = owner_jwt return response +@api_routes.route("/joinGame") +def join_game(): + game_id = flask.request.args.get("game_id") + username = flask.request.args.get("username") + if game_id==None or username==None: + return {"status": "error, username or game id not set"} + + game = game_functions.get_game(game_id) + if game == None: + return {"status": "error, game does not exist"} + + member, member_jwt = game.add_member(username) + + response = {} + response["status"] = "ok" + response["jwt"] = member_jwt + return response + @api_routes.route("/getGameInfo") def get_game_info(): response = {}