diff rlgterm.js @ 111:f56fdfeed01a

Replace taking over games with forced saves. Instead of reusing the id, just SIGHUP the game process. This works whether it is using polling, WebSockets, or dgamelaunch.
author John "Elwin" Edwards <elwin@sdf.org>
date Sun, 15 Jul 2012 22:33:44 -0700
parents 67b393f10c2b
children 4f2b89e6fde2
line wrap: on
line diff
--- a/rlgterm.js	Sun Jul 15 21:03:36 2012 -0700
+++ b/rlgterm.js	Sun Jul 15 22:33:44 2012 -0700
@@ -622,18 +622,20 @@
         acttext = "Resume your game";
       else if (reply.stat[gname] == "0")
         acttext = "Start a game";
-      else if (reply.stat[gname] == "p")
-        acttext = "Reconnect";
-      else if (reply.stat[gname] == "d")
-        acttext = "Game in progress (dgl)";
+      else if (reply.stat[gname] == "p" || reply.stat[gname] == "d")
+        acttext = "Force save";
       else
         continue;
       var button = document.createElement("span");
       button.appendChild(document.createTextNode(acttext));
-      if ("s0p".indexOf(reply.stat[gname]) >= 0) {
+      if ("s0".indexOf(reply.stat[gname]) >= 0) {
         button.onclick = makeStarter(gname);
         button.className = "ibutton";
       }
+      else {
+        button.onclick = makeStopper(gname);
+        button.className = "ibutton";
+      }
       var actdiv = document.createElement("div");
       actdiv.appendChild(button);
       var gamediv = document.createElement("div");
@@ -719,6 +721,44 @@
   return;
 }
 
+function makeStopper(gname) {
+  if (!(gname in games))
+    return null;
+  var game = games[gname];
+  function stopper(ev) {
+    stopgame(game);
+  }
+  return stopper;
+}
+
+function stopgame(game) {
+  if (!session.lcred)
+    return;
+  var stopmsg = {"key": session.lcred, "g": game.uname};
+  var req = new XMLHttpRequest();
+  req.onerror = errHandler;
+  req.onreadystatechange = function () {
+    if (req.readyState != 4 || req.status != 200) 
+      return;
+    var reply = JSON.parse(req.responseText);
+    if (reply.t == 'E') {
+      if (reply.c == 7)
+        message("That game has already stopped.");
+      else if (reply.c == 1) {
+        logout();
+        message("The server forgot about you, please log in again.", "warn");
+      }
+      else {
+        message("That game could not be stopped because: " + reply.s + 
+                "This might be a bug.", "warn");
+      }
+    }
+  }
+  req.open('POST', '/quit', true);
+  req.send(JSON.stringify(stopmsg));
+  return;
+}
+
 function wsStart(game) {
   var sockurl = "ws://" + window.location.host + "/play/" + game.uname;
   sockurl += "?key=" + session.lcred + "&w=80&h=24";