From d8517aee980f57bc7662837e4215f665b0406389 Mon Sep 17 00:00:00 2001 From: Nils G <nils.gondermann@ruhr-uni-bochum.de> Date: Tue, 21 Apr 2020 12:56:38 +0200 Subject: [PATCH] Safe submits in /game/roles persistently in player table --- controllers/game.py | 28 ++++++++++++++++++---------- models/i_players.py | 1 + static/renderer/debug.js | 10 ++++++++++ views/game/index.html | 2 ++ views/include/websocket.html | 2 ++ 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/controllers/game.py b/controllers/game.py index d91ff71..358c336 100644 --- a/controllers/game.py +++ b/controllers/game.py @@ -63,13 +63,17 @@ def roles(): return(FAIL(CODE_GONE)) players = PLAYERS_GET(room_record, True) - server_rolechange = {} - client_rolechange = {} + + + #=========================================== + #Parse Roles for each player + change = {} for player in players: playerid = str(player["id"]) if not playerid in user_roles: + #We do not have a role change for this player continue definition = user_roles[playerid] @@ -77,19 +81,23 @@ def roles(): if not isinstance(definition, dict): return(FAIL(CODE_MISSING)) - if not JSON_CONTAINS(definition, [("role", str)]): + if not JSON_CONTAINS(definition, [("role", str), ("submits", list)]): return(FAIL(CODE_MISSING)) - client_rolechange[player["uid"]] = {"role": definition["role"]} - - if player["role"] != definition["role"]: - server_rolechange[player["uid"]] = definition["role"] + for submit in definition["submits"]: + if not isinstance(submit, dict): + return(FAIL(CODE_MISSING)) - for uid in server_rolechange: - db(db.Player.id == uid).update(role=server_rolechange[uid]) + change[player["uid"]] = definition + #=========================================== - websocket_response = base64.standard_b64encode(json.dumps(client_rolechange).encode("ascii")).decode("utf-8") + #Update roles and submits on server + for uid in change: + submitString = base64.standard_b64encode(json.dumps(change[uid]["submits"]).encode("ascii")).decode("utf-8") + db(db.Player.id == uid).update(role=change[uid]["role"], submits=submitString) + #Update roles on clients + websocket_response = base64.standard_b64encode(json.dumps(change).encode("ascii")).decode("utf-8") WEBSOCKET_SEND(room_record, "role", websocket_response) json_response = {"status": "success"} diff --git a/models/i_players.py b/models/i_players.py index f9af041..2ec1252 100644 --- a/models/i_players.py +++ b/models/i_players.py @@ -4,6 +4,7 @@ db.define_table( Field('hashcode', 'string', notnull=True), Field('name', 'string', notnull=True), Field('role', 'string', default="idle"), + Field('submits', 'string', default=base64.standard_b64encode(b'[]'), notnull=True), Field('creation', 'datetime', default=request.now, notnull=True) ) diff --git a/static/renderer/debug.js b/static/renderer/debug.js index 41ab837..13b0006 100644 --- a/static/renderer/debug.js +++ b/static/renderer/debug.js @@ -47,6 +47,8 @@ function renderRole(_definition, _roleIdle) { $("#game_content").html(""); + var currentSubmit = submits[submitcount]; + for(var index in elements) { var element = elements[index]; @@ -56,6 +58,14 @@ function renderRole(_definition, _roleIdle) { var name = element["name"]; var value = element["value"]; + if(currentSubmit){ + for(var varname in currentSubmit){ + while(value.indexOf("$"+varname) != -1){ + value = value.replace("$"+varname, currentSubmit[varname]); + } + } + } + var e; switch(type) { case "text": diff --git a/views/game/index.html b/views/game/index.html index 6d1720a..74daff1 100644 --- a/views/game/index.html +++ b/views/game/index.html @@ -18,6 +18,8 @@ var playerid = "{{=player_record.id}}"; var role = "{{=player_record.role}}"; var roles = JSON.parse(atob('{{=XML(room_record.roles)}}')); + var submits = JSON.parse(atob('{{=XML(player_record.submits)}}'));; + var submitcount = 0; </script> {{block game_js}}{{end game_js}} diff --git a/views/include/websocket.html b/views/include/websocket.html index 4acf400..4453964 100644 --- a/views/include/websocket.html +++ b/views/include/websocket.html @@ -25,6 +25,8 @@ role_definition = JSON.parse(atob(data)); if(playerid in role_definition) { role = role_definition[playerid]["role"]; + submits = role_definition[playerid]["submits"]; + submitcount = 0; } break; default: -- GitLab