From 0e0e61541423643577b7c2f6591a2e37fb3fe920 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Mon, 9 Jan 2023 11:49:50 +0100 Subject: [PATCH 1/3] added getNpcImage static --- .../logic/data_persistance/data_access.py | 10 +++++++ truthseeker/logic/game_logic.py | 21 +++++++++++-- truthseeker/routes/routes_api.py | 30 ++++++++++++++++++- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/truthseeker/logic/data_persistance/data_access.py b/truthseeker/logic/data_persistance/data_access.py index 8236d62..a50d0f5 100644 --- a/truthseeker/logic/data_persistance/data_access.py +++ b/truthseeker/logic/data_persistance/data_access.py @@ -37,3 +37,13 @@ def getNpcRandomAnswer(npc, QA_TYPE) -> tables.Answer : def getRandomQuestion(QA_TYPE) -> tables.Answer : answers = session.query(tables.Question).filter_by(QUESTION_TYPE=QA_TYPE).all() return random.choice(answers) + +def getTraitFromText(text): + trait_lid = session.query(tables.Locale).filter_by(TEXT=text).one().TEXT_ID + return session.query(tables.Trait).filter_by(NAME_LID=trait_lid).one().TRAIT_ID + +def getTraits(lang): + traits = [] + for trait in session.query(tables.Trait).all(): + traits.append(getTextFromLid(lang,trait.NAME_LID)) + return traits \ No newline at end of file diff --git a/truthseeker/logic/game_logic.py b/truthseeker/logic/game_logic.py index 935174c..dc75193 100644 --- a/truthseeker/logic/game_logic.py +++ b/truthseeker/logic/game_logic.py @@ -31,6 +31,7 @@ class Member: def __init__(self, username): self.username = username self.socket = None + self.progress = 0 def __str__(self) -> str: return "Member[username={}]".format(self.username) @@ -80,6 +81,12 @@ class Game: return 0 reaction_id = self.reaction_table[npc_id][int(reaction)] return read_image(f"./truthseeker/static/images/npc/{npc_id}/{reaction_id}.png") + + + def has_finished(self): + for member in self.members: + if member.progress != 5 : return False + return True def __str__(self) -> str: return "Game[game_id={}, owner={}, members={}]".format(self.game_id, self.owner, self.members) @@ -109,7 +116,11 @@ def get_game(game_id): return None def get_game_info(game_id): - """ + """ if not flask.session: + return {"error": 1, "msg": "No session"} + game = game_logic.get_game(flask.session["game_id"]) + if game == None: + return {"error": 1, "msg": "this game doesn't exist"} This function retrieve a the Game object linked to the game_id passed as parametter @@ -172,11 +183,17 @@ def generateGameData(LANG): data["questions"] = {} data["questions"]["QA_0"] = getTextFromLid("FR",getRandomQuestion(0).TEXT_LID) data["questions"]["QA_1"] = getTextFromLid("FR",getRandomQuestion(1).TEXT_LID) + data["traits"] = getTraits(LANG) return data, reactions_table - def read_image(path:str): try: return open(path, "rb").read() except: return 1 + +def getTraitIdFromString(trait): + return getTraitFromText(trait) + +def get_npc_image(npc_id): + return read_image(f"./truthseeker/static/images/npc/{npc_id}/0.png") \ No newline at end of file diff --git a/truthseeker/routes/routes_api.py b/truthseeker/routes/routes_api.py index 6da9a14..f4299ab 100644 --- a/truthseeker/routes/routes_api.py +++ b/truthseeker/routes/routes_api.py @@ -81,6 +81,17 @@ def get_data(): @routes_api.route("/getNpcImage", methods=["GET", "POST"]) def getNpcImage(): + npc_id = flask.request.values.get("npcid") + image = game_logic.get_npc_image(npc_id) + + response = flask.make_response(image) + response.headers.set('Content-Type', 'image/png') + response.headers.set( + 'Content-Disposition', 'attachment', filename=f'0.png') + return response + +@routes_api.route("/getNpcReaction", methods=["GET", "POST"]) +def getNpcReaction(): if not flask.session: return {"error": 1, "msg": "No session"} @@ -99,4 +110,21 @@ def getNpcImage(): response.headers.set('Content-Type', 'image/png') response.headers.set( 'Content-Disposition', 'attachment', filename=f'{reactionid}.png') - return response \ No newline at end of file + return response + +@routes_api.route("/gameProgress", methods=["GET", "POST"]) +def gameProgress(): + if not flask.session: + return {"error": 1, "msg": "No session"} + game = game_logic.get_game(flask.session["game_id"]) + + if game == None: + return {"error": 1, "msg": "this game doesn't exist"} + + username = flask.session["username"] + game.get_member(username).progress += 1 + + APP.socketio_app.emit("gameprogress", [flask.session["username"]], room="game."+game.game_id) + if game.has_finished() : APP.socketio_app.emit("gamefinshed",room="game."+game.game_id) + + return {"error": 0} From 71f5ee54dea0e3028bf14a8db831bed83a1f6820 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Mon, 9 Jan 2023 14:20:18 +0100 Subject: [PATCH 2/3] added answer check --- truthseeker/logic/game_logic.py | 16 ++++++++++++---- truthseeker/routes/routes_api.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/truthseeker/logic/game_logic.py b/truthseeker/logic/game_logic.py index dc75193..300efcb 100644 --- a/truthseeker/logic/game_logic.py +++ b/truthseeker/logic/game_logic.py @@ -32,6 +32,7 @@ class Member: self.username = username self.socket = None self.progress = 0 + self.has_submitted = False def __str__(self) -> str: return "Member[username={}]".format(self.username) @@ -82,6 +83,16 @@ class Game: reaction_id = self.reaction_table[npc_id][int(reaction)] return read_image(f"./truthseeker/static/images/npc/{npc_id}/{reaction_id}.png") + def getPlayerResults(self,responses: dict): + results = {} + try: + for npc_id in responses: + results[npc_id] = responses[npc_id] == str(self.reaction_table[npc_id]) + return results + except: + return False + + def has_finished(self): for member in self.members: @@ -142,10 +153,7 @@ def generateNpcText(npc: tables.Npc, lang: str) -> dict: return data def generateNpcReactions(npc : tables.Npc) ->list: - data = [] - data.append(getNpcRandomTraitId(npc)) - data.append(getNpcRandomTraitId(npc)) - return data + return getNpcRandomTraitId(npc) def generatePlaceData(npcs :list, places: list, lang : str) -> dict: data = {} diff --git a/truthseeker/routes/routes_api.py b/truthseeker/routes/routes_api.py index f4299ab..bce6fa8 100644 --- a/truthseeker/routes/routes_api.py +++ b/truthseeker/routes/routes_api.py @@ -1,5 +1,5 @@ import flask - +import json from truthseeker import APP from truthseeker.logic import game_logic from truthseeker.utils import check_username @@ -128,3 +128,30 @@ def gameProgress(): if game.has_finished() : APP.socketio_app.emit("gamefinshed",room="game."+game.game_id) return {"error": 0} + +@routes_api.route("/submitAnswers", methods=["GET", "POST"]) +def checkAnwser(): + if not flask.session: + return {"error": 1, "msg": "No session"} + game = game_logic.get_game(flask.session["game_id"]) + + if game == None: + return {"error": 1, "msg": "this game doesn't exist"} + + member = game.get_member(flask.session["username"]) + + if member.has_submitted == True: + return {"error": 1, "msg": "answers already submitted for this member"} + + playerResponses = flask.request.values.get("responses") + + if playerResponses == None: + return {"error": 1, "msg": "no responses were sent"} + results = game.getPlayerResults(json.loads(playerResponses)) + if results == False: + return {"error": 1, "msg": "invalid npc sent"} + + response = {"error": 0} + member.has_submitted = True + response["results"] = results + return response From fa6e81f529aa209b508844a46dd862b854346d87 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Mon, 9 Jan 2023 17:10:39 +0100 Subject: [PATCH 3/3] SubmitGameData done --- .../logic/data_persistance/data_access.py | 4 ++++ truthseeker/logic/game_logic.py | 19 ++++++++++++++++--- truthseeker/routes/routes_api.py | 12 ++++++++---- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/truthseeker/logic/data_persistance/data_access.py b/truthseeker/logic/data_persistance/data_access.py index a50d0f5..0141532 100644 --- a/truthseeker/logic/data_persistance/data_access.py +++ b/truthseeker/logic/data_persistance/data_access.py @@ -42,6 +42,10 @@ def getTraitFromText(text): trait_lid = session.query(tables.Locale).filter_by(TEXT=text).one().TEXT_ID return session.query(tables.Trait).filter_by(NAME_LID=trait_lid).one().TRAIT_ID +def getTraitFromTraitId(trait_id): + trait = session.query(tables.Trait).filter_by(TRAIT_ID=trait_id).one() + return trait + def getTraits(lang): traits = [] for trait in session.query(tables.Trait).all(): diff --git a/truthseeker/logic/game_logic.py b/truthseeker/logic/game_logic.py index 300efcb..801e0ca 100644 --- a/truthseeker/logic/game_logic.py +++ b/truthseeker/logic/game_logic.py @@ -32,7 +32,7 @@ class Member: self.username = username self.socket = None self.progress = 0 - self.has_submitted = False + self.results = None def __str__(self) -> str: return "Member[username={}]".format(self.username) @@ -60,6 +60,20 @@ class Game: self.owner = Member(username) self.members.append(self.owner) return self.owner + + def generateGameResults(self): + data = {} + npcs = data["npcs"] = {} + for npc_id in self.gamedata["npcs"]: + npcs[npc_id] = {} + npcs[npc_id]["name"] = self.gamedata["npcs"][npc_id]["name"] + traitId = self.reaction_table[npc_id] + trait = getTraitFromTraitId(traitId) + npcs[npc_id]["reaction"] = getTextFromLid("FR",trait.NAME_LID) + player_results = data["player"] = {} + for member in self.members: + player_results[member.username] = member.results + return data def generate_data(self): #TODO Get language from player @@ -91,12 +105,11 @@ class Game: return results except: return False - def has_finished(self): for member in self.members: - if member.progress != 5 : return False + if member.results == None : return False return True def __str__(self) -> str: diff --git a/truthseeker/routes/routes_api.py b/truthseeker/routes/routes_api.py index bce6fa8..df0e6db 100644 --- a/truthseeker/routes/routes_api.py +++ b/truthseeker/routes/routes_api.py @@ -125,7 +125,6 @@ def gameProgress(): game.get_member(username).progress += 1 APP.socketio_app.emit("gameprogress", [flask.session["username"]], room="game."+game.game_id) - if game.has_finished() : APP.socketio_app.emit("gamefinshed",room="game."+game.game_id) return {"error": 0} @@ -140,18 +139,23 @@ def checkAnwser(): member = game.get_member(flask.session["username"]) - if member.has_submitted == True: + if member.results != None: return {"error": 1, "msg": "answers already submitted for this member"} playerResponses = flask.request.values.get("responses") if playerResponses == None: return {"error": 1, "msg": "no responses were sent"} + results = game.getPlayerResults(json.loads(playerResponses)) if results == False: return {"error": 1, "msg": "invalid npc sent"} - response = {"error": 0} member.has_submitted = True - response["results"] = results + member.results = results + if game.has_finished(): + jsonGameResults = game.generateGameResults() + APP.socketio_app.emit("gamefinshed",jsonGameResults,room="game."+game.game_id) + response = {"error": 0} return response +