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