diff --git a/controllers/game.py b/controllers/game.py index 6459a99885db3088ecfa4a5d4fbdb18d7949ccfc..cc4b9e208219cfa8f29afa729650ebafa48342cf 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 fa366573dc82ddc3a312efd4989dd2b3a3fa50a3..92dd1ac03f2ebb0e5ddc39894c7c5e8f5f3ed8b2 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 a54e75331b77746b04a089971bed3b498b1823f6..893160982cc37df69093f5ad9c61a13d478ba86f 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 1d3d71d510a9c37563438e2fd7d56bb99ebd8ffc..ed4456dab8d21d789b06eddb3de8b3a8e59f5e8a 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 ce2c51bc1351761b6bf1b8cee9e3542af34f2a01..ea6aa3e33d04266c8596bb61ce210f2e5224f4e0 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)))