From 4dc3c523be8ef29a065bd9ec15a1cfd75cb5751f Mon Sep 17 00:00:00 2001
From: Nils G <nils.gondermann@ruhr-uni-bochum.de>
Date: Thu, 23 Apr 2020 13:21:55 +0200
Subject: [PATCH] Added API for submitting inputs from WebClient

---
 controllers/game.py       |  2 +-
 controllers/player.py     | 45 ++++++++++++++++++++++++++++++++++++---
 models/i_players.py       |  6 +++++-
 modules/http_util.py      |  1 +
 modules/parameter_util.py |  3 +++
 5 files changed, 52 insertions(+), 5 deletions(-)

diff --git a/controllers/game.py b/controllers/game.py
index 6459a99..cc4b9e2 100644
--- a/controllers/game.py
+++ b/controllers/game.py
@@ -91,7 +91,7 @@ def roles():
 
     #Update roles and prompts on server
     for uid in change:
-        db(db.Player.id == uid).update(role=change[uid]["role"], prompts=JSON_TO_B64(change[uid]["prompts"]))
+        db(db.Player.id == uid).update(role=change[uid]["role"], prompts=JSON_TO_B64(change[uid]["prompts"]), input_max=len(change[uid]["prompts"]), inputs=JSON_TO_B64([]))
 
     #Update roles on clients
     WEBSOCKET_SEND(room_record, "role", JSON_TO_B64(change))
diff --git a/controllers/player.py b/controllers/player.py
index fa36657..92dd1ac 100644
--- a/controllers/player.py
+++ b/controllers/player.py
@@ -1,7 +1,7 @@
-from parameter_util import JSON_BODY, JSON_CONTAINS
-from http_util import FAIL, SUCCESS, CODE_JSON, CODE_MISSING, CODE_SEMANTIC, CODE_GONE, CODE_NOTFOUND, CODE_CONFLICT
+from parameter_util import JSON_BODY, JSON_CONTAINS, JSON_TO_B64, B64_TO_JSON
+from http_util import FAIL, SUCCESS, CODE_JSON, CODE_MISSING, CODE_SEMANTIC, CODE_GONE, CODE_NOTFOUND, CODE_CONFLICT, CODE_PERMISSION
 from room_util import ROOM_GET_CODE, PLAYERS_GET
-from cookie_util import COOKIE_SET
+from cookie_util import COOKIE_SET, COOKIE_GET
 
 def create():
     parameters = JSON_BODY(request)
@@ -49,3 +49,42 @@ def create():
     COOKIE_SET(player_record)
 
     return(SUCCESS())
+
+
+def submit():
+    player_record, room_record = COOKIE_GET()
+
+    if not player_record or not room_record:
+        return(FAIL(CODE_PERMISSION))
+
+    if room_record.closed:
+        return(FAIL(CODE_GONE))
+
+    current_inputs = B64_TO_JSON(player_record.inputs)
+
+    #Check if the player has exceeded the maximum number of submits
+    if len(current_inputs) >= player_record.input_max:
+        return(FAIL(CODE_CONFLICT))
+
+    parameters = JSON_BODY(request)
+
+    if parameters == None:
+        return(FAIL(CODE_JSON))
+
+    if not JSON_CONTAINS(parameters, [('submit', str)]):
+        return(FAIL(CODE_MISSING))
+
+    new_input = {"submit": parameters["submit"]}
+
+    if JSON_CONTAINS(parameters, [('inputs', dict)]):
+        inputs = parameters["inputs"]
+        for key in inputs:
+            if not isinstance(inputs[key], str):
+                return(FAIL(CODE_MISSING))
+        new_input["inputs"] = inputs
+
+    #Insert new input into table
+    current_inputs.append(new_input)
+    db(db.Player.id == player_record.id).update(inputs=JSON_TO_B64(current_inputs))
+
+    return(SUCCESS())
diff --git a/models/i_players.py b/models/i_players.py
index a54e753..8931609 100644
--- a/models/i_players.py
+++ b/models/i_players.py
@@ -1,10 +1,14 @@
+import base64
+
 db.define_table(
     'Player',
     Field('room_id', db.Room, notnull=True),
     Field('hashcode', 'string', notnull=True),
     Field('name', 'string', notnull=True),
     Field('role', 'string', default="idle"),
-    Field('prompts', 'string', default=base64.standard_b64encode(b'[]'), notnull=True),
+    Field('prompts', 'text', default=base64.standard_b64encode(b'[]'), notnull=True),
+    Field('inputs', 'text', default=base64.standard_b64encode(b'[]'), notnull=True),
+    Field('input_max', 'integer', default=0, notnull=True),
     Field('creation', 'datetime', default=request.now, notnull=True)
 )
 
diff --git a/modules/http_util.py b/modules/http_util.py
index 1d3d71d..ed4456d 100644
--- a/modules/http_util.py
+++ b/modules/http_util.py
@@ -1,6 +1,7 @@
 from gluon import *
 
 CODE_MISSING = 400
+CODE_PERMISSION = 401
 CODE_NOTFOUND = 404
 CODE_JSON = 406
 CODE_CONFLICT = 409
diff --git a/modules/parameter_util.py b/modules/parameter_util.py
index ce2c51b..ea6aa3e 100644
--- a/modules/parameter_util.py
+++ b/modules/parameter_util.py
@@ -32,3 +32,6 @@ def JSON_CONTAINS(_json, _list):
 
 def JSON_TO_B64(_json):
     return (base64.standard_b64encode(json.dumps(_json).encode("ascii")).decode("utf-8"))
+
+def B64_TO_JSON(_b64):
+    return (json.loads(base64.standard_b64decode(_b64)))
-- 
GitLab