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