Skip to content
Snippets Groups Projects
Commit 4dc3c523 authored by Nils G.'s avatar Nils G.
Browse files

Added API for submitting inputs from WebClient

parent b7c8f5d0
No related branches found
No related tags found
No related merge requests found
...@@ -91,7 +91,7 @@ def roles(): ...@@ -91,7 +91,7 @@ def roles():
#Update roles and prompts on server #Update roles and prompts on server
for uid in change: 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 #Update roles on clients
WEBSOCKET_SEND(room_record, "role", JSON_TO_B64(change)) WEBSOCKET_SEND(room_record, "role", JSON_TO_B64(change))
......
from parameter_util import JSON_BODY, JSON_CONTAINS 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 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 room_util import ROOM_GET_CODE, PLAYERS_GET
from cookie_util import COOKIE_SET from cookie_util import COOKIE_SET, COOKIE_GET
def create(): def create():
parameters = JSON_BODY(request) parameters = JSON_BODY(request)
...@@ -49,3 +49,42 @@ def create(): ...@@ -49,3 +49,42 @@ def create():
COOKIE_SET(player_record) COOKIE_SET(player_record)
return(SUCCESS()) 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())
import base64
db.define_table( db.define_table(
'Player', 'Player',
Field('room_id', db.Room, notnull=True), Field('room_id', db.Room, notnull=True),
Field('hashcode', 'string', notnull=True), Field('hashcode', 'string', notnull=True),
Field('name', 'string', notnull=True), Field('name', 'string', notnull=True),
Field('role', 'string', default="idle"), 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) Field('creation', 'datetime', default=request.now, notnull=True)
) )
......
from gluon import * from gluon import *
CODE_MISSING = 400 CODE_MISSING = 400
CODE_PERMISSION = 401
CODE_NOTFOUND = 404 CODE_NOTFOUND = 404
CODE_JSON = 406 CODE_JSON = 406
CODE_CONFLICT = 409 CODE_CONFLICT = 409
......
...@@ -32,3 +32,6 @@ def JSON_CONTAINS(_json, _list): ...@@ -32,3 +32,6 @@ def JSON_CONTAINS(_json, _list):
def JSON_TO_B64(_json): def JSON_TO_B64(_json):
return (base64.standard_b64encode(json.dumps(_json).encode("ascii")).decode("utf-8")) return (base64.standard_b64encode(json.dumps(_json).encode("ascii")).decode("utf-8"))
def B64_TO_JSON(_b64):
return (json.loads(base64.standard_b64decode(_b64)))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment