From 6127c86ae7d26ab00078a2bcf2172f638c02e17f Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sun, 8 Jan 2023 16:17:18 +0100 Subject: [PATCH 1/3] server side game logic and moved data_persistance --- .../logic/data_persistance}/data/answer.py | 0 .../logic/data_persistance}/data/locales.py | 0 .../logic/data_persistance}/data/npc.py | 0 .../logic/data_persistance}/data/places.py | 0 .../logic/data_persistance}/data/questions.py | 0 .../logic/data_persistance}/data/reactions.py | 0 .../logic/data_persistance}/data/traits.py | 0 .../logic/data_persistance/data_access.py | 39 ++++++++++++ .../logic/data_persistance}/remote.py | 0 truthseeker/logic/data_persistance/secret.py | 3 + .../logic/data_persistance}/tables.py | 0 truthseeker/logic/game_logic.py | 59 +++++++++++++++++-- truthseeker/routes/routes_api.py | 20 +++++-- 13 files changed, 110 insertions(+), 11 deletions(-) rename {data_persistance => truthseeker/logic/data_persistance}/data/answer.py (100%) rename {data_persistance => truthseeker/logic/data_persistance}/data/locales.py (100%) rename {data_persistance => truthseeker/logic/data_persistance}/data/npc.py (100%) rename {data_persistance => truthseeker/logic/data_persistance}/data/places.py (100%) rename {data_persistance => truthseeker/logic/data_persistance}/data/questions.py (100%) rename {data_persistance => truthseeker/logic/data_persistance}/data/reactions.py (100%) rename {data_persistance => truthseeker/logic/data_persistance}/data/traits.py (100%) create mode 100644 truthseeker/logic/data_persistance/data_access.py rename {data_persistance => truthseeker/logic/data_persistance}/remote.py (100%) create mode 100644 truthseeker/logic/data_persistance/secret.py rename {data_persistance => truthseeker/logic/data_persistance}/tables.py (100%) diff --git a/data_persistance/data/answer.py b/truthseeker/logic/data_persistance/data/answer.py similarity index 100% rename from data_persistance/data/answer.py rename to truthseeker/logic/data_persistance/data/answer.py diff --git a/data_persistance/data/locales.py b/truthseeker/logic/data_persistance/data/locales.py similarity index 100% rename from data_persistance/data/locales.py rename to truthseeker/logic/data_persistance/data/locales.py diff --git a/data_persistance/data/npc.py b/truthseeker/logic/data_persistance/data/npc.py similarity index 100% rename from data_persistance/data/npc.py rename to truthseeker/logic/data_persistance/data/npc.py diff --git a/data_persistance/data/places.py b/truthseeker/logic/data_persistance/data/places.py similarity index 100% rename from data_persistance/data/places.py rename to truthseeker/logic/data_persistance/data/places.py diff --git a/data_persistance/data/questions.py b/truthseeker/logic/data_persistance/data/questions.py similarity index 100% rename from data_persistance/data/questions.py rename to truthseeker/logic/data_persistance/data/questions.py diff --git a/data_persistance/data/reactions.py b/truthseeker/logic/data_persistance/data/reactions.py similarity index 100% rename from data_persistance/data/reactions.py rename to truthseeker/logic/data_persistance/data/reactions.py diff --git a/data_persistance/data/traits.py b/truthseeker/logic/data_persistance/data/traits.py similarity index 100% rename from data_persistance/data/traits.py rename to truthseeker/logic/data_persistance/data/traits.py diff --git a/truthseeker/logic/data_persistance/data_access.py b/truthseeker/logic/data_persistance/data_access.py new file mode 100644 index 0000000..8236d62 --- /dev/null +++ b/truthseeker/logic/data_persistance/data_access.py @@ -0,0 +1,39 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import Session +from sqlalchemy import engine as eg +import random +import truthseeker.logic.data_persistance.tables as tables +from truthseeker.logic.data_persistance.secret import HOST, USER, PASS + +url_object = eg.URL.create( + "mariadb+pymysql", + username=USER, + password=PASS, + host=HOST, + port=6776, + database="truthInquiry", +) +engine = create_engine(url_object) +session = Session(engine) + +def getTextFromLid(lang,lid) -> str: + return session.query(tables.Locale).filter_by(LANG=lang, TEXT_ID=lid).one().TEXT + +def getRandomPlace() -> tables.Place: + return random.choice(session.query(tables.Place).all()) + +def getRandomNpc() -> tables.Npc : + return random.choice(session.query(tables.Npc).all()) + +def getNpcRandomTraitId(npc) -> int: + reactions = session.query(tables.Reaction).filter_by(NPC_ID=npc.NPC_ID).all() + reaction = random.choice(reactions) + return reaction.TRAIT_ID + +def getNpcRandomAnswer(npc, QA_TYPE) -> tables.Answer : + answers = session.query(tables.Answer).filter_by(QA_TYPE=QA_TYPE,NPC_ID=npc.NPC_ID).all() + return random.choice(answers) + +def getRandomQuestion(QA_TYPE) -> tables.Answer : + answers = session.query(tables.Question).filter_by(QUESTION_TYPE=QA_TYPE).all() + return random.choice(answers) diff --git a/data_persistance/remote.py b/truthseeker/logic/data_persistance/remote.py similarity index 100% rename from data_persistance/remote.py rename to truthseeker/logic/data_persistance/remote.py diff --git a/truthseeker/logic/data_persistance/secret.py b/truthseeker/logic/data_persistance/secret.py new file mode 100644 index 0000000..c31b0e7 --- /dev/null +++ b/truthseeker/logic/data_persistance/secret.py @@ -0,0 +1,3 @@ +HOST = "mariadb.simailadjalim.fr" +USER = "truthInquiry" +PASS = "truthInquiry" \ No newline at end of file diff --git a/data_persistance/tables.py b/truthseeker/logic/data_persistance/tables.py similarity index 100% rename from data_persistance/tables.py rename to truthseeker/logic/data_persistance/tables.py diff --git a/truthseeker/logic/game_logic.py b/truthseeker/logic/game_logic.py index b46f2f4..502a8d9 100644 --- a/truthseeker/logic/game_logic.py +++ b/truthseeker/logic/game_logic.py @@ -1,7 +1,8 @@ import string import random +from truthseeker.logic.data_persistance.data_access import * from datetime import datetime, timedelta -import truthseeker + # Map of all actively running games @@ -41,7 +42,7 @@ class Member: class Game: """ The game info class stores all information linked to a active game - + Game.game_id : str, the game identifier of the game Game.owner : Member, the game identifier of the game Game.members : Member[], the members of the game @@ -51,17 +52,21 @@ class Game: self.owner = None self.members = [] self.has_started = False + self.gamedata = {} def set_owner(self, username): self.owner = Member(username) self.members.append(self.owner) return self.owner + def generate_data(self): + self.gamedata = generateGameData("FR") + def get_member(self, username): for member in self.members: if member.username == username: return member - + def add_member(self, username): if self.get_member(username): return None @@ -88,7 +93,6 @@ def create_game(owner): game.members.append(Member(owner)) game.game_id = random_string(6) games_list[game.game_id] = game - #TODO ADD A WEBSOCKET IF THE GAME IS KNOWN TO BE MULTIPLAYER return game def get_game(game_id): @@ -110,4 +114,49 @@ def get_game_info(game_id): if game_id in games_list: return games_list[game_id] else: - return None \ No newline at end of file + return None + +def generateNpcData(npc: tables.Npc, lang: str) -> dict: + data = {} + data["name"] = getTextFromLid(lang, npc.NAME_LID) + data["QA_0"] = getTextFromLid(lang, getNpcRandomAnswer(npc,0).TEXT_LID) + data["QA_1"] = getTextFromLid(lang, getNpcRandomAnswer(npc,1).TEXT_LID) + data["R_0"] = getNpcRandomTraitId(npc) + data["R_1"] = getNpcRandomTraitId(npc) + return data + +def generatePlaceData(npcs :list, places: list, lang : str) -> dict: + data = {} + random.shuffle(npcs) + for place in places: + placedata = data[str(place.PLACE_ID)] = {} + placedata["name"] = getTextFromLid(lang,place.NAME_LID) + placedata["npcs"] = [] + for _ in npcs: + placedata["npcs"].append(npcs.pop().NPC_ID) + if len(placedata["npcs"]) == 2: break + return data + + +def generateGameData(LANG): + data = {} + data["npcs"] = {} + npcs = [] + while len(npcs) != 5: + npc = getRandomNpc() + if npc not in npcs : + npcs.append(npc) + for npc in npcs: + data["npcs"][str(npc.NPC_ID)] = generateNpcData(npc,LANG) + + places = [] + while len(places) != 3: + place = getRandomPlace() + if place not in places: + places.append(place) + + data["rooms"] = generatePlaceData(npcs,places,LANG) + data["questions"] = {} + data["questions"]["QA_0"] = getTextFromLid("FR",getRandomQuestion(0).TEXT_LID) + data["questions"]["QA_1"] = getTextFromLid("FR",getRandomQuestion(1).TEXT_LID) + return data diff --git a/truthseeker/routes/routes_api.py b/truthseeker/routes/routes_api.py index c18b6e1..13f6461 100644 --- a/truthseeker/routes/routes_api.py +++ b/truthseeker/routes/routes_api.py @@ -54,17 +54,25 @@ def start_game(): return {"error": 1, "msg": "No session"} if not flask.session["is_owner"]: return {"error": 1, "msg": "you are not the owner of this game"} - game = game_logic.get_game(flask.session["game_id"]) - if game == None: return {"error": 1, "msg": "this game doesn't exist"} - print(game.has_started) if game.has_started: return {"error": 1, "msg": "this game is already started"} - + game.generate_data() game.has_started = True - - return {"error": 0} + +@routes_api.route("/getGameData", methods=["GET", "POST"]) +def get_data(): + 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"} + + response = {} + response["error"] = 0 + response["gamedata"] = game.gamedata + return response \ No newline at end of file From 8db1c4c618dd60a6526091330765ddb884c18bf7 Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sun, 8 Jan 2023 16:28:28 +0100 Subject: [PATCH 2/3] added sqlalchemy in requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 4882615..a1cc025 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ Flask==2.2.2 pyjwt==2.6.0 Flask-SocketIO==5.3.2 +SQLAlchemy==1.4.20 From 47dd6a2bc85392068fdb2b0655085fdf648d82ef Mon Sep 17 00:00:00 2001 From: SIMAILA Djalim Date: Sun, 8 Jan 2023 16:29:48 +0100 Subject: [PATCH 3/3] added pymysql in requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index a1cc025..826c927 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ Flask==2.2.2 pyjwt==2.6.0 Flask-SocketIO==5.3.2 SQLAlchemy==1.4.20 +pymysql==1.0.2 \ No newline at end of file