Add client-side support for watching dgamelaunch games.
This commit is contained in:
parent
7332b95a30
commit
2e0cec33ba
3 changed files with 37 additions and 25 deletions
|
|
@ -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>
|
||||||
|
|
|
||||||
36
rlgterm.js
36
rlgterm.js
|
|
@ -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) {
|
||||||
|
|
|
||||||
24
rlgwebd.js
24
rlgwebd.js
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue