Mercurial > hg > rlgwebd
changeset 94:597e9477b8ae
RLG-Web: Allow games to be taken over.
Make it possible to reconnect to a game if the user has left the page
without saving.
author | John "Elwin" Edwards <elwin@sdf.org> |
---|---|
date | Wed, 11 Jul 2012 10:30:33 -0700 |
parents | 104409bf5f03 |
children | e84a99712c62 |
files | rlgterm.js rlgwebd.js |
diffstat | 2 files changed, 51 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/rlgterm.js Wed Jul 11 07:37:56 2012 -0700 +++ b/rlgterm.js Wed Jul 11 10:30:33 2012 -0700 @@ -562,14 +562,14 @@ else if (reply.stat[gname] == "0") acttext = "Start a game"; else if (reply.stat[gname] == "p") - acttext = "Game in progress"; + acttext = "Reconnect"; else if (reply.stat[gname] == "d") acttext = "Game in progress (dgl)"; else continue; var button = document.createElement("span"); button.appendChild(document.createTextNode(acttext)); - if ("s0".indexOf(reply.stat[gname]) >= 0) { + if ("s0p".indexOf(reply.stat[gname]) >= 0) { button.onclick = makeStarter(gname); button.className = "ibutton"; } @@ -628,9 +628,20 @@ } else if (reply.t == 'E') { debug(1, "Could not start game: " + reply.s); - message("Your game could not be started: " + reply.s); if (reply.c == 1) { logout(); + message("The server forgot about you, please log in again."); + } + else if (reply.c == 4) { + message("You can't play that game because it is currently being " + + "played over SSH."); + } + else if (reply.c == 7) { + message("The game is being saved, try again in a few seconds."); + } + else { + message("The server says it can't start your game because \"" + + reply.s + "\". This is probably a bug."); } } };
--- a/rlgwebd.js Wed Jul 11 07:37:56 2012 -0700 +++ b/rlgwebd.js Wed Jul 11 10:30:33 2012 -0700 @@ -309,6 +309,23 @@ } tslog("Flushing queue for player %s", player.id); }; + this.reset = function () { + /* To be called when the game is taken over. */ + if (this.Qtimeout) { + clearTimeout(this.Qtimeout); + this.Qtimeout = null; + } + for (var i = 0; i < this.recvQ.length; i++) { + if (this.recvQ[i] !== undefined) { + this.session.write(this.recvQ[i]); + } + } + this.recvQ = []; + this.nrecv = 0; + this.nsend = 0; + this.sendQ = [{"t": "d", "n": this.nsend++, + "d": this.session.framebuf.toString("hex", 0, this.session.frameoff)}]; + }; this.quit = function() { if (this.alive) this.session.close(); @@ -611,7 +628,9 @@ } // A callback to pass to the game-in-progress checker. var launch = function(err, fname) { - if (fname) { + var nodematch = new RegExp("^" + username + ":node:"); + if (fname && (fname.match(nodematch) === null)) { + /* It's being played in dgamelaunch. */ sendError(res, 4, null); tslog("%s is already playing %s", username, gname); return; @@ -630,7 +649,23 @@ tslog("Unable to allocate TTY for %s", gname); } }; - new Player(gname, lkey, dims, respondlaunch); + if (fname) { + for (var cid in clients) { + cli = clients[cid]; + if ((cli instanceof Player) && + cli.session.pname == username && + cli.session.game.uname == gname) { + cli.reset(); + respondlaunch(cli, true); + tslog("Game %d has been taken over.", cli.session.sessid); + return; + } + } + sendError(res, 7); + } + else { + new Player(gname, lkey, dims, respondlaunch); + } }; checkprogress(username, games[gname], launch, []); }