diff rlgwebd.js @ 155:245a2959f504

Begin support for watching dgamelaunch games. watcher.c is a subprocess which uses inotify to watch the inprogress directories. A C program is used because node's fs.watch() can't tell the difference between creation and deletion.
author John "Elwin" Edwards
date Tue, 01 Apr 2014 11:23:25 -0700
parents bac9c3b01692
children 127f9e256d02
line wrap: on
line diff
--- a/rlgwebd.js	Tue Apr 01 09:20:11 2014 -0700
+++ b/rlgwebd.js	Tue Apr 01 11:23:25 2014 -0700
@@ -944,6 +944,38 @@
   return null;
 }
 
+function startProgressWatcher() {
+  var watchdirs = [];
+  for (var gname in games) {
+    watchdirs.push(path.join("/dgldir/inprogress", gname));
+  }
+  var subproc = child_process.spawn("/bin/watcher", watchdirs);
+  subproc.stdout.setEncoding('utf8');
+  subproc.stdout.on('data', function (chunk) {
+    var fname = chunk.slice(2, -1);
+    var filere = /.*\/([^\/]*)\/([^\/:]*):(node:)?(.*)/;
+    var matchresult = fname.match(filere);
+    if (!matchresult || matchresult[3])
+      return;
+    gname = matchresult[1];
+    pname = matchresult[2];
+    if (chunk[0] == "E") {
+      tslog("DGL: %s is playing %s: %s", pname, gname, fname)
+    }
+    else if (chunk[0] == "C") {
+      tslog("DGL: %s started playing %s: %s", pname, gname, fname)
+    }
+    else if (chunk[0] == "D") {
+      tslog("DGL: %s finished playing %s: %s", pname, gname, fname)
+    }
+    else {
+      tslog("Watcher says: %s", chunk)
+    }
+  });
+  subproc.stdout.resume();
+  return subproc;
+}
+
 function serveStatic(req, res, fname) {
   var nname = path.normalize(fname);
   if (nname == "" || nname == "/")
@@ -1374,6 +1406,7 @@
     for (var sessid in sessions) {
       sessions[sessid].close();
     }
+    progressWatcher.stdin.end("\n");
     setTimeout(shutdown, 2000);
   }
 }
@@ -1396,6 +1429,7 @@
 
 var httpServer; // declare here so shutdown() can find it
 var wsServer;
+var progressWatcher;
 
 /* This could be nonblocking, but nothing else can start yet anyway. */
 if (fs.existsSync(ctlsocket)) {
@@ -1433,6 +1467,7 @@
   wsServer = new WebSocketServer({"httpServer": httpServer});
   wsServer.on("request", wsHandler);
   tslog('WebSockets are online'); 
+  progressWatcher = startProgressWatcher();
   setInterval(pushStatus, 4000);
 });