Mercurial > hg > rlgwebd
annotate rlgwebd.js @ 132:823e878e5840
Logins don't time out anymore.
No more login timestamps either.
author | John "Elwin" Edwards <elwin@sdf.org> |
---|---|
date | Wed, 12 Sep 2012 15:48:41 -0700 |
parents | 3e3824711791 |
children | dcd07c1d846a |
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 // If you can't quite trust node to find it on its own |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
4 var localModules = '/usr/local/lib/node_modules/'; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
5 var http = require('http'); |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
6 var net = require('net'); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
7 var url = require('url'); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
8 var path = require('path'); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
9 var fs = require('fs'); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
10 var events = require('events'); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
11 var child_process = require('child_process'); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
12 var daemon = require(path.join(localModules, "daemon")); |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
13 var pty = require(path.join(localModules, "pty.js")); |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
14 var WebSocketServer = require(path.join(localModules, "websocket")).server; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
15 |
30
b5570a594266
rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents:
29
diff
changeset
|
16 /* Configuration variables */ |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
17 // These first two files are NOT in the chroot. |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
18 var ctlsocket = "/var/local/rlgwebd/ctl"; |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
19 var logfile = "/var/local/rlgwebd/log"; |
30
b5570a594266
rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents:
29
diff
changeset
|
20 var httpPort = 8080; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
21 var chrootDir = "/var/dgl/"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
22 var dropToUID = 501; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
23 var dropToGID = 501; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
24 var serveStaticRoot = "/var/www/"; // inside the chroot |
36
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
25 var playtimeout = 3600000; // Idle time before games are autosaved, in ms |
30
b5570a594266
rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents:
29
diff
changeset
|
26 |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
27 /* Data on the games available. */ |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
28 var games = { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
29 "rogue3": { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
30 "name": "Rogue V3", |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
31 "uname": "rogue3", |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
32 "suffix": ".r3sav", |
60
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
33 "path": "/bin/rogue3", |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
34 "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
|
35 }, |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
36 "rogue4": { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
37 "name": "Rogue V4", |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
38 "uname": "rogue4", |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
39 "suffix": ".r4sav", |
60
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
40 "path": "/bin/rogue4", |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
41 "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
|
42 }, |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
43 "rogue5": { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
44 "name": "Rogue V5", |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
45 "uname": "rogue5", |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
46 "suffix": ".r5sav", |
60
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
47 "path": "/bin/rogue5", |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
48 "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
|
49 }, |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
50 "srogue": { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
51 "name": "Super-Rogue", |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
52 "uname": "srogue", |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
53 "suffix": ".srsav", |
60
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
54 "path": "/bin/srogue", |
121
077adfeea038
Correct the clear sequence for srogue.
John "Elwin" Edwards <elwin@sdf.org>
parents:
120
diff
changeset
|
55 "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
|
56 }, |
54979d35611a
Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents:
113
diff
changeset
|
57 "arogue5": { |
54979d35611a
Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents:
113
diff
changeset
|
58 "name": "Advanced Rogue 5", |
54979d35611a
Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents:
113
diff
changeset
|
59 "uname": "arogue5", |
54979d35611a
Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents:
113
diff
changeset
|
60 "suffix": ".ar5sav", |
54979d35611a
Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents:
113
diff
changeset
|
61 "path": "/bin/arogue5", |
54979d35611a
Add support for Advanced Rogue 5.
John "Elwin" Edwards <elwin@sdf.org>
parents:
113
diff
changeset
|
62 "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
|
63 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
64 }; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
65 |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
66 /* Global state */ |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
67 var logins = {}; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
68 var sessions = {}; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
69 var clients = {}; |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
70 var allowlogin = true; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
71 var nextsession = 0; |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
72 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
|
73 |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
74 /* Constructor. A TermSession handles a pty and the game running on it. |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
75 * game: (String) Name of the game to launch. |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
76 * lkey: (String, key) The user's id, a key into logins. |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
77 * dims: (Array [Number, Number]) Height and width of the pty. |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
78 * handlers: (Object) Key-value pairs, event names and functions to |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
79 * install to handle them. |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
80 * Events: |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
81 * "open": Emitted on startup. Parameters: success (Boolean) |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
82 * "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
|
83 * "exit": Child terminated. Parameters: none |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
84 */ |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
85 function TermSession(game, lkey, dims, handlers) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
86 var ss = this; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
87 /* Subclass EventEmitter to do the hard work. */ |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
88 events.EventEmitter.call(this); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
89 for (var evname in handlers) |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
90 this.on(evname, handlers[evname]); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
91 /* Don't launch anything that's not a real game. */ |
32
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
92 if (game in games) { |
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
93 this.game = games[game]; |
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
94 } |
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
95 else { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
96 this.emit('open', false); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
97 return; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
98 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
99 if (lkey in logins) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
100 this.key = lkey; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
101 this.pname = logins[lkey].name; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
102 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
103 else { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
104 this.emit('open', false); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
105 return; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
106 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
107 /* Grab a spot in the sessions table. */ |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
108 this.sessid = nextsession++; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
109 sessions[this.sessid] = this; |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
110 /* Set up the sizes. */ |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
111 this.w = Math.floor(Number(dims[1])); |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
112 if (!(this.w > 0 && this.w < 256)) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
113 this.w = 80; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
114 this.h = Math.floor(Number(dims[0])); |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
115 if (!(this.h > 0 && this.h < 256)) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
116 this.h = 24; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
117 /* Environment. */ |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
118 var childenv = {}; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
119 for (var key in process.env) { |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
120 childenv[key] = process.env[key]; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
121 } |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
122 var args = ["-n", this.pname]; |
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
123 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
|
124 "name": "xterm-256color"}; |
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
125 this.term = pty.spawn(this.game.path, args, spawnopts); |
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
126 tslog("%s playing %s (index %d, pid %d)", this.pname, this.game.uname, |
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
127 this.sessid, this.term.pid); |
84
d59dc5cef412
rlgwebd.js: set the width and height on Player objects.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
128 this.emit('open', true, this.sessid); |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
129 gamemux.emit('begin', this.sessid, this.pname, this.game.uname); |
40
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
130 /* Set up the lockfile and ttyrec */ |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
131 var ts = timestamp(); |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
132 var progressdir = "/dgldir/inprogress-" + this.game.uname; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
133 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
|
134 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
|
135 fs.writeFile(this.lock, lmsg, "utf8"); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
136 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
|
137 ts + ".ttyrec"); |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
138 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
|
139 /* 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
|
140 * with a complete screen. */ |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
141 this.framebuf = new Buffer(1024); |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
142 this.frameoff = 0; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
143 logins[lkey].sessions.push(this.sessid); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
144 /* END setup */ |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
145 function ttyrec_chunk(datastr) { |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
146 var ts = new Date(); |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
147 var buf = new Buffer(datastr); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
148 var chunk = new Buffer(buf.length + 12); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
149 /* TTYREC headers */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
150 chunk.writeUInt32LE(Math.floor(ts.getTime() / 1000), 0); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
151 chunk.writeUInt32LE(1000 * (ts.getTime() % 1000), 4); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
152 chunk.writeUInt32LE(buf.length, 8); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
153 buf.copy(chunk, 12); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
154 ss.record.write(chunk); |
60
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
155 ss.framepush(buf); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
156 ss.emit('data', buf); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
157 } |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
158 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
|
159 this.framepush = function(chunk) { |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
160 /* 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
|
161 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
|
162 this.framebuf = new Buffer(1024); |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
163 this.frameoff = 0; |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
164 } |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
165 /* Make sure there's space. */ |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
166 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
|
167 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
|
168 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
|
169 this.framebuf = nbuf; |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
170 if (this.framebuf.length > 65536) { |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
171 tslog("Warning: Game %d frame buffer at %d bytes", this.sessid, |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
172 this.framebuf.length); |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
173 } |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
174 } |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
175 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
|
176 this.frameoff += chunk.length; |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
177 }; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
178 this.write = function(data) { |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
179 this.term.write(data); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
180 }; |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
181 // Teardown. |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
182 this.term.on("exit", function () { |
112
4f2b89e6fde2
RLG-Web: improvements to choices and status messaging.
John "Elwin" Edwards <elwin@sdf.org>
parents:
111
diff
changeset
|
183 var id = ss.sessid; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
184 fs.unlink(ss.lock); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
185 ss.record.end(); |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
186 ss.emit('exit'); |
112
4f2b89e6fde2
RLG-Web: improvements to choices and status messaging.
John "Elwin" Edwards <elwin@sdf.org>
parents:
111
diff
changeset
|
187 gamemux.emit('end', id, ss.pname, ss.game.uname); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
188 delete sessions[id]; |
60
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
189 tslog("Game %s ended.", id); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
190 }); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
191 this.close = function () { |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
192 if (this.sessid in sessions) |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
193 this.term.kill('SIGHUP'); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
194 }; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
195 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
196 TermSession.prototype = new events.EventEmitter(); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
197 |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
198 function Watcher(session) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
199 var ss = this; // that |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
200 this.session = session; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
201 this.alive = true; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
202 /* State for messaging. */ |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
203 this.nsend = 0; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
204 this.sendQ = []; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
205 /* Get a place in the table. */ |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
206 this.id = randkey(2); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
207 while (this.id in clients) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
208 this.id = randkey(2); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
209 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
210 clients[this.id] = this; |
60
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
211 /* Recreate the current screen state from the session's buffer. */ |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
212 this.sendQ.push({"t": "d", "n": this.nsend++, |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
213 "d": session.framebuf.toString("hex", 0, session.frameoff)}); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
214 function dataH(buf) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
215 var reply = {}; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
216 reply.t = "d"; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
217 reply.n = ss.nsend++; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
218 reply.d = buf.toString("hex"); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
219 ss.sendQ.push(reply); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
220 } |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
221 function exitH() { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
222 ss.alive = false; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
223 ss.sendQ.push({"t": "q"}); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
224 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
225 session.on('data', dataH); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
226 session.on('exit', exitH); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
227 this.read = function() { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
228 /* Returns an array of all outstanding messages, empty if none. */ |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
229 var temp = this.sendQ; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
230 this.sendQ = []; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
231 /* Clean up if finished. */ |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
232 if (!this.alive) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
233 delete clients[this.id]; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
234 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
235 return temp; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
236 }; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
237 this.quit = function() { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
238 this.session.removeListener('data', dataH); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
239 this.session.removeListener('exit', exitH); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
240 delete clients[this.id]; |
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 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
243 |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
244 function Player(gamename, lkey, dims, callback) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
245 var ss = this; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
246 this.alive = false; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
247 /* State for messaging. */ |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
248 this.nsend = 0; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
249 this.nrecv = 0; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
250 this.sendQ = []; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
251 this.recvQ = [] |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
252 this.Qtimeout = null; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
253 /* Get a place in the table. */ |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
254 this.id = randkey(2); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
255 while (this.id in clients) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
256 this.id = randkey(2); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
257 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
258 clients[this.id] = this; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
259 |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
260 this.read = function() { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
261 var temp = this.sendQ; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
262 this.sendQ = []; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
263 /* Clean up if finished. */ |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
264 if (!this.alive) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
265 clearTimeout(this.Qtimeout); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
266 delete clients[this.id]; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
267 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
268 return temp; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
269 }; |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
270 this.write = function (data, n) { |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
271 if (!this.alive || typeof (n) != "number") { |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
272 return; |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
273 } |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
274 var oindex = n - this.nrecv; |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
275 if (oindex === 0) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
276 this.session.write(data); |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
277 this.nrecv++; |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
278 var next; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
279 while ((next = this.recvQ.shift()) !== undefined) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
280 this.session.write(next); |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
281 this.nrecv++; |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
282 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
283 if (this.recvQ.length == 0 && this.Qtimeout) { |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
284 clearTimeout(this.Qtimeout); |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
285 this.Qtimeout = null; |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
286 } |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
287 } |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
288 else if (oindex > 0 && oindex <= 1024) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
289 tslog("Client %s: Stashing message %d at %d", this.id, n, oindex - 1); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
290 this.recvQ[oindex - 1] = data; |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
291 if (!this.Qtimeout) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
292 var nextn = this.nrecv + this.recvQ.length + 1; |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
293 this.Qtimeout = setTimeout(this.flushQ, 30000, this, nextn); |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
294 } |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
295 } |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
296 /* Otherwise, discard it */ |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
297 return; |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
298 }; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
299 this.flushQ = function (client, n) { |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
300 /* Callback for when an unreceived message times out. |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
301 * n is the first empty space that will not be given up on. */ |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
302 if (!client.alive || client.nrecv >= n) |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
303 return; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
304 client.nrecv++; |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
305 var next; |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
306 /* Clear the queue up to n */ |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
307 while (client.nrecv < n) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
308 next = client.recvQ.shift(); |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
309 if (next !== undefined) |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
310 client.session.write(next); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
311 client.nrecv++; |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
312 } |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
313 /* Clear out anything that's ready. */ |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
314 while ((next = client.recvQ.shift()) !== undefined) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
315 client.session.write(next); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
316 client.nrecv++; |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
317 } |
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
318 /* Now set another timeout if necessary. */ |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
319 if (client.recvQ.length != 0) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
320 var nextn = client.nrecv + client.recvQ.length + 1; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
321 client.Qtimeout = setTimeout(client.flushQ, 30000, client, nextn); |
23
21de24c08aed
Implement message order correction on the server side.
John "Elwin" Edwards <elwin@sdf.org>
parents:
22
diff
changeset
|
322 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
323 tslog("Flushing queue for player %s", player.id); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
324 }; |
94
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
325 this.reset = function () { |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
326 /* To be called when the game is taken over. */ |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
327 if (this.Qtimeout) { |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
328 clearTimeout(this.Qtimeout); |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
329 this.Qtimeout = null; |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
330 } |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
331 for (var i = 0; i < this.recvQ.length; i++) { |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
332 if (this.recvQ[i] !== undefined) { |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
333 this.session.write(this.recvQ[i]); |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
334 } |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
335 } |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
336 this.recvQ = []; |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
337 this.nrecv = 0; |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
338 this.nsend = 0; |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
339 this.sendQ = [{"t": "d", "n": this.nsend++, |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
340 "d": this.session.framebuf.toString("hex", 0, this.session.frameoff)}]; |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
341 }; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
342 this.quit = function() { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
343 if (this.alive) |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
344 this.session.close(); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
345 }; |
84
d59dc5cef412
rlgwebd.js: set the width and height on Player objects.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
346 function openH(success, id) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
347 if (success) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
348 ss.alive = true; |
84
d59dc5cef412
rlgwebd.js: set the width and height on Player objects.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
349 ss.session = sessions[id]; |
d59dc5cef412
rlgwebd.js: set the width and height on Player objects.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
350 ss.h = sessions[id].h; |
d59dc5cef412
rlgwebd.js: set the width and height on Player objects.
John "Elwin" Edwards <elwin@sdf.org>
parents:
81
diff
changeset
|
351 ss.w = sessions[id].w; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
352 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
353 callback(ss, success); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
354 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
355 function dataH(chunk) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
356 var reply = {}; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
357 reply.t = "d"; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
358 reply.n = ss.nsend++; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
359 reply.d = chunk.toString("hex"); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
360 ss.sendQ.push(reply); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
361 } |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
362 function exitH() { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
363 ss.alive = false; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
364 ss.sendQ.push({"t": "q"}); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
365 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
366 var handlers = {'open': openH, 'data': dataH, 'exit': exitH}; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
367 this.session = new TermSession(gamename, lkey, dims, handlers); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
368 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
369 |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
370 // Also known as WebSocketAndTermSessionClosureGlueFactory |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
371 function wsWatcher(conn, session) { |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
372 var ss = this; // is this even needed? |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
373 var dataH = function(buf) { |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
374 conn.sendUTF(JSON.stringify({"t": "d", "d": buf.toString("hex")})); |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
375 }; |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
376 var exitH = function() { |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
377 if (conn.connected) |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
378 conn.close(); |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
379 } |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
380 session.on('data', dataH); |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
381 session.on('exit', exitH); |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
382 conn.on('close', function(code, desc) { |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
383 session.removeListener('data', dataH); |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
384 session.removeListener('exit', exitH); |
102
f34a286c51bd
RLG-Web server: code cleanup.
John "Elwin" Edwards <elwin@sdf.org>
parents:
101
diff
changeset
|
385 if (session.sessid in sessions) |
f34a286c51bd
RLG-Web server: code cleanup.
John "Elwin" Edwards <elwin@sdf.org>
parents:
101
diff
changeset
|
386 tslog("A WebSocket watcher has left game %d", session.sessid); |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
387 }); |
101
e59d68082664
RLG-Web: Complete the WebSocket watcher.
John "Elwin" Edwards <elwin@sdf.org>
parents:
100
diff
changeset
|
388 conn.sendUTF(JSON.stringify({ |
e59d68082664
RLG-Web: Complete the WebSocket watcher.
John "Elwin" Edwards <elwin@sdf.org>
parents:
100
diff
changeset
|
389 "t": "w", "w": session.w, "h": session.h, |
e59d68082664
RLG-Web: Complete the WebSocket watcher.
John "Elwin" Edwards <elwin@sdf.org>
parents:
100
diff
changeset
|
390 "p": session.pname, "g": session.game.uname |
e59d68082664
RLG-Web: Complete the WebSocket watcher.
John "Elwin" Edwards <elwin@sdf.org>
parents:
100
diff
changeset
|
391 })); |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
392 conn.sendUTF(JSON.stringify({"t": "d", |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
393 "d": session.framebuf.toString("hex", 0, session.frameoff)})); |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
394 } |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
395 |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
396 function wsPlay(wsReq, game, lkey, dims) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
397 var conn; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
398 var session; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
399 /* Listeners on the WebSocket */ |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
400 function messageH(message) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
401 var parsedMsg = getMsgWS(message); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
402 if (parsedMsg.t == 'q') { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
403 session.close(); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
404 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
405 else if (parsedMsg.t == 'd') { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
406 var hexstr = parsedMsg.d.replace(/[^0-9a-f]/gi, ""); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
407 if (hexstr.length % 2 != 0) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
408 hexstr = hexstr.slice(0, -1); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
409 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
410 var keybuf = new Buffer(hexstr, "hex"); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
411 session.write(keybuf); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
412 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
413 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
414 function closeH() { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
415 session.close(); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
416 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
417 /* These listen on the TermSession. */ |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
418 function openH(success, id) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
419 if (success) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
420 var reply = {"t": "s", "id": id, "w": sessions[id].w, "h": |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
421 sessions[id].h, "p": sessions[id].pname, "g": game}; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
422 conn = wsReq.accept(null, wsReq.origin); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
423 conn.sendUTF(JSON.stringify(reply)); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
424 conn.on('message', messageH); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
425 conn.on('close', closeH); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
426 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
427 else { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
428 wsReq.reject(500, errorcodes[5]); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
429 tslog("Unable to allocate TTY for %s", game); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
430 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
431 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
432 function dataH(chunk) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
433 var msg = {}; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
434 msg.t = "d"; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
435 msg.d = chunk.toString("hex"); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
436 conn.sendUTF(JSON.stringify(msg)); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
437 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
438 function exitH() { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
439 if (conn.connected) |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
440 conn.sendUTF(JSON.stringify({"t": "q"})); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
441 conn.close(); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
442 session.removeListener('open', openH); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
443 session.removeListener('data', dataH); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
444 session.removeListener('exit', exitH); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
445 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
446 var handlers = {'open': openH, 'data': dataH, 'exit': exitH}; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
447 session = new TermSession(game, lkey, dims, handlers); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
448 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
449 |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
450 function wsStart(wsReq) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
451 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
|
452 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
|
453 wsReq.reject(404, errorcodes[2]); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
454 return; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
455 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
456 var gname = playmatch[1]; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
457 if (!allowlogin) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
458 wsReq.reject(404, errorcodes[6]); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
459 return; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
460 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
461 if (!("key" in wsReq.resourceURL.query)) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
462 wsReq.reject(404, "No key given."); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
463 return; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
464 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
465 var lkey = wsReq.resourceURL.query["key"]; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
466 if (!(lkey in logins)) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
467 wsReq.reject(404, errorcodes[1]); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
468 return; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
469 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
470 var pname = logins[lkey].name; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
471 var dims = [wsReq.resourceURL.query.h, wsReq.resourceURL.query.w]; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
472 function progcallback(err, fname) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
473 if (fname) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
474 wsReq.reject(404, errorcodes[4]); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
475 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
|
476 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
477 else |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
478 wsPlay(wsReq, gname, lkey, dims); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
479 }; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
480 checkprogress(pname, games[gname], progcallback, []); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
481 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
482 |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
483 /* 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
|
484 * 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
|
485 * the game. */ |
40
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
486 function checkprogress(user, game, callback, args) { |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
487 var progressdir = "/dgldir/inprogress-" + game.uname; |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
488 fs.readdir(progressdir, function(err, files) { |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
489 if (err) { |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
490 args.unshift(err, null); |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
491 callback.apply(null, args); |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
492 return; |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
493 } |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
494 var fre = RegExp("^" + user + ":"); |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
495 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
|
496 if (files[i].match(fre)) { |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
497 args.unshift(null, files[i]); |
40
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
498 callback.apply(null, args); |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
499 return; |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
500 } |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
501 } |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
502 args.unshift(null, false); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
503 callback.apply(null, args); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
504 }); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
505 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
506 |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
507 function checksaved(user, game, callback, args) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
508 var savedirc = game.uname + "save"; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
509 var basename = String(dropToUID) + "-" + user + game.suffix; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
510 var savefile = path.join("/var/games/roguelike", savedirc, basename); |
81 | 511 fs.exists(savefile, function (exist) { |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
512 args.unshift(exist); |
40
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
513 callback.apply(null, args); |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
514 }); |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
515 } |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
516 |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
517 function playerstatus(user, callback) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
518 var sdata = {}; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
519 function finishp() { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
520 for (var gname in games) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
521 if (!(gname in sdata)) |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
522 return; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
523 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
524 callback(sdata); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
525 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
526 function regsaved(exists, game) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
527 if (exists) |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
528 sdata[game.uname] = "s"; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
529 else |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
530 sdata[game.uname] = "0"; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
531 finishp(); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
532 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
533 function regactive(err, filename, game) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
534 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
|
535 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
|
536 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
|
537 else |
d644e7d46852
RLG-Web: make /pstatus/* differentiate between dgl and RLG-Web games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
87
diff
changeset
|
538 sdata[game.uname] = "d"; |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
539 finishp(); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
540 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
541 else |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
542 checksaved(user, game, regsaved, [game]); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
543 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
544 for (var gname in games) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
545 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
|
546 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
547 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
548 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
549 /* A few utility functions */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
550 function timestamp() { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
551 dd = new Date(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
552 sd = dd.toISOString(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
553 sd = sd.slice(0, sd.indexOf(".")); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
554 return sd.replace("T", "."); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
555 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
556 |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
557 function randkey(words) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
558 if (!words || !(words > 0)) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
559 words = 1; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
560 function rand32() { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
561 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
|
562 hexstr = rnum.toString(16); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
563 while (hexstr.length < 8) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
564 hexstr = "0" + hexstr; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
565 return hexstr; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
566 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
567 var key = ""; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
568 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
|
569 key += rand32(); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
570 return key; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
571 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
572 |
60
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
573 /* 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
|
574 function bufncmp(buf1, buf2, n) { |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
575 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
|
576 return false; |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
577 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
|
578 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
|
579 return true; |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
580 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
|
581 return false; |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
582 if (buf1[i] != buf2[i]) |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
583 return false; |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
584 } |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
585 return true; |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
586 } |
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
587 |
26
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
588 function tslog() { |
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
589 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
|
590 console.log.apply(console, arguments); |
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
591 } |
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
592 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
593 /* 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
|
594 function getCookies(req) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
595 cookies = []; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
596 if ("cookie" in req.headers) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
597 cookstrs = req.headers["cookie"].split("; "); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
598 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
|
599 eqsign = cookstrs[i].indexOf("="); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
600 if (eqsign > 0) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
601 name = cookstrs[i].slice(0, eqsign).toLowerCase(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
602 val = cookstrs[i].slice(eqsign + 1); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
603 cookies[name] = val; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
604 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
605 else if (eqsign < 0) |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
606 cookies[cookstrs[i]] = null; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
607 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
608 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
609 return cookies; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
610 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
611 |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
612 function getMsg(posttext) { |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
613 var jsonobj; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
614 if (!posttext) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
615 return {}; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
616 try { |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
617 jsonobj = JSON.parse(posttext); |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
618 } |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
619 catch (e) { |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
620 if (e instanceof SyntaxError) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
621 return {}; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
622 } |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
623 if (typeof(jsonobj) != "object") |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
624 return {}; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
625 return jsonobj; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
626 } |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
627 |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
628 function getMsgWS(msgObj) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
629 if (msgObj.type != "utf8") |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
630 return {}; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
631 return getMsg(msgObj.utf8Data); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
632 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
633 |
36
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
634 function reaper() { |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
635 var now = new Date(); |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
636 function reapcheck(session) { |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
637 fs.fstat(session.record.fd, function (err, stats) { |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
638 if (!err && now - stats.mtime > playtimeout) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
639 tslog("Reaping session %s", session.sessid); |
47
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
640 /* Dissociate it with its login name. */ |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
641 var sn = logins[session.key].sessions.indexOf(session.sessid); |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
642 if (sn >= 0) { |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
643 logins[session.key].sessions.splice(sn, 1); |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
644 } |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
645 /* Shut it down. */ |
36
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
646 session.close(); |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
647 } |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
648 }); |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
649 } |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
650 for (var sessid in sessions) { |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
651 reapcheck(sessions[sessid]); |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
652 } |
47
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
653 for (var lkey in logins) { |
132
823e878e5840
Logins don't time out anymore.
John "Elwin" Edwards <elwin@sdf.org>
parents:
126
diff
changeset
|
654 if (logins[lkey].sessions.length > 0) { |
823e878e5840
Logins don't time out anymore.
John "Elwin" Edwards <elwin@sdf.org>
parents:
126
diff
changeset
|
655 /* Check for games that have terminated normally, and remove them. */ |
47
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
656 var expired = []; |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
657 var targarray = logins[lkey].sessions; |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
658 /* Let's not find out what happens if you modify an array |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
659 * you're iterating through. */ |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
660 for (var i = 0; i < targarray.length; i++) { |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
661 if (!(targarray[i] in sessions)) |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
662 expired.push(targarray[i]); |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
663 } |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
664 if (expired.length > 0) { |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
665 for (var j = 0; j < expired.length; j++) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
666 targarray.splice(targarray.indexOf(expired[j]), 1); |
47
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
667 } |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
668 } |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
669 } |
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
670 } |
36
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
671 } |
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
672 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
673 function login(req, res, formdata) { |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
674 if (!allowlogin) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
675 sendError(res, 6, null, false); |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
676 return; |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
677 } |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
678 if (!("name" in formdata)) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
679 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
|
680 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
681 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
682 else if (!("pw" in formdata)) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
683 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
|
684 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
685 } |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
686 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
|
687 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
|
688 function checkit(code, signal) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
689 /* 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
|
690 if (code != 0) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
691 sendError(res, 3); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
692 if (code == 1) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
693 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
|
694 else if (code == 2) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
695 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
|
696 else |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
697 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
|
698 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
699 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
700 var lkey = randkey(2); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
701 while (lkey in logins) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
702 lkey = randkey(2); |
47
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
703 logins[lkey] = {"name": username, "ts": new Date(), "sessions": []}; |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
704 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
|
705 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
|
706 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
|
707 res.end(); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
708 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
|
709 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
710 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
711 /* 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
|
712 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
|
713 pwchecker.on("exit", checkit); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
714 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
|
715 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
716 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
717 |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
718 function startgame(req, res, formdata) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
719 if (!allowlogin) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
720 sendError(res, 6, null); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
721 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
722 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
723 if (!("key" in formdata)) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
724 sendError(res, 2, "No key given."); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
725 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
726 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
727 else if (!("game" in formdata)) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
728 sendError(res, 2, "No game specified."); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
729 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
730 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
731 var lkey = String(formdata["key"]); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
732 if (!(lkey in logins)) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
733 sendError(res, 1, null); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
734 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
735 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
736 var username = logins[lkey].name; |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
737 var gname = formdata["game"]; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
738 // If dims are not given or invalid, the constructor will handle it. |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
739 var dims = [formdata["h"], formdata["w"]]; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
740 if (!(gname in games)) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
741 sendError(res, 2, "No such game: " + gname); |
26
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
742 tslog("Request for nonexistant game \"%s\"", gname); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
743 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
744 } |
40
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
745 // A callback to pass to the game-in-progress checker. |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
746 var launch = function(err, fname) { |
94
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
747 var nodematch = new RegExp("^" + username + ":node:"); |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
748 if (fname && (fname.match(nodematch) === null)) { |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
749 /* It's being played in dgamelaunch. */ |
109
67b393f10c2b
RLG-Web: improve taking over sessions.
John "Elwin" Edwards <elwin@sdf.org>
parents:
107
diff
changeset
|
750 sendError(res, 4, "dgamelaunch"); |
40
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
751 tslog("%s is already playing %s", username, gname); |
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
752 return; |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
753 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
754 // Game starting has been approved. |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
755 var respondlaunch = function(nclient, success) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
756 if (success) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
757 res.writeHead(200, {'Content-Type': 'application/json'}); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
758 var reply = {"t": "s", "id": nclient.id, "w": nclient.w, "h": |
91
e07f98799120
RLG-Web: improve game-starting messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
88
diff
changeset
|
759 nclient.h, "p": username, "g": gname}; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
760 res.write(JSON.stringify(reply)); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
761 res.end(); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
762 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
763 else { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
764 sendError(res, 5, "Failed to open TTY"); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
765 tslog("Unable to allocate TTY for %s", gname); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
766 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
767 }; |
94
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
768 if (fname) { |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
769 for (var cid in clients) { |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
770 cli = clients[cid]; |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
771 if ((cli instanceof Player) && |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
772 cli.session.pname == username && |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
773 cli.session.game.uname == gname) { |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
774 cli.reset(); |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
775 respondlaunch(cli, true); |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
776 tslog("Game %d has been taken over.", cli.session.sessid); |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
777 return; |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
778 } |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
779 } |
109
67b393f10c2b
RLG-Web: improve taking over sessions.
John "Elwin" Edwards <elwin@sdf.org>
parents:
107
diff
changeset
|
780 /* If there's no player, it's a WebSocket game, and shouldn't be |
67b393f10c2b
RLG-Web: improve taking over sessions.
John "Elwin" Edwards <elwin@sdf.org>
parents:
107
diff
changeset
|
781 * seized. */ |
67b393f10c2b
RLG-Web: improve taking over sessions.
John "Elwin" Edwards <elwin@sdf.org>
parents:
107
diff
changeset
|
782 sendError(res, 4, "WebSocket"); |
94
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
783 } |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
784 else { |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
785 new Player(gname, lkey, dims, respondlaunch); |
597e9477b8ae
RLG-Web: Allow games to be taken over.
John "Elwin" Edwards <elwin@sdf.org>
parents:
91
diff
changeset
|
786 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
787 }; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
788 checkprogress(username, games[gname], launch, []); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
789 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
790 |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
791 function watch(req, res, formdata) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
792 if (!("n" in formdata)) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
793 sendError(res, 2, "Game number not given"); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
794 return; |
40
f7116eb3f791
rlgwebd.js: refactor some game-starting code.
John "Elwin" Edwards <elwin@sdf.org>
parents:
39
diff
changeset
|
795 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
796 var gamenumber = Number(formdata["n"]); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
797 if (!(gamenumber in sessions)) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
798 sendError(res, 7); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
799 return; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
800 } |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
801 var session = sessions[gamenumber]; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
802 var watch = new Watcher(session); |
91
e07f98799120
RLG-Web: improve game-starting messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
88
diff
changeset
|
803 var reply = {"t": "w", "id": watch.id, "w": session.w, "h": session.h, |
e07f98799120
RLG-Web: improve game-starting messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
88
diff
changeset
|
804 "p": session.pname, "g": session.game.uname}; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
805 res.writeHead(200, {'Content-Type': 'application/json'}); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
806 res.write(JSON.stringify(reply)); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
807 res.end(); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
808 tslog("Game %d is being watched (key %s)", gamenumber, watch.id); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
809 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
810 |
20
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
811 /* 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
|
812 function regsetup(username) { |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
813 function regsetup_l2(err) { |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
814 for (var g in games) { |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
815 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
|
816 } |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
817 } |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
818 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
|
819 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
|
820 } |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
821 |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
822 function register(req, res, formdata) { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
823 var uname, passwd, email; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
824 if (typeof (formdata.name) != "string" || formdata.name === "") { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
825 sendError(res, 2, "No name given."); |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
826 return; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
827 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
828 else |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
829 uname = formdata["name"]; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
830 if (typeof (formdata.pw) != "string" || formdata.pw === "") { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
831 sendError(res, 2, "No password given."); |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
832 return; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
833 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
834 else |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
835 passwd = formdata["pw"]; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
836 if (typeof (formdata.email) != "string" || formdata.email === "") { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
837 /* E-mail is optional */ |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
838 email = "nobody@nowhere.not"; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
839 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
840 else |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
841 email = formdata["email"]; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
842 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
|
843 if (code === 0) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
844 var lkey = randkey(2); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
845 while (lkey in logins) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
846 lkey = randkey(2); |
47
27b7f0c8b9f0
RLG-Web: make login sessions time out.
John "Elwin" Edwards <elwin@sdf.org>
parents:
43
diff
changeset
|
847 logins[lkey] = {"name": uname, "ts": new Date(), "sessions": []}; |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
848 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
|
849 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
|
850 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
|
851 res.end(); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
852 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
|
853 regsetup(uname); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
854 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
855 else if (code == 4) { |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
856 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
|
857 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
|
858 } |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
859 else if (code == 1) { |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
860 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
|
861 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
|
862 } |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
863 else { |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
864 sendError(res, 0, null); |
26
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
865 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
|
866 } |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
867 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
868 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
|
869 child_adder.on("exit", checkreg); |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
870 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
|
871 return; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
872 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
873 |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
874 /* Ends the game, obviously. Less obviously, stops watching the game if |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
875 * the client is a Watcher instead of a Player. */ |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
876 function endgame(client, res) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
877 if (!client.alive) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
878 sendError(res, 7, null, true); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
879 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
880 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
881 client.quit(); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
882 // Give things some time to happen. |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
883 if (client instanceof Player) |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
884 setTimeout(readFeed, 200, client, res); |
62
7793ad53b90f
rlgwebd.js: fix failure to respond.
John "Elwin" Edwards <elwin@sdf.org>
parents:
60
diff
changeset
|
885 else |
7793ad53b90f
rlgwebd.js: fix failure to respond.
John "Elwin" Edwards <elwin@sdf.org>
parents:
60
diff
changeset
|
886 readFeed(client, res); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
887 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
888 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
889 |
111
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
890 /* 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
|
891 function stopgame(res, formdata) { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
892 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
|
893 sendError(res, 1); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
894 return; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
895 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
896 var pname = logins[formdata["key"]].name; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
897 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
|
898 sendError(res, 2, "No such game."); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
899 return; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
900 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
901 var gname = formdata["g"]; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
902 function checkback(err, fname) { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
903 if (!fname) { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
904 sendError(res, 7); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
905 return; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
906 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
907 var fullfile = path.join("/dgldir/inprogress-" + gname, fname); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
908 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
|
909 if (err) { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
910 sendError(res, 7); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
911 return; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
912 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
913 var pid = parseInt(fdata.split('\n')[0], 10); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
914 process.kill(pid, 'SIGHUP'); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
915 /* 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
|
916 * 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
|
917 * poll fname until it disappears. */ |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
918 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
|
919 res.write(JSON.stringify({"t": "q"})); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
920 res.end(); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
921 }); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
922 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
923 checkprogress(pname, games[gname], checkback, []); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
924 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
925 |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
926 function findClient(formdata, playersOnly) { |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
927 if (typeof(formdata) != "object") |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
928 return null; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
929 if ("id" in formdata) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
930 var id = formdata["id"]; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
931 if (id in clients && (!playersOnly || clients[id] instanceof Player)) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
932 return clients[id]; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
933 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
934 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
935 return null; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
936 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
937 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
938 function serveStatic(req, res, fname) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
939 var nname = path.normalize(fname); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
940 if (nname == "" || nname == "/") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
941 nname = "index.html"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
942 if (nname.match(/\/$/)) |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
943 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
|
944 var realname = path.join(serveStaticRoot, nname); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
945 var extension = path.extname(realname); |
81 | 946 fs.exists(realname, function (exists) { |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
947 var resheaders = {}; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
948 if (!exists || !extension || extension == ".html") |
31
7dd6becf9ce9
rlgwebd.js: improve MIME types.
John "Elwin" Edwards <elwin@sdf.org>
parents:
30
diff
changeset
|
949 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
|
950 else if (extension == ".png") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
951 resheaders["Content-Type"] = "image/png"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
952 else if (extension == ".css") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
953 resheaders["Content-Type"] = "text/css"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
954 else if (extension == ".js") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
955 resheaders["Content-Type"] = "text/javascript"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
956 else if (extension == ".svg") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
957 resheaders["Content-Type"] = "image/svg+xml"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
958 else |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
959 resheaders["Content-Type"] = "application/octet-stream"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
960 if (exists) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
961 fs.readFile(realname, function (error, data) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
962 if (error) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
963 res.writeHead(500, {}); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
964 res.end(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
965 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
966 else { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
967 res.writeHead(200, resheaders); |
34
57f4b36ef06b
rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents:
32
diff
changeset
|
968 if (req.method != 'HEAD') |
57f4b36ef06b
rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents:
32
diff
changeset
|
969 res.write(data); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
970 res.end(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
971 } |
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 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
974 else { |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
975 send404(res, nname, req.method == 'HEAD'); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
976 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
977 }); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
978 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
979 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
980 |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
981 function readFeed(client, res) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
982 if (!client) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
983 sendError(res, 7, null, true); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
984 return; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
985 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
986 var msgs = client.read(); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
987 if (!allowlogin && !msgs.length) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
988 sendError(res, 6, null, true); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
989 return; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
990 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
991 res.writeHead(200, { "Content-Type": "application/json" }); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
992 res.write(JSON.stringify(msgs)); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
993 res.end(); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
994 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
995 |
103
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
996 function getStatus(callback) { |
66
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
997 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
|
998 var statusinfo = {"s": allowlogin, "g": []}; |
66
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
999 function idleset(i, idletime) { |
103
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1000 if (i >= 0 && i < statusinfo.g.length) { |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1001 statusinfo.g[i].i = idletime; |
66
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1002 } |
103
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1003 for (var j = 0; j < statusinfo.g.length; j++) { |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1004 if (!("i" in statusinfo.g[j])) |
66
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1005 return; |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1006 } |
103
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1007 callback(statusinfo); |
66
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1008 } |
32
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
1009 for (var sessid in sessions) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1010 var gamedesc = {}; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1011 gamedesc["n"] = sessid; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1012 gamedesc["p"] = sessions[sessid].pname; |
64
e3082fd06520
Some status improvements.
John "Elwin" Edwards <elwin@sdf.org>
parents:
62
diff
changeset
|
1013 gamedesc["g"] = sessions[sessid].game.uname; |
103
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1014 statusinfo["g"].push(gamedesc); |
32
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
1015 } |
103
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1016 if (statusinfo.g.length == 0) { |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1017 callback(statusinfo); |
66
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1018 return; |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1019 } |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1020 function makecallback(i) { |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1021 return function (err, stats) { |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1022 if (err) |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1023 idleset(i, null); |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1024 else |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1025 idleset(i, now - stats.mtime); |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1026 } |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1027 } |
103
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1028 for (var i = 0; i < statusinfo.g.length; i++) { |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1029 if (statusinfo.g[i].n in sessions) { |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1030 fs.fstat(sessions[statusinfo.g[i].n].record.fd, makecallback(i)); |
66
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1031 } |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1032 else { |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1033 idleset(i, null); |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1034 } |
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
1035 } |
32
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
1036 } |
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
1037 |
103
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1038 function statusmsg(req, res) { |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1039 function respond(info) { |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1040 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
|
1041 if (req.method != 'HEAD') |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1042 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
|
1043 res.end(); |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1044 } |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1045 getStatus(respond); |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1046 } |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
1047 |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1048 function pstatusmsg(req, res) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1049 if (req.method == 'HEAD') { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1050 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
|
1051 res.end(); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1052 return; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1053 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1054 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
|
1055 var pmatch = target.match(/^\/pstatus\/(.*)/); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1056 if (pmatch && pmatch[1]) |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1057 var pname = pmatch[1]; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1058 else { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1059 sendError(res, 2, "No name given."); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1060 return; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1061 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1062 var reply = {"name": pname}; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1063 playerstatus(pname, function (pdata) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1064 reply["stat"] = pdata; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1065 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
|
1066 res.write(JSON.stringify(reply)); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1067 res.end(); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1068 }); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1069 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1070 |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1071 function getuinfo(req, res) { |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1072 var urlobj = url.parse(req.url, true); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1073 var query = urlobj.query; |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1074 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
|
1075 sendError(res, 1); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1076 return; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1077 } |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1078 var match = urlobj.pathname.match(/^\/[^\/]*\/(.*)/); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1079 if (!match || !match[1]) { |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1080 send404(res, urlobj.pathname, req.method == 'HEAD'); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1081 return; |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1082 } |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1083 var which = match[1]; |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1084 var name = logins[query["key"]].name; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1085 var reply = { "u": name }; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1086 function send() { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1087 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
|
1088 res.write(JSON.stringify(reply)); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1089 res.end(); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1090 } |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1091 if (which == "pw") { |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1092 /* Don't actually divulge passwords. */ |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1093 reply["pw"] = ""; |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1094 send(); |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1095 } |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1096 else if (which == "email") { |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1097 var address; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1098 function finish(code, signal) { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1099 if (code != 0) { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1100 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
|
1101 sendError(res, 2); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1102 } |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1103 else { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1104 reply["email"] = address; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1105 send(); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1106 } |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1107 } |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1108 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
|
1109 subproc.stdout.on("data", function (data) { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1110 address = data.toString().replace(/\n/g, ""); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1111 }); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1112 subproc.on("exit", finish); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1113 subproc.stdin.end(name + '\n', "utf8"); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1114 } |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1115 else { |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1116 send404(res, urlobj.pathname, req.method == 'HEAD'); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1117 return; |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1118 } |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1119 } |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1120 |
126
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1121 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
|
1122 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
|
1123 var query = urlobj.query; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1124 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
|
1125 sendError(res, 1); |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1126 return; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1127 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1128 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
|
1129 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
|
1130 if (!match || !match[1]) { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1131 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
|
1132 return; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1133 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1134 var which = match[1]; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1135 if (!("v" in postdata)) { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1136 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
|
1137 return; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1138 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1139 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
|
1140 var args; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1141 if (which == "email") |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1142 args = ["setmail"]; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1143 else |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1144 args = ["setpw"]; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1145 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
|
1146 function (err, stdout, stderr) { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1147 if (err) { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1148 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
|
1149 sendError(res, 2); |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1150 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1151 else { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1152 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
|
1153 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
|
1154 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
|
1155 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1156 }); |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1157 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
|
1158 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1159 else { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1160 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
|
1161 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1162 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1163 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1164 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
|
1165 "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
|
1166 "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
|
1167 |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1168 function sendError(res, ecode, msg, box) { |
31
7dd6becf9ce9
rlgwebd.js: improve MIME types.
John "Elwin" Edwards <elwin@sdf.org>
parents:
30
diff
changeset
|
1169 res.writeHead(200, { "Content-Type": "application/json" }); |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1170 var edict = {"t": "E"}; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1171 if (!(ecode < errorcodes.length && ecode > 0)) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1172 ecode = 0; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1173 edict["c"] = ecode; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1174 edict["s"] = errorcodes[ecode]; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1175 if (msg) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1176 edict["s"] += ": " + msg; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1177 if (box) |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1178 res.write(JSON.stringify([edict])); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1179 else |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1180 res.write(JSON.stringify(edict)); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1181 res.end(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1182 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1183 |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1184 function send404(res, path, nopage) { |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1185 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
|
1186 if (!nopage) { |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1187 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
|
1188 + path + " Not Found</h1></body></html>\n"); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1189 } |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1190 res.end(); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1191 } |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1192 |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1193 function webHandler(req, res) { |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1194 /* default headers for the response */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1195 var resheaders = {'Content-Type': 'text/html'}; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1196 /* 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
|
1197 var reqbody = ""; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1198 var formdata; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1199 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1200 /* Register a listener to get the body. */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1201 function moredata(chunk) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1202 reqbody += chunk; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1203 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1204 req.on('data', moredata); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1205 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1206 /* 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
|
1207 function respond() { |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1208 formdata = getMsg(reqbody); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1209 var target = url.parse(req.url).pathname; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1210 /* 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
|
1211 if (req.method == 'POST') { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1212 if (target == '/feed') { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1213 var client = findClient(formdata, false); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1214 if (!client) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1215 sendError(res, 7, null, true); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1216 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1217 } |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1218 if (formdata.t == "q") { |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1219 /* The client wants to terminate the process. */ |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1220 endgame(client, res); |
60
31bb3cf4f25f
Make sure watchers start with completely drawn screens.
John "Elwin" Edwards <elwin@sdf.org>
parents:
55
diff
changeset
|
1221 return; // endgame() calls readFeed() itself. |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1222 } |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1223 else if (formdata.t == "d" && typeof(formdata.d) == "string") { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1224 if (!(client instanceof Player)) { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1225 sendError(res, 7, "Watching", true); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1226 return; |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1227 } |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1228 /* process the keys */ |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1229 var hexstr = formdata.d.replace(/[^0-9a-f]/gi, ""); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1230 if (hexstr.length % 2 != 0) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1231 sendError(res, 2, "incomplete byte", true); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1232 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1233 } |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1234 var keybuf = new Buffer(hexstr, "hex"); |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1235 client.write(keybuf, formdata.n); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1236 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1237 readFeed(client, res); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1238 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1239 else if (target == "/login") { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1240 login(req, res, formdata); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1241 } |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
1242 else if (target == "/addacct") { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
1243 register(req, res, formdata); |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
1244 } |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
1245 else if (target == "/play") { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
1246 startgame(req, res, formdata); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
1247 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1248 else if (target == "/watch") { |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1249 watch(req, res, formdata); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1250 } |
111
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
1251 else if (target == "/quit") { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
1252 stopgame(res, formdata); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
1253 } |
126
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1254 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
|
1255 setuinfo(req, res, formdata); |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1256 } |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1257 else { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1258 res.writeHead(405, resheaders); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1259 res.end(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1260 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1261 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1262 else if (req.method == 'GET' || req.method == 'HEAD') { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1263 if (target == '/feed') { |
34
57f4b36ef06b
rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents:
32
diff
changeset
|
1264 if (req.method == 'HEAD') { |
57f4b36ef06b
rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents:
32
diff
changeset
|
1265 res.writeHead(200, {"Content-Type": "application/json"}); |
57f4b36ef06b
rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents:
32
diff
changeset
|
1266 res.end(); |
57f4b36ef06b
rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents:
32
diff
changeset
|
1267 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1268 else |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1269 sendError(res, 7, null, true); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1270 return; |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1271 } |
32
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
1272 else if (target == '/status') { |
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
1273 statusmsg(req, res); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1274 } |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1275 else if (target.match(/^\/uinfo\//)) { |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1276 getuinfo(req, res); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1277 } |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1278 else if (target.match(/^\/pstatus\//)) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1279 pstatusmsg(req, res); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1280 } |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1281 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
|
1282 serveStatic(req, res, target); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1283 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1284 else { /* Some other method */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1285 res.writeHead(501, resheaders); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1286 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
|
1287 res.end(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1288 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1289 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1290 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1291 req.on('end', respond); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1292 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1293 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1294 |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1295 function wsHandler(wsRequest) { |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1296 var watchmatch = wsRequest.resource.match(/^\/watch\/([0-9]*)$/); |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1297 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
|
1298 if (watchmatch !== null) { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1299 if (watchmatch[1] && Number(watchmatch[1]) in sessions) { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1300 var tsession = sessions[Number(watchmatch[1])]; |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1301 var conn = wsRequest.accept(null, wsRequest.origin); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1302 new wsWatcher(conn, tsession); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1303 tslog("Game %d is being watched via WebSockets", tsession.sessid); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1304 } |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1305 else |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1306 wsRequest.reject(404, errorcodes[7]); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1307 } |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1308 else if (playmatch !== null) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1309 wsStart(wsRequest); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1310 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1311 else if (wsRequest.resourceURL.pathname == "/status") { |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1312 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
|
1313 var tell = function () { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1314 getStatus(function (info) { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1315 info["t"] = "t"; |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1316 conn.sendUTF(JSON.stringify(info)); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1317 }); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1318 } |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1319 var beginH = function (n, name, game) { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1320 conn.sendUTF(JSON.stringify({"t": "b", "n": n, "p": name, "g": game})); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1321 }; |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1322 var listH = function (list) { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1323 conn.sendUTF(JSON.stringify(list)); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1324 }; |
112
4f2b89e6fde2
RLG-Web: improvements to choices and status messaging.
John "Elwin" Edwards <elwin@sdf.org>
parents:
111
diff
changeset
|
1325 var endH = function (n, pname, gname) { |
4f2b89e6fde2
RLG-Web: improvements to choices and status messaging.
John "Elwin" Edwards <elwin@sdf.org>
parents:
111
diff
changeset
|
1326 conn.sendUTF(JSON.stringify({"t": "e", "n": n, "p": pname, "g": gname})); |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1327 }; |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1328 gamemux.on('begin', beginH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1329 gamemux.on('list', listH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1330 gamemux.on('end', endH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1331 conn.on('message', tell); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1332 conn.on('close', function () { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1333 gamemux.removeListener('begin', beginH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1334 gamemux.removeListener('list', listH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1335 gamemux.removeListener('end', endH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1336 }); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1337 tell(); |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1338 } |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1339 else |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1340 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
|
1341 } |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1342 |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1343 function pushStatus() { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1344 getStatus(function(info) { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1345 info["t"] = "t"; |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1346 gamemux.emit('list', info); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1347 }); |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1348 } |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1349 |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1350 function shutdown () { |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1351 httpServer.close(); |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1352 httpServer.removeAllListeners('request'); |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1353 ctlServer.close(); |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1354 tslog("Shutting down..."); |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1355 process.exit(); |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1356 } |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1357 |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1358 function conHandler(chunk) { |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1359 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
|
1360 if (msg == "quit") { |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1361 allowlogin = false; |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1362 tslog("Disconnecting..."); |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1363 for (var sessid in sessions) { |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1364 sessions[sessid].close(); |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1365 } |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1366 setTimeout(shutdown, 2000); |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1367 } |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1368 } |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1369 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1370 process.on("exit", function () { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1371 for (var sessid in sessions) { |
87
bd2cf6dda28d
RLG-Web: use the pty module.
John "Elwin" Edwards <elwin@sdf.org>
parents:
85
diff
changeset
|
1372 sessions[sessid].term.kill('SIGHUP'); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1373 } |
26
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
1374 tslog("Quitting..."); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1375 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1376 }); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1377 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1378 /* Initialization STARTS HERE */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1379 process.env["TERM"] = "xterm-256color"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1380 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1381 if (process.getuid() != 0) { |
26
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
1382 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
|
1383 process.exit(1); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1384 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1385 |
29
cf9d294bc52f
rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents:
28
diff
changeset
|
1386 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
|
1387 var wsServer; |
29
cf9d294bc52f
rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents:
28
diff
changeset
|
1388 |
85
4303d94d87a2
rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents:
84
diff
changeset
|
1389 /* 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
|
1390 if (fs.existsSync(ctlsocket)) { |
4303d94d87a2
rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents:
84
diff
changeset
|
1391 fs.unlinkSync(ctlsocket); |
4303d94d87a2
rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents:
84
diff
changeset
|
1392 } |
4303d94d87a2
rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents:
84
diff
changeset
|
1393 |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1394 /* 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
|
1395 var ctlServer = net.createServer(function (sock) { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1396 sock.on('data', conHandler); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1397 }); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1398 ctlServer.listen(ctlsocket, function () { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1399 /* fork off and die */ |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1400 try { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1401 daemon.start(logfile); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1402 } |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1403 catch (err) { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1404 tslog("Daemonization failed: %s", err); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1405 process.exit(1); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1406 } |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1407 /* chroot and drop permissions. daemon.chroot() does chdir() itself. */ |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1408 try { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1409 daemon.chroot(chrootDir); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1410 } |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1411 catch (err) { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1412 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
|
1413 process.exit(1); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1414 } |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1415 try { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1416 // drop gid first, that requires UID=0 |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1417 process.setgid(dropToGID); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1418 process.setuid(dropToUID); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1419 } |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1420 catch (err) { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1421 tslog("Could not drop permissions: %s", err); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1422 process.exit(1); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1423 } |
29
cf9d294bc52f
rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents:
28
diff
changeset
|
1424 httpServer = http.createServer(webHandler); |
30
b5570a594266
rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents:
29
diff
changeset
|
1425 httpServer.listen(httpPort); |
b5570a594266
rlgwebd.js: listen on any address
John "Elwin" Edwards <elwin@sdf.org>
parents:
29
diff
changeset
|
1426 tslog('rlgwebd running on port %d', httpPort); |
36
a0387f112bcf
RLG-Web: autosave idle games.
John "Elwin" Edwards <elwin@sdf.org>
parents:
34
diff
changeset
|
1427 setInterval(reaper, playtimeout / 4); |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1428 wsServer = new WebSocketServer({"httpServer": httpServer}); |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1429 wsServer.on("request", wsHandler); |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1430 tslog('WebSockets are online'); |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1431 setInterval(pushStatus, 4000); |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1432 }); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1433 |