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.
This commit is contained in:
John "Elwin" Edwards 2012-07-15 22:33:44 -07:00
parent a847191450
commit a0be18657b
2 changed files with 84 additions and 5 deletions

View file

@ -896,6 +896,42 @@ function endgame(client, res) {
return;
}
/* Stops a running game if the request has the proper key. */
function stopgame(res, formdata) {
if (!("key" in formdata) || !(formdata["key"] in logins)) {
sendError(res, 1);
return;
}
var pname = logins[formdata["key"]].name;
if (!("g" in formdata) || !(formdata["g"] in games)) {
sendError(res, 2, "No such game.");
return;
}
var gname = formdata["g"];
function checkback(err, fname) {
if (!fname) {
sendError(res, 7);
return;
}
var fullfile = path.join("/dgldir/inprogress-" + gname, fname);
fs.readFile(fullfile, "utf8", function(err, fdata) {
if (err) {
sendError(res, 7);
return;
}
var pid = parseInt(fdata.split('\n')[0], 10);
process.kill(pid, 'SIGHUP');
/* The response doesn't mean that the game is gone. The only way
* to make sure a dgamelaunch-supervised game is over would be to
* poll fname until it disappears. */
res.writeHead(200, {'Content-Type': 'application/json'});
res.write(JSON.stringify({"t": "q"}));
res.end();
});
}
checkprogress(pname, games[gname], checkback, []);
}
function findClient(formdata, playersOnly) {
if (typeof(formdata) != "object")
return null;
@ -1125,6 +1161,9 @@ function webHandler(req, res) {
else if (target == "/watch") {
watch(req, res, formdata);
}
else if (target == "/quit") {
stopgame(res, formdata);
}
else {
res.writeHead(405, resheaders);
res.end();