diff --git a/controllers/game.py b/controllers/game.py index c71456415bef24120addf6ad6f483d17a23ab8d7..828b473c5d7c6e14f3738299b55e77050c7f579b 100644 --- a/controllers/game.py +++ b/controllers/game.py @@ -1,6 +1,6 @@ from parameter_util import JSON_BODY, JSON_CONTAINS, JSON_TO_B64 from http_util import FAIL, CODE_JSON, CODE_MISSING, CODE_SEMANTIC, CODE_GONE, CODE_CONFLICT -from room_util import ROOM_GET, PLAYERS_GET +from room_util import ROOM_GET, PLAYERS_GET, ROOM_HEARTBEAT from websocket_util import WEBSOCKET_SEND def start(): @@ -28,6 +28,8 @@ def start(): if room_record.closed: return(FAIL(CODE_GONE)) + ROOM_HEARTBEAT(room_record) + rolesB64 = JSON_TO_B64(roles) db(db.Room.id == room_record.id).update(started=True, roles=rolesB64) @@ -59,6 +61,8 @@ def roles(): if room_record.closed: return(FAIL(CODE_GONE)) + ROOM_HEARTBEAT(room_record) + players = PLAYERS_GET(room_record, True) diff --git a/controllers/room.py b/controllers/room.py index 6bfad97089ced769b3479d7a8e0e353ef9d5794c..9c21f034b43942e5bc61f7001ab365fbd136a713 100644 --- a/controllers/room.py +++ b/controllers/room.py @@ -1,7 +1,6 @@ from parameter_util import JSON_BODY, JSON_CONTAINS from http_util import FAIL, CODE_JSON, CODE_MISSING, CODE_SEMANTIC, CODE_GONE -from room_util import ROOM_GET, PLAYERS_GET, ROOM_CLOSE -from websocket_util import WEBSOCKET_SEND +from room_util import ROOM_GET, PLAYERS_GET, ROOM_CLOSE, ROOM_HEARTBEAT import random @@ -46,6 +45,8 @@ def status(): if room_record.closed: return(FAIL(CODE_GONE)) + ROOM_HEARTBEAT(room_record) + players = PLAYERS_GET(room_record) json_response = {"players": players} @@ -74,7 +75,4 @@ def close(): ROOM_CLOSE(room_record) - #Force reload on clients - WEBSOCKET_SEND(room_record, "reload", "") - return(response.json({"status": "success"})) diff --git a/models/c_meta.py b/models/c_meta.py index 2bd3f0780528cb1afdf783c9e9812f1d6319e16c..72777cad3ffea67e7775d4d8dd84bde5a1799f96 100644 --- a/models/c_meta.py +++ b/models/c_meta.py @@ -4,7 +4,8 @@ db.define_table( 'Meta', Field('creation', 'datetime', default=request.now), Field('git_commit', 'string'), - Field('git_date', 'string') + Field('git_date', 'string'), + Field('schedule', 'datetime', default=request.now) ) def getGitCommit(_record): diff --git a/models/z_schedule.py b/models/z_schedule.py new file mode 100644 index 0000000000000000000000000000000000000000..ca3f7beef3e441289122fed1ab5308a610704c73 --- /dev/null +++ b/models/z_schedule.py @@ -0,0 +1,14 @@ +from room_util import ROOM_CLOSE + +if db(db.Meta).count() > 0: + seconds_passed = (request.now - db(db.Meta).select().first().schedule).total_seconds() + + #Periodically clear stale rooms + if seconds_passed >= 60: + db(db.Meta).update(schedule=request.now) + + td = request.now - timedelta(seconds=60) + + stale_rooms = db((db.Room.closed == False) & (db.Room.heartbeat <= td)).select() + for room in stale_rooms: + ROOM_CLOSE(room) diff --git a/modules/room_util.py b/modules/room_util.py index ac265091b2c1977787ed94e5f7839e964c717f1b..907001743f799cabe6f2cf7c116c01a26fa033b6 100644 --- a/modules/room_util.py +++ b/modules/room_util.py @@ -1,5 +1,6 @@ from gluon import * from parameter_util import B64_TO_JSON +from websocket_util import WEBSOCKET_SEND def ROOM_GET(_id, _password): room_record = current.db(current.db.Room.id == _id).select().first() @@ -18,6 +19,8 @@ def ROOM_GET_CODE(_code): return(room_record) +def ROOM_HEARTBEAT(_room): + current.db(current.db.Room.id == _room.id).update(heartbeat=current.request.now) def ROOM_CLOSE(_room): players = PLAYERS_GET(_room, True) @@ -27,6 +30,9 @@ def ROOM_CLOSE(_room): for player in players: current.db(current.db.Player.id == player["uid"]).update(prompts="", inputs="") + #Force reload on clients + WEBSOCKET_SEND(_room, "reload", "") + def PLAYERS_GET(_room, _uid=False): rows = current.db(current.db.Player.room_id == _room.id).select(orderby=current.db.Player.id)