Mercurial > hg > rlgwebd
comparison rlgwebd.js @ 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 | e07f98799120 |
| children | 3dbfdaf62623 |
comparison
equal
deleted
inserted
replaced
| 93:104409bf5f03 | 94:597e9477b8ae |
|---|---|
| 307 var nextn = client.nrecv + client.recvQ.length + 1; | 307 var nextn = client.nrecv + client.recvQ.length + 1; |
| 308 client.Qtimeout = setTimeout(client.flushQ, 30000, client, nextn); | 308 client.Qtimeout = setTimeout(client.flushQ, 30000, client, nextn); |
| 309 } | 309 } |
| 310 tslog("Flushing queue for player %s", player.id); | 310 tslog("Flushing queue for player %s", player.id); |
| 311 }; | 311 }; |
| 312 this.reset = function () { | |
| 313 /* To be called when the game is taken over. */ | |
| 314 if (this.Qtimeout) { | |
| 315 clearTimeout(this.Qtimeout); | |
| 316 this.Qtimeout = null; | |
| 317 } | |
| 318 for (var i = 0; i < this.recvQ.length; i++) { | |
| 319 if (this.recvQ[i] !== undefined) { | |
| 320 this.session.write(this.recvQ[i]); | |
| 321 } | |
| 322 } | |
| 323 this.recvQ = []; | |
| 324 this.nrecv = 0; | |
| 325 this.nsend = 0; | |
| 326 this.sendQ = [{"t": "d", "n": this.nsend++, | |
| 327 "d": this.session.framebuf.toString("hex", 0, this.session.frameoff)}]; | |
| 328 }; | |
| 312 this.quit = function() { | 329 this.quit = function() { |
| 313 if (this.alive) | 330 if (this.alive) |
| 314 this.session.close(); | 331 this.session.close(); |
| 315 }; | 332 }; |
| 316 function openH(success, id) { | 333 function openH(success, id) { |
| 609 tslog("Request for nonexistant game \"%s\"", gname); | 626 tslog("Request for nonexistant game \"%s\"", gname); |
| 610 return; | 627 return; |
| 611 } | 628 } |
| 612 // A callback to pass to the game-in-progress checker. | 629 // A callback to pass to the game-in-progress checker. |
| 613 var launch = function(err, fname) { | 630 var launch = function(err, fname) { |
| 614 if (fname) { | 631 var nodematch = new RegExp("^" + username + ":node:"); |
| 632 if (fname && (fname.match(nodematch) === null)) { | |
| 633 /* It's being played in dgamelaunch. */ | |
| 615 sendError(res, 4, null); | 634 sendError(res, 4, null); |
| 616 tslog("%s is already playing %s", username, gname); | 635 tslog("%s is already playing %s", username, gname); |
| 617 return; | 636 return; |
| 618 } | 637 } |
| 619 // Game starting has been approved. | 638 // Game starting has been approved. |
| 628 else { | 647 else { |
| 629 sendError(res, 5, "Failed to open TTY"); | 648 sendError(res, 5, "Failed to open TTY"); |
| 630 tslog("Unable to allocate TTY for %s", gname); | 649 tslog("Unable to allocate TTY for %s", gname); |
| 631 } | 650 } |
| 632 }; | 651 }; |
| 633 new Player(gname, lkey, dims, respondlaunch); | 652 if (fname) { |
| 653 for (var cid in clients) { | |
| 654 cli = clients[cid]; | |
| 655 if ((cli instanceof Player) && | |
| 656 cli.session.pname == username && | |
| 657 cli.session.game.uname == gname) { | |
| 658 cli.reset(); | |
| 659 respondlaunch(cli, true); | |
| 660 tslog("Game %d has been taken over.", cli.session.sessid); | |
| 661 return; | |
| 662 } | |
| 663 } | |
| 664 sendError(res, 7); | |
| 665 } | |
| 666 else { | |
| 667 new Player(gname, lkey, dims, respondlaunch); | |
| 668 } | |
| 634 }; | 669 }; |
| 635 checkprogress(username, games[gname], launch, []); | 670 checkprogress(username, games[gname], launch, []); |
| 636 } | 671 } |
| 637 | 672 |
| 638 function watch(req, res, formdata) { | 673 function watch(req, res, formdata) { |
