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