Add client-side support for watching dgamelaunch games.

This commit is contained in:
John "Elwin" Edwards 2015-01-14 07:44:22 -05:00
parent 7332b95a30
commit 2e0cec33ba
3 changed files with 37 additions and 25 deletions

View file

@ -101,7 +101,7 @@
<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>Idle time</div><div>Actions</div></div> <div><div>Player</div><div>Game</div><div>Source</div><div>Idle time</div><div>Actions</div></div>
</div> </div>
<div id="nogames">No one is playing right now.</div> <div id="nogames">No one is playing right now.</div>
</div> </div>

View file

@ -337,6 +337,7 @@ function tableCurrent(gamelist) {
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"); var cell4 = document.createElement("div");
var cell5 = document.createElement("div");
cell1.appendChild(document.createTextNode(gamelist[i].p)); cell1.appendChild(document.createTextNode(gamelist[i].p));
var uname = gamelist[i].g; var uname = gamelist[i].g;
if (uname in games) if (uname in games)
@ -344,16 +345,23 @@ function tableCurrent(gamelist) {
else { else {
continue; continue;
} }
cell3.appendChild(document.createTextNode(idlestr(gamelist[i].i))); var srcstr = "VR";
if (gamelist[i].c == "rlg")
srcstr = "Web";
else if (gamelist[i].c == "dgl")
srcstr = "SSH";
cell3.appendChild(document.createTextNode(srcstr));
cell4.appendChild(document.createTextNode(idlestr(gamelist[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(uname + "/" + gamelist[i].p); button.onclick = makeWatcher(uname + "/" + gamelist[i].p);
button.className = "ibutton"; button.className = "ibutton";
cell4.appendChild(button); cell5.appendChild(button);
row.appendChild(cell1); row.appendChild(cell1);
row.appendChild(cell2); row.appendChild(cell2);
row.appendChild(cell3); row.appendChild(cell3);
row.appendChild(cell4); row.appendChild(cell4);
row.appendChild(cell5);
gamediv.appendChild(row); gamediv.appendChild(row);
} }
} }
@ -413,6 +421,7 @@ function wsCurrent() {
var justbegun = {}; var justbegun = {};
justbegun.g = msg.g; justbegun.g = msg.g;
justbegun.p = msg.p; justbegun.p = msg.p;
justbegun.c = msg.c;
justbegun.i = 0; justbegun.i = 0;
currentList.push(justbegun); currentList.push(justbegun);
tableCurrent(currentList); tableCurrent(currentList);
@ -873,19 +882,20 @@ function textsize(larger) {
} }
function idlestr(ms) { function idlestr(ms) {
/* Minute accuracy is good enough. */
if (typeof(ms) != "number") if (typeof(ms) != "number")
return "?"; return "?";
var seconds = Math.round(ms / 1000); var minutes = Math.round(ms / 60000);
var ss = String(seconds % 60); if (minutes < 60)
if (ss.length < 2) return String(minutes) + " min";
ss = "0" + ss; var hours = Math.floor(minutes / 60);
var mm = String(Math.floor((seconds % 3600) / 60)); if (hours < 24)
if (mm.length < 2) return String(hours) + " hr " + String(minutes % 60) + " min";
mm = "0" + mm; var days = Math.floor(days / 24);
var hh = String(Math.floor(seconds / 3600)); if (days == 1)
if (hh.length < 2) return "1 day " + String(hours % 24) + " hr";
hh = "0" + hh; else
return hh + ":" + mm + ":" + ss; return String(days) + " days " + String(hours % 24) + " hr";
} }
function bell(on) { function bell(on) {

View file

@ -109,7 +109,7 @@ function TermSession(gname, pname, wsReq) {
tslog("%s playing %s (pid %d)", this.pname, this.game.uname, this.term.pid); tslog("%s playing %s (pid %d)", this.pname, this.game.uname, this.term.pid);
this.failed = false; this.failed = false;
sessions[this.game.uname + "/" + this.pname] = this; sessions[this.game.uname + "/" + this.pname] = this;
gamemux.emit('begin', this.game.uname, this.pname); gamemux.emit('begin', this.game.uname, this.pname, 'rlg');
/* Set up the lockfile and ttyrec */ /* Set up the lockfile and ttyrec */
this.lasttime = new Date(); this.lasttime = new Date();
var ts = timestamp(this.lasttime); var ts = timestamp(this.lasttime);
@ -345,6 +345,7 @@ function DglSession(filename) {
ss.fd = fd; ss.fd = fd;
ss.emit('open', true); ss.emit('open', true);
tslog("DGL %s: open", ss.tag()); tslog("DGL %s: open", ss.tag());
gamemux.emit('begin', ss.gname, ss.pname, 'dgl');
ss.readchunk(); ss.readchunk();
ss.recwatcher = fs.watch(ss.ttyrec, function (ev, finame) { ss.recwatcher = fs.watch(ss.ttyrec, function (ev, finame) {
if (ev == "change") if (ev == "change")
@ -368,6 +369,7 @@ function DglSession(filename) {
} }
fs.close(this.fd); fs.close(this.fd);
this.emit("close"); this.emit("close");
gamemux.emit('end', this.gname, this.pname);
tslog("DGL %s: closed", ss.tag()); tslog("DGL %s: closed", ss.tag());
}; };
this.watchers = []; this.watchers = [];
@ -820,22 +822,21 @@ function getStatus(callback) {
var now = new Date(); var now = new Date();
var statusinfo = {"s": allowlogin, "g": []}; var statusinfo = {"s": allowlogin, "g": []};
for (var tag in sessions) { for (var tag in sessions) {
var gamedesc = {}; var gamedesc = {"c": "rlg"};
gamedesc["p"] = sessions[tag].pname; gamedesc["p"] = sessions[tag].pname;
gamedesc["g"] = sessions[tag].game.uname; gamedesc["g"] = sessions[tag].game.uname;
gamedesc["i"] = now - sessions[tag].lasttime; gamedesc["i"] = now - sessions[tag].lasttime;
gamedesc["w"] = sessions[tag].watchers.length; gamedesc["w"] = sessions[tag].watchers.length;
statusinfo["g"].push(gamedesc); statusinfo["g"].push(gamedesc);
} }
statusinfo["dgl"] = [];
for (var tag in dglgames) { for (var tag in dglgames) {
var dglinfo = {}; var dglinfo = {"c": "dgl"};
var slash = tag.search('/'); var slash = tag.search('/');
dglinfo["g"] = tag.slice(0, slash); dglinfo["g"] = tag.slice(0, slash);
dglinfo["p"] = tag.slice(slash + 1); dglinfo["p"] = tag.slice(slash + 1);
dglinfo["i"] = now - dglgames[tag].lasttime; dglinfo["i"] = now - dglgames[tag].lasttime;
dglinfo["w"] = dglgames[tag].watchers.length; dglinfo["w"] = dglgames[tag].watchers.length;
statusinfo["dgl"].push(dglinfo); statusinfo["g"].push(dglinfo);
} }
callback(statusinfo); callback(statusinfo);
} }
@ -1084,8 +1085,9 @@ function wsHandler(wsRequest) {
conn.sendUTF(JSON.stringify(info)); conn.sendUTF(JSON.stringify(info));
}); });
} }
var beginH = function (gname, pname) { var beginH = function (gname, pname, client) {
conn.sendUTF(JSON.stringify({"t": "b", "p": pname, "g": gname})); conn.sendUTF(JSON.stringify({"t": "b", "c": client, "p": pname,
"g": gname}));
}; };
var listH = function (list) { var listH = function (list) {
conn.sendUTF(JSON.stringify(list)); conn.sendUTF(JSON.stringify(list));
@ -1112,11 +1114,11 @@ function wsHandler(wsRequest) {
* complete list. */ * complete list. */
function pushStatus() { function pushStatus() {
var now = new Date(); var now = new Date();
var statusinfo = {"t": "p", "s": allowlogin, "g": [], "dgl": []}; var statusinfo = {"t": "p", "s": allowlogin, "g": []};
for (var tag in sessions) { for (var tag in sessions) {
var delta = now - sessions[tag].lasttime; var delta = now - sessions[tag].lasttime;
if (delta < 60000) { if (delta < 60000) {
var gamedesc = {}; var gamedesc = {"c": "rlg"};
gamedesc["p"] = sessions[tag].pname; gamedesc["p"] = sessions[tag].pname;
gamedesc["g"] = sessions[tag].game.uname; gamedesc["g"] = sessions[tag].game.uname;
gamedesc["i"] = delta; gamedesc["i"] = delta;
@ -1127,13 +1129,13 @@ function pushStatus() {
for (var tag in dglgames) { for (var tag in dglgames) {
var delta = now - dglgames[tag].lasttime; var delta = now - dglgames[tag].lasttime;
if (delta < 60000) { if (delta < 60000) {
var dglinfo = {}; var dglinfo = {"c": "dgl"};
var slash = tag.search('/'); var slash = tag.search('/');
dglinfo["g"] = tag.slice(0, slash); dglinfo["g"] = tag.slice(0, slash);
dglinfo["p"] = tag.slice(slash + 1); dglinfo["p"] = tag.slice(slash + 1);
dglinfo["i"] = delta; dglinfo["i"] = delta;
dglinfo["w"] = dglgames[tag].watchers.length; dglinfo["w"] = dglgames[tag].watchers.length;
statusinfo["dgl"].push(dglinfo); statusinfo["g"].push(dglinfo);
} }
} }
gamemux.emit('list', statusinfo); gamemux.emit('list', statusinfo);