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