Display idle time of games in progress.

statusmsg() now includes games' idle times, and the client displays
them using getcurrent().
This commit is contained in:
John "Elwin" Edwards 2012-06-20 11:37:05 -07:00
parent f750d9eb34
commit 2d9c8bd011
3 changed files with 59 additions and 7 deletions

View file

@ -88,9 +88,9 @@
<div class="modal" id="current"> <div class="modal" id="current">
<div id="gametable" class="formtable"> <div id="gametable" class="formtable">
<div class="tcapt">Games in Progress</div> <div class="tcapt">Games in Progress</div>
<div><div>Player</div><div>Game</div><div>Actions</div></div> <div><div>Player</div><div>Game</div><div>Idle time</div><div>Actions</div></div>
</div> </div>
<div id="nogames">There are no games to watch.</div> <div id="nogames">No one is playing right now.</div>
<div class="rfloat"><span class="ibutton" onclick="getcurrent()">Refresh</span></div> <div class="rfloat"><span class="ibutton" onclick="getcurrent()">Refresh</span></div>
</div> </div>
<div class="modal" id="startgame"> <div class="modal" id="startgame">

View file

@ -453,6 +453,7 @@ function getcurrent() {
var cell1 = document.createElement("div"); var cell1 = document.createElement("div");
var cell2 = document.createElement("div"); var cell2 = document.createElement("div");
var cell3 = document.createElement("div"); var cell3 = document.createElement("div");
var cell4 = document.createElement("div");
cell1.appendChild(document.createTextNode(reply.g[i].p)); cell1.appendChild(document.createTextNode(reply.g[i].p));
var uname = reply.g[i].g; var uname = reply.g[i].g;
if (uname in games) if (uname in games)
@ -461,14 +462,16 @@ function getcurrent() {
debug(1, "Unrecognized game: " + uname); debug(1, "Unrecognized game: " + uname);
continue; continue;
} }
cell3.appendChild(document.createTextNode(idlestr(reply.g[i].i)));
var button = document.createElement("span"); var button = document.createElement("span");
button.appendChild(document.createTextNode("Watch")); button.appendChild(document.createTextNode("Watch"));
button.onclick = makeWatcher(reply.g[i].n); button.onclick = makeWatcher(reply.g[i].n);
button.className = "ibutton"; button.className = "ibutton";
cell3.appendChild(button); cell4.appendChild(button);
row.appendChild(cell1); row.appendChild(cell1);
row.appendChild(cell2); row.appendChild(cell2);
row.appendChild(cell3); row.appendChild(cell3);
row.appendChild(cell4);
gamediv.appendChild(row); gamediv.appendChild(row);
} }
}; };
@ -779,6 +782,22 @@ function textsize(larger) {
return; return;
} }
function idlestr(ms) {
if (typeof(ms) != "number")
return "?";
var seconds = Math.round(ms / 1000);
var ss = String(seconds % 60);
if (ss.length < 2)
ss = "0" + ss;
var mm = String(Math.floor((seconds % 3600) / 60));
if (mm.length < 2)
mm = "0" + mm;
var hh = String(Math.floor(seconds / 3600));
if (hh.length < 2)
hh = "0" + hh;
return hh + ":" + mm + ":" + ss;
}
function bell(on) { function bell(on) {
var imgnode = document.getElementById("bell"); var imgnode = document.getElementById("bell");
if (on) { if (on) {

View file

@ -801,7 +801,24 @@ function readFeed(client, res) {
} }
function statusmsg(req, res) { function statusmsg(req, res) {
var now = new Date();
var reply = {"s": allowlogin, "g": []}; var reply = {"s": allowlogin, "g": []};
function respond() {
res.writeHead(200, { "Content-Type": "application/json" });
if (req.method != 'HEAD')
res.write(JSON.stringify(reply));
res.end();
}
function idleset(i, idletime) {
if (i >= 0 && i < reply.g.length) {
reply.g[i].i = idletime;
}
for (var j = 0; j < reply.g.length; j++) {
if (!("i" in reply.g[j]))
return;
}
respond();
}
for (var sessid in sessions) { for (var sessid in sessions) {
var gamedesc = {}; var gamedesc = {};
gamedesc["n"] = sessid; gamedesc["n"] = sessid;
@ -809,10 +826,26 @@ function statusmsg(req, res) {
gamedesc["g"] = sessions[sessid].game.uname; gamedesc["g"] = sessions[sessid].game.uname;
reply["g"].push(gamedesc); reply["g"].push(gamedesc);
} }
res.writeHead(200, { "Content-Type": "application/json" }); if (reply.g.length == 0) {
if (req.method != 'HEAD') respond();
res.write(JSON.stringify(reply)); return;
res.end(); }
function makecallback(i) {
return function (err, stats) {
if (err)
idleset(i, null);
else
idleset(i, now - stats.mtime);
}
}
for (var i = 0; i < reply.g.length; i++) {
if (reply.g[i].n in sessions) {
fs.fstat(sessions[reply.g[i].n].record.fd, makecallback(i));
}
else {
idleset(i, null);
}
}
} }
function pstatusmsg(req, res) { function pstatusmsg(req, res) {