diff --git a/requirements.txt b/requirements.txt index 4882615..826c927 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ 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 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 f9755c7..0b4a556 100644 --- a/truthseeker/logic/game_logic.py +++ b/truthseeker/logic/game_logic.py @@ -1,5 +1,6 @@ import string import random +from truthseeker.logic.data_persistance.data_access import * from datetime import datetime, timedelta from truthseeker import APP @@ -40,7 +41,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 @@ -50,17 +51,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 @@ -87,7 +92,6 @@ def create_game(owner): game.members.append(Member(owner)) game.game_id = random_string(6) APP.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): @@ -109,4 +113,49 @@ def get_game_info(game_id): if game_id in APP.games_list: return APP.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 5b74e25..a22ef7c 100644 --- a/truthseeker/routes/routes_api.py +++ b/truthseeker/routes/routes_api.py @@ -56,18 +56,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 - APP.socketio_app.emit("gamestart", {}, room="game."+game.game_id) - - 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