Mercurial > hg > rlgwebd
changeset 163:0f6da35b27a0
RLGWebD: overhaul the list of current games.
The /status WebSocket now only sends a complete list when opened. At
40-second intervals, it sends a list of games that have been updated in
the last minute. The client now uses this to keep its own list.
author | John "Elwin" Edwards |
---|---|
date | Sun, 04 Jan 2015 16:55:57 -0500 |
parents | 5a7e7ec136c8 |
children | 3a97e4ee50f0 |
files | rlgterm.js rlgwebd.js |
diffstat | 2 files changed, 81 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/rlgterm.js Sat Jan 03 20:07:42 2015 -0500 +++ b/rlgterm.js Sun Jan 04 16:55:57 2015 -0500 @@ -40,6 +40,10 @@ var statDelta = 8000; /* A WebSocket to listen for status events. */ var statsock = null; +/* List of currently active games. */ +var currentList = []; +/* Last time the list was updated. */ +var currentTS = null; function writeData(hexstr) { var codenum; @@ -315,7 +319,6 @@ return; } -/* FIXME game list API has changed */ function tableCurrent(gamelist) { var gamediv = document.getElementById("gametable"); while (gamediv.children.length > 2) @@ -383,11 +386,54 @@ return; } if (msg.t == "t") { - tableCurrent(msg.g); + currentList = msg.g; + currentTS = new Date(); + tableCurrent(currentList); + } + else if (msg.t == "p") { + var now = new Date(); + var idletimes = {}; + for (var i = 0; i < msg.g.length; i++) { + var tag = msg.g[i].g + "/" + msg.g[i].p; + idletimes[tag] = msg.g[i].i; + } + for (var i = 0; i < currentList.length; i++) { + var tag = currentList[i].g + "/" + currentList[i].p; + if (tag in idletimes) { + currentList[i].i = idletimes[tag]; + } + else { + currentList[i].i += now - currentTS; + } + } + currentTS = now; + tableCurrent(currentList); } - else if ((msg.t == "b" || msg.t == "e") && - msg.p == sessionStorage.getItem("lname")) { - getchoices(); + else if (msg.t == "b") { + var justbegun = {}; + justbegun.g = msg.g; + justbegun.p = msg.p; + justbegun.i = 0; + currentList.push(justbegun); + tableCurrent(currentList); + if (msg.p == sessionStorage.getItem("lname")) { + getchoices(); + } + } + else if (msg.t == "e") { + var i = 0; + while (i < currentList.length) { + if (currentList[i].g == msg.g && currentList[i].p == msg.p) + break; + i++; + } + if (i < currentList.length) { + currentList.splice(i, 1); + } + tableCurrent(currentList); + if (msg.p == sessionStorage.getItem("lname")) { + getchoices(); + } } }; statsock.onclose = function (ev) {
--- a/rlgwebd.js Sat Jan 03 20:07:42 2015 -0500 +++ b/rlgwebd.js Sun Jan 04 16:55:57 2015 -0500 @@ -698,7 +698,6 @@ var statusinfo = {"s": allowlogin, "g": []}; for (var tag in sessions) { var gamedesc = {}; - gamedesc["tag"] = tag; gamedesc["p"] = sessions[tag].pname; gamedesc["g"] = sessions[tag].game.uname; gamedesc["i"] = now - sessions[tag].lasttime; @@ -706,7 +705,12 @@ } statusinfo["dgl"] = []; for (var tag in dglgames) { - statusinfo["dgl"].push(tag); + var dglinfo = {}; + var slash = tag.search('/'); + dglinfo["g"] = tag.slice(0, slash); + dglinfo["p"] = tag.slice(slash + 1); + dglinfo["i"] = -1; + statusinfo["dgl"].push(dglinfo); } callback(statusinfo); } @@ -973,12 +977,30 @@ wsRequest.reject(404, "No such resource."); } -/* TODO use a list instead */ +/* Only games with low idle time are included. Use getStatus() for the + * complete list. */ function pushStatus() { - getStatus(function(info) { - info["t"] = "t"; - gamemux.emit('list', info); - }); + var now = new Date(); + var statusinfo = {"t": "p", "s": allowlogin, "g": [], "dgl": []}; + for (var tag in sessions) { + var delta = now - sessions[tag].lasttime; + if (delta < 60000) { + var gamedesc = {}; + gamedesc["p"] = sessions[tag].pname; + gamedesc["g"] = sessions[tag].game.uname; + gamedesc["i"] = delta; + statusinfo["g"].push(gamedesc); + } + } + for (var tag in dglgames) { + var dglinfo = {}; + var slash = tag.search('/'); + dglinfo["g"] = tag.slice(0, slash); + dglinfo["p"] = tag.slice(slash + 1); + dglinfo["i"] = -1; + statusinfo["dgl"].push(dglinfo); + } + gamemux.emit('list', statusinfo); } function shutdown () { @@ -1067,6 +1089,6 @@ wsServer.on("request", wsHandler); tslog('WebSockets are online'); progressWatcher = startProgressWatcher(); - setInterval(pushStatus, 4000); + setInterval(pushStatus, 40000); });