annotate rlgwebd.js @ 170:50e4c9feeac2

RLGWebD: fix simultaneous player bug. Multiple games can now run at the same time, and data will be sent to the proper place. The interaction of multiple players with watchers has not yet been tested.
author John "Elwin" Edwards
date Fri, 09 Jan 2015 13:06:41 -0500
parents 6f4b7e1b32e8
children 671bed5039aa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1 #!/usr/bin/env node
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
2
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
3 var http = require('http');
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
4 var net = require('net');
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
5 var url = require('url');
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
6 var path = require('path');
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
7 var fs = require('fs');
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
8 var events = require('events');
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
9 var child_process = require('child_process');
141
1a156a7746a7 RLGWebD: use NODE_PATH to find modules.
John "Elwin" Edwards
parents: 139
diff changeset
10 // Dependencies
1a156a7746a7 RLGWebD: use NODE_PATH to find modules.
John "Elwin" Edwards
parents: 139
diff changeset
11 var posix = require("posix");
1a156a7746a7 RLGWebD: use NODE_PATH to find modules.
John "Elwin" Edwards
parents: 139
diff changeset
12 var pty = require("pty.js");
1a156a7746a7 RLGWebD: use NODE_PATH to find modules.
John "Elwin" Edwards
parents: 139
diff changeset
13 var WebSocketServer = require("websocket").server;
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
14
30
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
15 /* Configuration variables */
139
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
16 // The first file is NOT in the chroot.
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
17 var ctlsocket = "/var/local/rlgwebd/ctl";
30
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
18 var httpPort = 8080;
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
19 var chrootDir = "/var/dgl/";
157
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
20 var dropToUser = "rodney";
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
21 var serveStaticRoot = "/var/www/"; // inside the chroot
30
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
22
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
23 /* Data on the games available. */
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
24 var games = {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
25 "rogue3": {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
26 "name": "Rogue V3",
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
27 "uname": "rogue3",
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
28 "suffix": ".r3sav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
29 "path": "/usr/bin/rogue3",
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
30 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
31 },
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
32 "rogue4": {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
33 "name": "Rogue V4",
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
34 "uname": "rogue4",
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
35 "suffix": ".r4sav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
36 "path": "/usr/bin/rogue4",
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
37 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
38 },
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
39 "rogue5": {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
40 "name": "Rogue V5",
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
41 "uname": "rogue5",
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
42 "suffix": ".r5sav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
43 "path": "/usr/bin/rogue5",
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
44 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
45 },
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
46 "srogue": {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
47 "name": "Super-Rogue",
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
48 "uname": "srogue",
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
49 "suffix": ".srsav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
50 "path": "/usr/bin/srogue",
121
077adfeea038 Correct the clear sequence for srogue.
John "Elwin" Edwards <elwin@sdf.org>
parents: 120
diff changeset
51 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
120
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
52 },
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
53 "arogue5": {
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
54 "name": "Advanced Rogue 5",
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
55 "uname": "arogue5",
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
56 "suffix": ".ar5sav",
144
81a8e7aa4687 RLGWebD: game binaries have moved to /usr/bin.
John "Elwin" Edwards
parents: 142
diff changeset
57 "path": "/usr/bin/arogue5",
120
54979d35611a Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents: 113
diff changeset
58 "clear": new Buffer([27, 91, 72, 27, 91, 50, 74]) // CSI H CSI 2J
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
59 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
60 };
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
61
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
62 /* Global state */
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
63 var logins = {};
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
64 var sessions = {};
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
65 var dglgames = {};
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
66 var allowlogin = true;
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
67 var gamemux = new events.EventEmitter();
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
68
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
69 /* Constructor. A TermSession handles a pty and the game running on it.
169
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
70 * gname: (String) Name of the game to launch.
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
71 * pname: (String) The player's name.
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
72 * wsReq: (WebSocketRequest) The request from the client.
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
73 *
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
74 * Events:
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
75 * "data": Data generated by child. Parameters: buf (Buffer)
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
76 * "exit": Child terminated. Parameters: none
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
77 */
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
78 function TermSession(gname, pname, wsReq) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
79 var ss = this;
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
80 /* Subclass EventEmitter to do the hard work. */
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
81 events.EventEmitter.call(this);
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
82 /* Don't launch anything that's not a real game. */
169
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
83 if (gname in games) {
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
84 this.game = games[gname];
32
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
85 }
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
86 else {
168
0ceaca924b4c Remove the TermSession 'open' event.
John "Elwin" Edwards
parents: 167
diff changeset
87 this.failed = true;
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
88 wsReq.reject(404, errorcodes[2], "No such game");
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
89 tslog("Game %s is not available", game);
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
90 return;
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
91 }
169
6f4b7e1b32e8 rlgwebd.js: clean up TermSession parameters.
John "Elwin" Edwards
parents: 168
diff changeset
92 this.pname = pname;
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
93 /* Set up the sizes. */
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
94 this.w = Math.floor(Number(wsReq.resourceURL.query.w));
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
95 if (!(this.w > 0 && this.w < 256))
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
96 this.w = 80;
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
97 this.h = Math.floor(Number(wsReq.resourceURL.query.h));
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
98 if (!(this.h > 0 && this.h < 256))
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
99 this.h = 24;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
100 /* Environment. */
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
101 var childenv = {};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
102 for (var key in process.env) {
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
103 childenv[key] = process.env[key];
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
104 }
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
105 var args = ["-n", this.pname];
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
106 var spawnopts = {"env": childenv, "cwd": "/", "rows": this.h, "cols": this.w,
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
107 "name": "xterm-256color"};
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
108 this.term = pty.spawn(this.game.path, args, spawnopts);
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
109 tslog("%s playing %s (pid %d)", this.pname, this.game.uname, this.term.pid);
168
0ceaca924b4c Remove the TermSession 'open' event.
John "Elwin" Edwards
parents: 167
diff changeset
110 this.failed = false;
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
111 sessions[this.game.uname + "/" + this.pname] = this;
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
112 gamemux.emit('begin', this.game.uname, this.pname);
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
113 /* Set up the lockfile and ttyrec */
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
114 this.lasttime = new Date();
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
115 var ts = timestamp(this.lasttime);
142
c4304f08e35b RLGWebD: inprogress dirs have moved
John "Elwin" Edwards
parents: 141
diff changeset
116 var progressdir = path.join("/dgldir/inprogress", this.game.uname);
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
117 this.lock = path.join(progressdir, this.pname + ":node:" + ts + ".ttyrec");
110
18a81cc0084b RLG-Web: fix lockfile mixup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 109
diff changeset
118 var lmsg = this.term.pid.toString() + '\n' + this.h + '\n' + this.w + '\n';
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
119 fs.writeFile(this.lock, lmsg, "utf8");
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
120 var ttyrec = path.join("/dgldir/ttyrec", this.pname, this.game.uname,
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
121 ts + ".ttyrec");
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
122 this.record = fs.createWriteStream(ttyrec, { mode: 0664 });
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
123 /* Holds the output since the last screen clear, so watchers can begin
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
124 * with a complete screen. */
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
125 this.framebuf = new Buffer(1024);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
126 this.frameoff = 0;
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
127 this.playerconn = wsReq.accept(null, wsReq.origin);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
128 /* END setup */
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
129 function ttyrec_chunk(datastr) {
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
130 ss.lasttime = new Date();
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
131 var buf = new Buffer(datastr);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
132 var chunk = new Buffer(buf.length + 12);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
133 /* TTYREC headers */
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
134 chunk.writeUInt32LE(Math.floor(ss.lasttime.getTime() / 1000), 0);
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
135 chunk.writeUInt32LE(1000 * (ss.lasttime.getTime() % 1000), 4);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
136 chunk.writeUInt32LE(buf.length, 8);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
137 buf.copy(chunk, 12);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
138 ss.record.write(chunk);
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
139 ss.framepush(buf);
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
140 /* Send to the player. */
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
141 var msg = {"t": "d", "d": buf.toString("hex")};
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
142 ss.playerconn.sendUTF(JSON.stringify(msg));
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
143 /* For the benefit of watchers. */
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
144 ss.emit('data', buf);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
145 }
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
146 this.term.on("data", ttyrec_chunk);
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
147 this.framepush = function(chunk) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
148 /* If this chunk resets the screen, discard what preceded it. */
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
149 if (bufncmp(chunk, this.game.clear, this.game.clear.length)) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
150 this.framebuf = new Buffer(1024);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
151 this.frameoff = 0;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
152 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
153 /* Make sure there's space. */
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
154 while (this.framebuf.length < chunk.length + this.frameoff) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
155 var nbuf = new Buffer(this.framebuf.length * 2);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
156 this.framebuf.copy(nbuf, 0, 0, this.frameoff);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
157 this.framebuf = nbuf;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
158 if (this.framebuf.length > 65536) {
162
5a7e7ec136c8 Properly print session tags in the log.
John "Elwin" Edwards
parents: 160
diff changeset
159 tslog("Warning: Game %s frame buffer at %d bytes", this.tag(),
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
160 this.framebuf.length);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
161 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
162 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
163 chunk.copy(this.framebuf, this.frameoff);
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
164 this.frameoff += chunk.length;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
165 };
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
166 this.write = function(data) {
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
167 this.term.write(data);
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
168 };
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
169 this.tag = function() {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
170 return this.game.uname + "/" + this.pname;
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
171 };
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
172 // Teardown.
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
173 this.term.on("exit", function () {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
174 var tag = ss.tag();
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
175 fs.unlink(ss.lock);
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
176 ss.record.end();
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
177 if (ss.playerconn.connected) {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
178 ss.playerconn.sendUTF(JSON.stringify({"t": "q"}));
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
179 ss.playerconn.close();
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
180 }
87
bd2cf6dda28d RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents: 85
diff changeset
181 ss.emit('exit');
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
182 gamemux.emit('end', ss.game.uname, ss.pname);
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
183 delete sessions[tag];
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
184 tslog("Game %s ended.", tag);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
185 });
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
186 this.close = function () {
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
187 if (ss.tag() in sessions)
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
188 ss.term.kill('SIGHUP');
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
189 };
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
190 /* Send initial data. */
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
191 this.playerconn.sendUTF(JSON.stringify({"t": "s", "w": this.w, "h": this.h,
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
192 "p": this.pname, "g": this.game.uname}));
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
193 /* Attach handlers. */
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
194 function messageH(message) {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
195 var parsedMsg = getMsgWS(message);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
196 if (parsedMsg.t == 'q') {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
197 ss.close();
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
198 }
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
199 else if (parsedMsg.t == 'd') {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
200 var hexstr = parsedMsg.d.replace(/[^0-9a-f]/gi, "");
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
201 if (hexstr.length % 2 != 0) {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
202 hexstr = hexstr.slice(0, -1);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
203 }
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
204 var keybuf = new Buffer(hexstr, "hex");
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
205 ss.write(keybuf);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
206 }
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
207 }
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
208 this.playerconn.on('message', messageH);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
209 this.playerconn.on('close', this.close);
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
210 }
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
211 TermSession.prototype = new events.EventEmitter();
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
212
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
213 function DglSession(filename) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
214 var ss = this;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
215 events.EventEmitter.call(this);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
216 var pathcoms = filename.split('/');
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
217 this.gname = pathcoms[pathcoms.length - 2];
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
218 if (!(this.gname in games)) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
219 ss.emit('open', false);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
220 return;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
221 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
222 var basename = pathcoms[pathcoms.length - 1];
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
223 var firstsep = basename.indexOf(':');
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
224 this.pname = basename.slice(0, firstsep);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
225 var fname = basename.slice(firstsep + 1);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
226 this.ttyrec = path.join("/dgldir/ttyrec", this.pname, this.gname, fname);
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
227 /* Flag to prevent multiple handlers from reading simultaneously and
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
228 * getting into a race. */
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
229 this.reading = false;
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
230 this.framebuf = new Buffer(1024);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
231 this.frameoff = 0;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
232 this.framepush = function(chunk) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
233 /* If this chunk resets the screen, discard what preceded it. */
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
234 var cgame = games[this.gname];
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
235 if (bufncmp(chunk, cgame.clear, cgame.clear.length)) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
236 tslog("DGL %s: clearing frame", ss.tag());
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
237 this.framebuf = new Buffer(1024);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
238 this.frameoff = 0;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
239 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
240 /* Make sure there's space. */
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
241 while (this.framebuf.length < chunk.length + this.frameoff) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
242 var nbuf = new Buffer(this.framebuf.length * 2);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
243 this.framebuf.copy(nbuf, 0, 0, this.frameoff);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
244 this.framebuf = nbuf;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
245 if (this.framebuf.length > 65536) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
246 tslog("Warning: DGL %s frame buffer at %d bytes", this.tag(),
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
247 this.framebuf.length);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
248 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
249 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
250 chunk.copy(this.framebuf, this.frameoff);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
251 this.frameoff += chunk.length;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
252 };
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
253 this.readchunk = function () {
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
254 if (this.reading)
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
255 return;
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
256 this.reading = true;
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
257 var header = new Buffer(12);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
258 fs.read(ss.fd, header, 0, 12, null, function (err, n, buf) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
259 /* Stop recursion if end of file has been reached. */
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
260 if (err || n < 12) {
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
261 ss.reading = false;
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
262 return;
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
263 }
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
264 var datalen = buf.readUInt32LE(8);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
265 //tslog("Allocating %d bytes", datalen);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
266 var databuf = new Buffer(datalen);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
267 fs.read(ss.fd, databuf, 0, datalen, null, function (err, n, buf) {
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
268 ss.reading = false;
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
269 if (err || n < datalen) {
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
270 return;
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
271 }
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
272 /* Process the data */
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
273 ss.framepush(buf);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
274 ss.emit("data", buf);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
275 tslog("DGL %s: %d bytes", ss.tag(), buf.length);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
276 /* Recurse. */
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
277 ss.readchunk();
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
278 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
279 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
280 };
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
281 fs.readFile(filename, {encoding: "utf8"}, function (err, data) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
282 if (err) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
283 ss.emit('open', false);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
284 return;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
285 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
286 var lines = data.split('\n');
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
287 ss.h = Number(lines[1]);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
288 ss.w = Number(lines[2]);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
289 fs.open(ss.ttyrec, "r", function(err, fd) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
290 if (err) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
291 ss.emit('open', false);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
292 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
293 else {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
294 ss.fd = fd;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
295 ss.emit('open', true);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
296 tslog("DGL %s: open", ss.tag());
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
297 ss.readchunk();
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
298 ss.watcher = fs.watch(ss.ttyrec, function (ev, finame) {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
299 if (ev == "change")
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
300 ss.readchunk();
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
301 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
302 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
303 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
304 });
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
305 this.tag = function () {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
306 return this.gname + "/" + this.pname;
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
307 };
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
308 this.close = function () {
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
309 this.watcher.close()
165
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
310 /* Ensure all data is handled before quitting. */
59e62710cbb5 rlgwebd.js: prevent races when reading ttyrecs.
John "Elwin" Edwards
parents: 164
diff changeset
311 this.readchunk();
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
312 fs.close(this.fd);
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
313 this.emit("close");
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
314 tslog("DGL %s: closed", ss.tag());
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
315 };
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
316 }
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
317 DglSession.prototype = new events.EventEmitter();
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
318
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
319 // Also known as WebSocketAndTermSessionClosureGlueFactory
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
320 function wsWatcher(conn, session) {
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
321 var ss = this; // is this even needed?
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
322 var dataH = function(buf) {
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
323 conn.sendUTF(JSON.stringify({"t": "d", "d": buf.toString("hex")}));
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
324 };
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
325 var exitH = function() {
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
326 if (conn.connected)
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
327 conn.close();
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
328 }
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
329 session.on('data', dataH);
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
330 session.on('exit', exitH);
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
331 conn.on('close', function(code, desc) {
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
332 session.removeListener('data', dataH);
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
333 session.removeListener('exit', exitH);
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
334 if (session.tag() in sessions)
162
5a7e7ec136c8 Properly print session tags in the log.
John "Elwin" Edwards
parents: 160
diff changeset
335 tslog("A WebSocket watcher has left game %s", session.tag());
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
336 });
101
e59d68082664 RLG-Web: Complete the WebSocket watcher.
John "Elwin" Edwards <elwin@sdf.org>
parents: 100
diff changeset
337 conn.sendUTF(JSON.stringify({
e59d68082664 RLG-Web: Complete the WebSocket watcher.
John "Elwin" Edwards <elwin@sdf.org>
parents: 100
diff changeset
338 "t": "w", "w": session.w, "h": session.h,
e59d68082664 RLG-Web: Complete the WebSocket watcher.
John "Elwin" Edwards <elwin@sdf.org>
parents: 100
diff changeset
339 "p": session.pname, "g": session.game.uname
e59d68082664 RLG-Web: Complete the WebSocket watcher.
John "Elwin" Edwards <elwin@sdf.org>
parents: 100
diff changeset
340 }));
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
341 conn.sendUTF(JSON.stringify({"t": "d",
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
342 "d": session.framebuf.toString("hex", 0, session.frameoff)}));
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
343 }
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
344
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
345 function wsStartGame(wsReq) {
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
346 var playmatch = wsReq.resourceURL.pathname.match(/^\/play\/([^\/]*)$/);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
347 if (!playmatch[1] || !(playmatch[1] in games)) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
348 wsReq.reject(404, errorcodes[2]);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
349 return;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
350 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
351 var gname = playmatch[1];
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
352 if (!allowlogin) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
353 wsReq.reject(404, errorcodes[6]);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
354 return;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
355 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
356 if (!("key" in wsReq.resourceURL.query)) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
357 wsReq.reject(404, "No key given.");
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
358 return;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
359 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
360 var lkey = wsReq.resourceURL.query["key"];
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
361 if (!(lkey in logins)) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
362 wsReq.reject(404, errorcodes[1]);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
363 return;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
364 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
365 var pname = logins[lkey].name;
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
366 function progcallback(err, fname) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
367 if (fname) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
368 wsReq.reject(404, errorcodes[4]);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
369 tslog("%s is already playing %s", pname, gname);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
370 }
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
371 else {
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
372 new TermSession(gname, pname, wsReq);
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
373 }
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
374 };
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
375 checkprogress(pname, games[gname], progcallback, []);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
376 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
377
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
378 /* Some functions which check whether a player is currently playing or
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
379 * has a saved game. Maybe someday they will provide information on
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
380 * the game. */
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
381 function checkprogress(user, game, callback, args) {
142
c4304f08e35b RLGWebD: inprogress dirs have moved
John "Elwin" Edwards
parents: 141
diff changeset
382 var progressdir = path.join("/dgldir/inprogress", game.uname);
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
383 fs.readdir(progressdir, function(err, files) {
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
384 if (err) {
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
385 args.unshift(err, null);
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
386 callback.apply(null, args);
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
387 return;
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
388 }
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
389 var fre = RegExp("^" + user + ":");
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
390 for (var i = 0; i < files.length; i++) {
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
391 if (files[i].match(fre)) {
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
392 args.unshift(null, files[i]);
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
393 callback.apply(null, args);
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
394 return;
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
395 }
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
396 }
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
397 args.unshift(null, false);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
398 callback.apply(null, args);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
399 });
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
400 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
401
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
402 function checksaved(user, game, callback, args) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
403 var savedirc = game.uname + "save";
157
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
404 var basename = String(pwent.uid) + "-" + user + game.suffix;
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
405 var savefile = path.join("/var/games/roguelike", savedirc, basename);
81
e4773ac5d4d5 Switch to node v0.8.
John "Elwin" Edwards <elwin@sdf.org>
parents: 66
diff changeset
406 fs.exists(savefile, function (exist) {
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
407 args.unshift(exist);
40
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
408 callback.apply(null, args);
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
409 });
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
410 }
f7116eb3f791 rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents: 39
diff changeset
411
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
412 function playerstatus(user, callback) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
413 var sdata = {};
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
414 function finishp() {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
415 for (var gname in games) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
416 if (!(gname in sdata))
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
417 return;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
418 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
419 callback(sdata);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
420 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
421 function regsaved(exists, game) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
422 if (exists)
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
423 sdata[game.uname] = "s";
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
424 else
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
425 sdata[game.uname] = "0";
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
426 finishp();
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
427 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
428 function regactive(err, filename, game) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
429 if (!err && filename) {
88
d644e7d46852 RLG-Web: make /pstatus/* differentiate between dgl and RLG-Web games.
John "Elwin" Edwards <elwin@sdf.org>
parents: 87
diff changeset
430 if (filename.match(/^[^:]*:node:/))
d644e7d46852 RLG-Web: make /pstatus/* differentiate between dgl and RLG-Web games.
John "Elwin" Edwards <elwin@sdf.org>
parents: 87
diff changeset
431 sdata[game.uname] = "p";
d644e7d46852 RLG-Web: make /pstatus/* differentiate between dgl and RLG-Web games.
John "Elwin" Edwards <elwin@sdf.org>
parents: 87
diff changeset
432 else
d644e7d46852 RLG-Web: make /pstatus/* differentiate between dgl and RLG-Web games.
John "Elwin" Edwards <elwin@sdf.org>
parents: 87
diff changeset
433 sdata[game.uname] = "d";
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
434 finishp();
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
435 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
436 else
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
437 checksaved(user, game, regsaved, [game]);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
438 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
439 for (var gname in games) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
440 checkprogress(user, games[gname], regactive, [games[gname]]);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
441 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
442 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
443
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
444 /* A few utility functions */
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
445 function timestamp(dd) {
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
446 if (!(dd instanceof Date)) {
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
447 dd = new Date();
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
448 }
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
449 sd = dd.toISOString();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
450 sd = sd.slice(0, sd.indexOf("."));
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
451 return sd.replace("T", ".");
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
452 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
453
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
454 function randkey(words) {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
455 if (!words || !(words > 0))
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
456 words = 1;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
457 function rand32() {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
458 rnum = Math.floor(Math.random() * 65536 * 65536);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
459 hexstr = rnum.toString(16);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
460 while (hexstr.length < 8)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
461 hexstr = "0" + hexstr;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
462 return hexstr;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
463 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
464 var key = "";
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
465 for (var i = 0; i < words; i++)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
466 key += rand32();
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
467 return key;
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
468 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
469
60
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
470 /* Compares two buffers, returns true for equality up to index n */
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
471 function bufncmp(buf1, buf2, n) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
472 if (!Buffer.isBuffer(buf1) || !Buffer.isBuffer(buf2))
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
473 return false;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
474 for (var i = 0; i < n; i++) {
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
475 if (i == buf1.length && i == buf2.length)
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
476 return true;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
477 if (i == buf1.length || i == buf2.length)
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
478 return false;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
479 if (buf1[i] != buf2[i])
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
480 return false;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
481 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
482 return true;
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
483 }
31bb3cf4f25f Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents: 55
diff changeset
484
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
485 function tslog() {
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
486 arguments[0] = new Date().toISOString() + ": " + String(arguments[0]);
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
487 console.log.apply(console, arguments);
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
488 }
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
489
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
490 /* Returns a list of the cookies in the request, obviously. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
491 function getCookies(req) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
492 cookies = [];
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
493 if ("cookie" in req.headers) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
494 cookstrs = req.headers["cookie"].split("; ");
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
495 for (var i = 0; i < cookstrs.length; i++) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
496 eqsign = cookstrs[i].indexOf("=");
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
497 if (eqsign > 0) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
498 name = cookstrs[i].slice(0, eqsign).toLowerCase();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
499 val = cookstrs[i].slice(eqsign + 1);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
500 cookies[name] = val;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
501 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
502 else if (eqsign < 0)
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
503 cookies[cookstrs[i]] = null;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
504 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
505 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
506 return cookies;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
507 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
508
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
509 function getMsg(posttext) {
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
510 var jsonobj;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
511 if (!posttext)
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
512 return {};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
513 try {
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
514 jsonobj = JSON.parse(posttext);
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
515 }
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
516 catch (e) {
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
517 if (e instanceof SyntaxError)
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
518 return {};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
519 }
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
520 if (typeof(jsonobj) != "object")
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
521 return {};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
522 return jsonobj;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
523 }
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
524
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
525 function getMsgWS(msgObj) {
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
526 if (msgObj.type != "utf8")
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
527 return {};
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
528 return getMsg(msgObj.utf8Data);
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
529 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
530
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
531 function login(req, res, formdata) {
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
532 if (!allowlogin) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
533 sendError(res, 6, null, false);
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
534 return;
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
535 }
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
536 if (!("name" in formdata)) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
537 sendError(res, 2, "Username not given.", false);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
538 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
539 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
540 else if (!("pw" in formdata)) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
541 sendError(res, 2, "Password not given.", false);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
542 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
543 }
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
544 var username = String(formdata["name"]);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
545 var password = String(formdata["pw"]);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
546 function checkit(code, signal) {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
547 /* Checks the exit status, see sqlickrypt.c for details. */
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
548 if (code != 0) {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
549 sendError(res, 3);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
550 if (code == 1)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
551 tslog("Password check failed for user %s", username);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
552 else if (code == 2)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
553 tslog("Attempted login by nonexistent user %s", username);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
554 else
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
555 tslog("Login failed: sqlickrypt error %d", code);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
556 return;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
557 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
558 var lkey = randkey(2);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
559 while (lkey in logins)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
560 lkey = randkey(2);
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
561 logins[lkey] = {"name": username, "ts": new Date()};
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
562 res.writeHead(200, {'Content-Type': 'application/json'});
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
563 var reply = {"t": "l", "k": lkey, "u": username};
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
564 res.write(JSON.stringify(reply));
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
565 res.end();
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
566 tslog("%s has logged in (key %s)", username, lkey);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
567 return;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
568 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
569 /* Launch the sqlickrypt utility to check the password. */
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
570 var pwchecker = child_process.spawn("/bin/sqlickrypt", ["check"]);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
571 pwchecker.on("exit", checkit);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
572 pwchecker.stdin.end(username + '\n' + password + '\n', "utf8");
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
573 return;
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
574 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
575
20
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
576 /* Sets things up for a new user, like dgamelaunch's commands[register] */
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
577 function regsetup(username) {
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
578 function regsetup_l2(err) {
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
579 for (var g in games) {
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
580 fs.mkdir(path.join("/dgldir/ttyrec", username, games[g].uname), 0755);
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
581 }
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
582 }
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
583 fs.mkdir(path.join("/dgldir/userdata", username), 0755);
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
584 fs.mkdir(path.join("/dgldir/ttyrec/", username), 0755, regsetup_l2);
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
585 }
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
586
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
587 function register(req, res, formdata) {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
588 var uname, passwd, email;
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
589 if (typeof (formdata.name) != "string" || formdata.name === "") {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
590 sendError(res, 2, "No name given.");
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
591 return;
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
592 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
593 else
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
594 uname = formdata["name"];
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
595 if (typeof (formdata.pw) != "string" || formdata.pw === "") {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
596 sendError(res, 2, "No password given.");
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
597 return;
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
598 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
599 else
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
600 passwd = formdata["pw"];
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
601 if (typeof (formdata.email) != "string" || formdata.email === "") {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
602 /* E-mail is optional */
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
603 email = "nobody@nowhere.not";
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
604 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
605 else
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
606 email = formdata["email"];
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
607 function checkreg(code, signal) {
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
608 if (code === 0) {
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
609 var lkey = randkey(2);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
610 while (lkey in logins)
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
611 lkey = randkey(2);
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
612 logins[lkey] = {"name": uname, "ts": new Date()};
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
613 var reply = {"t": "r", "k": lkey, "u": uname};
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
614 res.writeHead(200, {'Content-Type': 'application/json'});
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
615 res.write(JSON.stringify(reply));
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
616 res.end();
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
617 tslog("Added new user: %s", uname);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
618 regsetup(uname);
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
619 }
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
620 else if (code == 4) {
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
621 sendError(res, 2, "Invalid characters in name or email.");
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
622 tslog("Attempted registration: %s %s", uname, email);
20
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
623 }
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
624 else if (code == 1) {
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
625 sendError(res, 2, "Username " + uname + " is already being used.");
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
626 tslog("Attempted duplicate registration: %s", uname);
20
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
627 }
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
628 else {
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
629 sendError(res, 0, null);
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
630 tslog("sqlickrypt register failed with code %d", code);
20
5f785e1d5cca RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 19
diff changeset
631 }
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
632 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
633 var child_adder = child_process.spawn("/bin/sqlickrypt", ["register"]);
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
634 child_adder.on("exit", checkreg);
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
635 child_adder.stdin.end(uname + '\n' + passwd + '\n' + email + '\n', "utf8");
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
636 return;
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
637 }
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
638
111
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
639 /* Stops a running game if the request has the proper key. */
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
640 function stopgame(res, formdata) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
641 if (!("key" in formdata) || !(formdata["key"] in logins)) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
642 sendError(res, 1);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
643 return;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
644 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
645 var pname = logins[formdata["key"]].name;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
646 if (!("g" in formdata) || !(formdata["g"] in games)) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
647 sendError(res, 2, "No such game.");
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
648 return;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
649 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
650 var gname = formdata["g"];
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
651 function checkback(err, fname) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
652 if (!fname) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
653 sendError(res, 7);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
654 return;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
655 }
142
c4304f08e35b RLGWebD: inprogress dirs have moved
John "Elwin" Edwards
parents: 141
diff changeset
656 var fullfile = path.join("/dgldir/inprogress", gname, fname);
111
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
657 fs.readFile(fullfile, "utf8", function(err, fdata) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
658 if (err) {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
659 sendError(res, 7);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
660 return;
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
661 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
662 var pid = parseInt(fdata.split('\n')[0], 10);
139
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
663 try {
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
664 process.kill(pid, 'SIGHUP');
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
665 }
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
666 catch (err) {
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
667 /* If the PID is invalid, the lockfile is stale. */
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
668 if (err.code == "ESRCH") {
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
669 var nodere = RegExp("^" + pname + ":node:");
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
670 if (fname.match(nodere)) {
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
671 fs.unlink(fullfile);
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
672 }
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
673 }
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
674 }
111
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
675 /* The response doesn't mean that the game is gone. The only way
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
676 * to make sure a dgamelaunch-supervised game is over would be to
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
677 * poll fname until it disappears. */
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
678 res.writeHead(200, {'Content-Type': 'application/json'});
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
679 res.write(JSON.stringify({"t": "q"}));
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
680 res.end();
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
681 });
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
682 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
683 checkprogress(pname, games[gname], checkback, []);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
684 }
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
685
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
686 function startProgressWatcher() {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
687 var watchdirs = [];
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
688 for (var gname in games) {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
689 watchdirs.push(path.join("/dgldir/inprogress", gname));
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
690 }
167
fba1b34e7554 Rename watcher to dglwatcher.
John "Elwin" Edwards
parents: 165
diff changeset
691 var subproc = child_process.spawn("/bin/dglwatcher", watchdirs);
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
692 subproc.stdout.setEncoding('utf8');
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
693 subproc.stdout.on('data', function (chunk) {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
694 var fname = chunk.slice(2, -1);
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
695 var filere = /.*\/([^\/]*)\/([^\/:]*):(node:)?(.*)/;
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
696 var matchresult = fname.match(filere);
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
697 if (!matchresult || matchresult[3])
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
698 return;
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
699 var gname = matchresult[1];
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
700 var pname = matchresult[2];
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
701 var tag = gname + "/" + pname;
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
702 if (chunk[0] == "E") {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
703 tslog("DGL: %s is playing %s: %s", pname, gname, fname)
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
704 dglgames[tag] = new DglSession(fname);
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
705 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
706 else if (chunk[0] == "C") {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
707 tslog("DGL: %s started playing %s: %s", pname, gname, fname)
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
708 dglgames[tag] = new DglSession(fname);
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
709 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
710 else if (chunk[0] == "D") {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
711 tslog("DGL: %s finished playing %s: %s", pname, gname, fname)
164
3a97e4ee50f0 rlgwebd.js: read ttyrecs created by dgamelaunch.
John "Elwin" Edwards
parents: 163
diff changeset
712 dglgames[tag].close();
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
713 delete dglgames[tag];
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
714 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
715 else {
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
716 tslog("Watcher says: %s", chunk)
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
717 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
718 });
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
719 subproc.stdout.resume();
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
720 return subproc;
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
721 }
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
722
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
723 function serveStatic(req, res, fname) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
724 var nname = path.normalize(fname);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
725 if (nname == "" || nname == "/")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
726 nname = "index.html";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
727 if (nname.match(/\/$/))
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
728 path.join(nname, "index.html"); /* it was a directory */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
729 var realname = path.join(serveStaticRoot, nname);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
730 var extension = path.extname(realname);
81
e4773ac5d4d5 Switch to node v0.8.
John "Elwin" Edwards <elwin@sdf.org>
parents: 66
diff changeset
731 fs.exists(realname, function (exists) {
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
732 var resheaders = {};
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
733 if (!exists || !extension || extension == ".html")
31
7dd6becf9ce9 rlgwebd.js: improve MIME types.
John "Elwin" Edwards <elwin@sdf.org>
parents: 30
diff changeset
734 resheaders["Content-Type"] = "text/html; charset=utf-8";
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
735 else if (extension == ".png")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
736 resheaders["Content-Type"] = "image/png";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
737 else if (extension == ".css")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
738 resheaders["Content-Type"] = "text/css";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
739 else if (extension == ".js")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
740 resheaders["Content-Type"] = "text/javascript";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
741 else if (extension == ".svg")
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
742 resheaders["Content-Type"] = "image/svg+xml";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
743 else
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
744 resheaders["Content-Type"] = "application/octet-stream";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
745 if (exists) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
746 fs.readFile(realname, function (error, data) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
747 if (error) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
748 res.writeHead(500, {});
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
749 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
750 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
751 else {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
752 res.writeHead(200, resheaders);
34
57f4b36ef06b rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents: 32
diff changeset
753 if (req.method != 'HEAD')
57f4b36ef06b rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents: 32
diff changeset
754 res.write(data);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
755 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
756 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
757 });
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
758 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
759 else {
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
760 send404(res, nname, req.method == 'HEAD');
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
761 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
762 });
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
763 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
764 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
765
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
766 /* Currently, this doesn't do anything blocking, but keep the callback */
103
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
767 function getStatus(callback) {
66
57bf0dcd080e Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents: 64
diff changeset
768 var now = new Date();
103
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
769 var statusinfo = {"s": allowlogin, "g": []};
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
770 for (var tag in sessions) {
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
771 var gamedesc = {};
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
772 gamedesc["p"] = sessions[tag].pname;
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
773 gamedesc["g"] = sessions[tag].game.uname;
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
774 gamedesc["i"] = now - sessions[tag].lasttime;
103
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
775 statusinfo["g"].push(gamedesc);
32
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
776 }
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
777 statusinfo["dgl"] = [];
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
778 for (var tag in dglgames) {
163
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
779 var dglinfo = {};
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
780 var slash = tag.search('/');
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
781 dglinfo["g"] = tag.slice(0, slash);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
782 dglinfo["p"] = tag.slice(slash + 1);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
783 dglinfo["i"] = -1;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
784 statusinfo["dgl"].push(dglinfo);
156
127f9e256d02 Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents: 155
diff changeset
785 }
160
ed837da65e5f RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents: 159
diff changeset
786 callback(statusinfo);
32
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
787 }
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
788
103
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
789 function statusmsg(req, res) {
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
790 function respond(info) {
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
791 res.writeHead(200, { "Content-Type": "application/json" });
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
792 if (req.method != 'HEAD')
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
793 res.write(JSON.stringify(info));
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
794 res.end();
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
795 }
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
796 getStatus(respond);
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
797 }
f30495f7ede8 RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 102
diff changeset
798
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
799 function pstatusmsg(req, res) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
800 if (req.method == 'HEAD') {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
801 res.writeHead(200, { "Content-Type": "application/json" });
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
802 res.end();
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
803 return;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
804 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
805 var target = url.parse(req.url).pathname;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
806 var pmatch = target.match(/^\/pstatus\/(.*)/);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
807 if (pmatch && pmatch[1])
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
808 var pname = pmatch[1];
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
809 else {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
810 sendError(res, 2, "No name given.");
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
811 return;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
812 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
813 var reply = {"name": pname};
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
814 playerstatus(pname, function (pdata) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
815 reply["stat"] = pdata;
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
816 res.writeHead(200, { "Content-Type": "application/json" });
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
817 res.write(JSON.stringify(reply));
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
818 res.end();
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
819 });
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
820 }
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
821
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
822 function getuinfo(req, res) {
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
823 var urlobj = url.parse(req.url, true);
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
824 var query = urlobj.query;
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
825 if (!("key" in query) || !(query["key"] in logins)) {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
826 sendError(res, 1);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
827 return;
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
828 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
829 var match = urlobj.pathname.match(/^\/[^\/]*\/(.*)/);
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
830 if (!match || !match[1]) {
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
831 send404(res, urlobj.pathname, req.method == 'HEAD');
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
832 return;
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
833 }
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
834 var which = match[1];
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
835 var name = logins[query["key"]].name;
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
836 var reply = { "u": name };
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
837 function send() {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
838 res.writeHead(200, { "Content-Type": "application/json" });
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
839 res.write(JSON.stringify(reply));
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
840 res.end();
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
841 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
842 if (which == "pw") {
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
843 /* Don't actually divulge passwords. */
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
844 reply["pw"] = "";
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
845 send();
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
846 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
847 else if (which == "email") {
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
848 var address;
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
849 function finish(code, signal) {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
850 if (code != 0) {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
851 tslog("sqlickrypt: %d with name %s", code, name);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
852 sendError(res, 2);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
853 }
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
854 else {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
855 reply["email"] = address;
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
856 send();
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
857 }
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
858 }
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
859 var subproc = child_process.spawn("/bin/sqlickrypt", ["getmail"]);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
860 subproc.stdout.on("data", function (data) {
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
861 address = data.toString().replace(/\n/g, "");
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
862 });
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
863 subproc.on("exit", finish);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
864 subproc.stdin.end(name + '\n', "utf8");
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
865 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
866 else {
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
867 send404(res, urlobj.pathname, req.method == 'HEAD');
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
868 return;
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
869 }
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
870 }
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
871
126
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
872 function setuinfo(req, res, postdata) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
873 var urlobj = url.parse(req.url, true);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
874 var query = urlobj.query;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
875 if (!("key" in query) || !(query["key"] in logins)) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
876 sendError(res, 1);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
877 return;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
878 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
879 var name = logins[query["key"]].name;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
880 var match = urlobj.pathname.match(/^\/[^\/]*\/(.*)/);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
881 if (!match || !match[1]) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
882 send404(res, urlobj.pathname, true);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
883 return;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
884 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
885 var which = match[1];
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
886 if (!("v" in postdata)) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
887 sendError(res, 2, "No value provided");
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
888 return;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
889 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
890 if (which == "email" || which == "pw") {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
891 var args;
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
892 if (which == "email")
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
893 args = ["setmail"];
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
894 else
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
895 args = ["setpw"];
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
896 var child = child_process.execFile("/bin/sqlickrypt", args,
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
897 function (err, stdout, stderr) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
898 if (err) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
899 tslog("Could not set %s: sqlickrypt error %d", which, err.code);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
900 sendError(res, 2);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
901 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
902 else {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
903 tslog("User %s has changed %s", name, which);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
904 res.writeHead(200, { "Content-Type": "application/json" });
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
905 res.end(JSON.stringify({"t": "t"}));
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
906 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
907 });
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
908 child.stdin.end(name + "\n" + postdata.v + "\n", "utf8");
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
909 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
910 else {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
911 send404(res, urlobj.pathname, true);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
912 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
913 }
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
914
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
915 var errorcodes = [ "Generic Error", "Not logged in", "Invalid data",
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
916 "Login failed", "Already playing", "Game launch failed",
39
e8ac0e3d2614 RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents: 37
diff changeset
917 "Server shutting down", "Game not in progress" ];
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
918
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
919 function sendError(res, ecode, msg, box) {
31
7dd6becf9ce9 rlgwebd.js: improve MIME types.
John "Elwin" Edwards <elwin@sdf.org>
parents: 30
diff changeset
920 res.writeHead(200, { "Content-Type": "application/json" });
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
921 var edict = {"t": "E"};
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
922 if (!(ecode < errorcodes.length && ecode > 0))
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
923 ecode = 0;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
924 edict["c"] = ecode;
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
925 edict["s"] = errorcodes[ecode];
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
926 if (msg)
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
927 edict["s"] += ": " + msg;
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
928 if (box)
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
929 res.write(JSON.stringify([edict]));
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
930 else
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
931 res.write(JSON.stringify(edict));
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
932 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
933 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
934
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
935 function send404(res, path, nopage) {
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
936 res.writeHead(404, {"Content-Type": "text/html; charset=utf-8"});
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
937 if (!nopage) {
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
938 res.write("<html><head><title>" + path + "</title></head>\n<body><h1>"
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
939 + path + " Not Found</h1></body></html>\n");
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
940 }
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
941 res.end();
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
942 }
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
943
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
944 function webHandler(req, res) {
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
945 /* default headers for the response */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
946 var resheaders = {'Content-Type': 'text/html'};
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
947 /* The request body will be added to this as it arrives. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
948 var reqbody = "";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
949 var formdata;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
950
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
951 /* Register a listener to get the body. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
952 function moredata(chunk) {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
953 reqbody += chunk;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
954 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
955 req.on('data', moredata);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
956
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
957 /* This will send the response once the whole request is here. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
958 function respond() {
16
ef6127ed6da3 RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents: 8
diff changeset
959 formdata = getMsg(reqbody);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
960 var target = url.parse(req.url).pathname;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
961 /* First figure out if the client is POSTing to a command interface. */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
962 if (req.method == 'POST') {
159
a613380ffdc2 RLGWebD: excise polling.
John "Elwin" Edwards
parents: 158
diff changeset
963 if (target == "/login") {
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
964 login(req, res, formdata);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
965 }
19
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
966 else if (target == "/addacct") {
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
967 register(req, res, formdata);
188bbd857124 RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents: 17
diff changeset
968 }
111
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
969 else if (target == "/quit") {
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
970 stopgame(res, formdata);
f56fdfeed01a Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents: 110
diff changeset
971 }
126
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
972 else if (target.match(/^\/uinfo\//)) {
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
973 setuinfo(req, res, formdata);
3e3824711791 RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents: 125
diff changeset
974 }
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
975 else {
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
976 res.writeHead(405, resheaders);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
977 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
978 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
979 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
980 else if (req.method == 'GET' || req.method == 'HEAD') {
159
a613380ffdc2 RLGWebD: excise polling.
John "Elwin" Edwards
parents: 158
diff changeset
981 if (target == '/status') {
32
c75fc4b1d13d rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 31
diff changeset
982 statusmsg(req, res);
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
983 }
125
5ad15380f851 Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 124
diff changeset
984 else if (target.match(/^\/uinfo\//)) {
124
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
985 getuinfo(req, res);
fbeb0bf2b51d Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents: 121
diff changeset
986 }
42
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
987 else if (target.match(/^\/pstatus\//)) {
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
988 pstatusmsg(req, res);
8f6bc0df58fa rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents: 40
diff changeset
989 }
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
990 else /* Go look for it in the filesystem */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
991 serveStatic(req, res, target);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
992 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
993 else { /* Some other method */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
994 res.writeHead(501, resheaders);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
995 res.write("<html><head><title>501</title></head>\n<body><h1>501 Not Implemented</h1></body></html>\n");
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
996 res.end();
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
997 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
998 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
999 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1000 req.on('end', respond);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1001 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1002
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1003 function wsHandler(wsRequest) {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1004 var watchmatch = wsRequest.resource.match(/^\/watch\/(.*)$/);
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
1005 var playmatch = wsRequest.resource.match(/^\/play\//);
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1006 if (watchmatch !== null) {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1007 if (!(watchmatch[1] in sessions)) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1008 wsRequest.reject(404, errorcodes[7]);
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1009 return;
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1010 }
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1011 var tsession = sessions[watchmatch[1]];
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1012 var conn = wsRequest.accept(null, wsRequest.origin);
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1013 new wsWatcher(conn, tsession);
162
5a7e7ec136c8 Properly print session tags in the log.
John "Elwin" Edwards
parents: 160
diff changeset
1014 tslog("Game %s is being watched via WebSockets", tsession.tag());
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1015 }
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
1016 else if (playmatch !== null) {
170
50e4c9feeac2 RLGWebD: fix simultaneous player bug.
John "Elwin" Edwards
parents: 169
diff changeset
1017 wsStartGame(wsRequest);
107
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
1018 }
b64e31c5ec31 RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 104
diff changeset
1019 else if (wsRequest.resourceURL.pathname == "/status") {
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1020 var conn = wsRequest.accept(null, wsRequest.origin);
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1021 var tell = function () {
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1022 getStatus(function (info) {
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1023 info["t"] = "t";
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1024 conn.sendUTF(JSON.stringify(info));
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1025 });
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1026 }
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1027 var beginH = function (gname, pname) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1028 conn.sendUTF(JSON.stringify({"t": "b", "p": pname, "g": gname}));
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1029 };
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1030 var listH = function (list) {
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1031 conn.sendUTF(JSON.stringify(list));
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1032 };
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1033 var endH = function (gname, pname) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1034 conn.sendUTF(JSON.stringify({"t": "e", "p": pname, "g": gname}));
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1035 };
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1036 gamemux.on('begin', beginH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1037 gamemux.on('list', listH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1038 gamemux.on('end', endH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1039 conn.on('message', tell);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1040 conn.on('close', function () {
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1041 gamemux.removeListener('begin', beginH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1042 gamemux.removeListener('list', listH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1043 gamemux.removeListener('end', endH);
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1044 });
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1045 tell();
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1046 }
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1047 else
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1048 wsRequest.reject(404, "No such resource.");
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1049 }
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1050
163
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1051 /* Only games with low idle time are included. Use getStatus() for the
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1052 * complete list. */
104
7d444ba4739e RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 103
diff changeset
1053 function pushStatus() {
163
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1054 var now = new Date();
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1055 var statusinfo = {"t": "p", "s": allowlogin, "g": [], "dgl": []};
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1056 for (var tag in sessions) {
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1057 var delta = now - sessions[tag].lasttime;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1058 if (delta < 60000) {
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1059 var gamedesc = {};
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1060 gamedesc["p"] = sessions[tag].pname;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1061 gamedesc["g"] = sessions[tag].game.uname;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1062 gamedesc["i"] = delta;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1063 statusinfo["g"].push(gamedesc);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1064 }
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1065 }
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1066 for (var tag in dglgames) {
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1067 var dglinfo = {};
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1068 var slash = tag.search('/');
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1069 dglinfo["g"] = tag.slice(0, slash);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1070 dglinfo["p"] = tag.slice(slash + 1);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1071 dglinfo["i"] = -1;
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1072 statusinfo["dgl"].push(dglinfo);
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1073 }
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1074 gamemux.emit('list', statusinfo);
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1075 }
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1076
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1077 function shutdown () {
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1078 httpServer.close();
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1079 httpServer.removeAllListeners('request');
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1080 ctlServer.close();
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1081 tslog("Shutting down...");
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1082 process.exit();
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1083 }
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1084
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1085 function consoleHandler(chunk) {
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1086 var msg = chunk.toString().split('\n')[0];
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1087 if (msg == "quit") {
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1088 allowlogin = false;
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1089 tslog("Disconnecting...");
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1090 for (var tag in sessions) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1091 sessions[tag].close();
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1092 }
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
1093 progressWatcher.stdin.end("\n");
55
96815eae4ebe RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents: 49
diff changeset
1094 setTimeout(shutdown, 2000);
27
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1095 }
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1096 }
83f9a799a374 rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents: 26
diff changeset
1097
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1098 process.on("exit", function () {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1099 for (var tag in sessions) {
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1100 sessions[tag].term.kill('SIGHUP');
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1101 }
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
1102 tslog("Quitting...");
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1103 return;
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1104 });
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1105
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1106 /* Initialization STARTS HERE */
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1107 process.env["TERM"] = "xterm-256color";
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1108
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1109 if (process.getuid() != 0) {
26
9b58f8d3ea70 rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents: 23
diff changeset
1110 tslog("Not running as root, cannot chroot.");
0
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1111 process.exit(1);
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1112 }
bd412f63ce0d Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff changeset
1113
29
cf9d294bc52f rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents: 28
diff changeset
1114 var httpServer; // declare here so shutdown() can find it
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1115 var wsServer;
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
1116 var progressWatcher;
29
cf9d294bc52f rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents: 28
diff changeset
1117
157
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1118 var pwent;
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1119 try {
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1120 pwent = posix.getpwnam(dropToUser);
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1121 }
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1122 catch (err) {
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1123 tslog("Could not drop to user %s: user does not exist", dropToUser);
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1124 process.exit(1);
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1125 }
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1126
85
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1127 /* This could be nonblocking, but nothing else can start yet anyway. */
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1128 if (fs.existsSync(ctlsocket)) {
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1129 fs.unlinkSync(ctlsocket);
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1130 }
4303d94d87a2 rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents: 84
diff changeset
1131
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1132 /* Open the control socket before chrooting where it can't be found */
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1133 var ctlServer = net.createServer(function (sock) {
158
9961a538c00e rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents: 157
diff changeset
1134 sock.on('data', consoleHandler);
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1135 });
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1136 ctlServer.listen(ctlsocket, function () {
139
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
1137 /* rlgwebd.js now assumes that it has been started by the rlgwebd shell
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
1138 * script, or some other method that detaches it and sets up stdio. */
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
1139 /* chroot and drop permissions. posix.chroot() does chdir() itself. */
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1140 try {
139
dcd07c1d846a Replace the daemon module with posix.
John "Elwin" Edwards
parents: 132
diff changeset
1141 posix.chroot(chrootDir);
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1142 }
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1143 catch (err) {
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1144 tslog("chroot to %s failed: %s", chrootDir, err);
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1145 process.exit(1);
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1146 }
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1147 try {
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1148 // drop gid first, that requires UID=0
157
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1149 process.setgid(pwent.gid);
e7f809f06c5c Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents: 156
diff changeset
1150 process.setuid(pwent.uid);
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1151 }
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1152 catch (err) {
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1153 tslog("Could not drop permissions: %s", err);
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1154 process.exit(1);
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1155 }
29
cf9d294bc52f rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents: 28
diff changeset
1156 httpServer = http.createServer(webHandler);
30
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
1157 httpServer.listen(httpPort);
b5570a594266 rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents: 29
diff changeset
1158 tslog('rlgwebd running on port %d', httpPort);
100
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1159 wsServer = new WebSocketServer({"httpServer": httpServer});
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1160 wsServer.on("request", wsHandler);
3dbfdaf62623 RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents: 94
diff changeset
1161 tslog('WebSockets are online');
155
245a2959f504 Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents: 148
diff changeset
1162 progressWatcher = startProgressWatcher();
163
0f6da35b27a0 RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents: 162
diff changeset
1163 setInterval(pushStatus, 40000);
28
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1164 });
2ad2b6491aa9 rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents: 27
diff changeset
1165