Mercurial > hg > rlgwebd
annotate rlgwebd @ 204:a200b313870d
Use either HTTP or HTTPS.
If HTTPS is enabled, RLGWebD will not use insecure HTTP.
author | John "Elwin" Edwards |
---|---|
date | Sun, 08 Jan 2017 16:17:11 -0500 |
parents | 5491ca3a335b |
children | 04c2a895b679 |
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", |
204 | 19 port: 8080, |
202
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
20 chrootDir: "/var/dgl/", |
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
21 username: "rodney", |
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
22 static_root: "/var/www/" |
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
23 }; |
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 /* Read configuration from a file */ |
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
26 var config_file = "/etc/rlgwebd.conf"; |
203
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
27 var config_lines = read_or_die(config_file, "Configuration file").toString().split('\n'); |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
28 |
202
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 |
203
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
581 // Read a file synchronously, exiting if anything goes wrong. |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
582 // Intended only for files required at startup. |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
583 function read_or_die(filename, description) { |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
584 var contents; |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
585 try { |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
586 contents = fs.readFileSync(filename); |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
587 } |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
588 catch (err) { |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
589 if (err.code == "ENOENT") { |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
590 tslog("%s %s does not exist", description, filename); |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
591 } |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
592 else { |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
593 console.log(err.stack); |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
594 } |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
595 process.exit(1); |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
596 } |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
597 return contents; |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
598 } |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
599 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
600 /* 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
|
601 function getCookies(req) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
602 cookies = []; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
603 if ("cookie" in req.headers) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
604 cookstrs = req.headers["cookie"].split("; "); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
605 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
|
606 eqsign = cookstrs[i].indexOf("="); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
607 if (eqsign > 0) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
608 name = cookstrs[i].slice(0, eqsign).toLowerCase(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
609 val = cookstrs[i].slice(eqsign + 1); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
610 cookies[name] = val; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
611 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
612 else if (eqsign < 0) |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
613 cookies[cookstrs[i]] = null; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
614 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
615 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
616 return cookies; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
617 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
618 |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
619 function getMsg(posttext) { |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
620 var jsonobj; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
621 if (!posttext) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
622 return {}; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
623 try { |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
624 jsonobj = JSON.parse(posttext); |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
625 } |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
626 catch (e) { |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
627 if (e instanceof SyntaxError) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
628 return {}; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
629 } |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
630 if (typeof(jsonobj) != "object") |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
631 return {}; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
632 return jsonobj; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
633 } |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
634 |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
635 function getMsgWS(msgObj) { |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
636 if (msgObj.type != "utf8") |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
637 return {}; |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
638 return getMsg(msgObj.utf8Data); |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
639 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
640 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
641 function login(req, res, formdata) { |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
642 if (!allowlogin) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
643 sendError(res, 6, null, false); |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
644 return; |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
645 } |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
646 if (!("name" in formdata)) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
647 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
|
648 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
649 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
650 else if (!("pw" in formdata)) { |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
651 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
|
652 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
653 } |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
654 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
|
655 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
|
656 function checkit(code, signal) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
657 /* 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
|
658 if (code != 0) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
659 sendError(res, 3); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
660 if (code == 1) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
661 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
|
662 else if (code == 2) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
663 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
|
664 else |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
665 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
|
666 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
667 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
668 var lkey = randkey(2); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
669 while (lkey in logins) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
670 lkey = randkey(2); |
160
ed837da65e5f
RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents:
159
diff
changeset
|
671 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
|
672 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
|
673 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
|
674 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
|
675 res.end(); |
190
11b7baed2e21
Stop printing credentials in the logfile.
John "Elwin" Edwards
parents:
185
diff
changeset
|
676 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
|
677 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
678 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
679 /* 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
|
680 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
|
681 pwchecker.on("exit", checkit); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
682 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
|
683 return; |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
684 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
685 |
20
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
686 /* 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
|
687 function regsetup(username) { |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
688 function regsetup_l2(err) { |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
689 for (var g in games) { |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
690 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
|
691 } |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
692 } |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
693 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
|
694 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
|
695 } |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
696 |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
697 function register(req, res, formdata) { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
698 var uname, passwd, email; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
699 if (typeof (formdata.name) != "string" || formdata.name === "") { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
700 sendError(res, 2, "No name given."); |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
701 return; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
702 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
703 else |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
704 uname = formdata["name"]; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
705 if (typeof (formdata.pw) != "string" || formdata.pw === "") { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
706 sendError(res, 2, "No password given."); |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
707 return; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
708 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
709 else |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
710 passwd = formdata["pw"]; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
711 if (typeof (formdata.email) != "string" || formdata.email === "") { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
712 /* E-mail is optional */ |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
713 email = "nobody@nowhere.not"; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
714 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
715 else |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
716 email = formdata["email"]; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
717 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
|
718 if (code === 0) { |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
719 var lkey = randkey(2); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
720 while (lkey in logins) |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
721 lkey = randkey(2); |
160
ed837da65e5f
RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents:
159
diff
changeset
|
722 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
|
723 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
|
724 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
|
725 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
|
726 res.end(); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
727 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
|
728 regsetup(uname); |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
729 } |
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
730 else if (code == 4) { |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
731 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
|
732 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
|
733 } |
5f785e1d5cca
RLG-Web: set up user directories on registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
19
diff
changeset
|
734 else if (code == 1) { |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
735 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
|
736 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
|
737 } |
39
e8ac0e3d2614
RLG-Web: separate logging in and starting a game.
John "Elwin" Edwards <elwin@sdf.org>
parents:
37
diff
changeset
|
738 else { |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
739 sendError(res, 0, null); |
26
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
740 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
|
741 } |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
742 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
743 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
|
744 child_adder.on("exit", checkreg); |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
745 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
|
746 return; |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
747 } |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
748 |
111
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
749 /* 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
|
750 function stopgame(res, formdata) { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
751 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
|
752 sendError(res, 1); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
753 return; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
754 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
755 var pname = logins[formdata["key"]].name; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
756 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
|
757 sendError(res, 2, "No such game."); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
758 return; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
759 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
760 var gname = formdata["g"]; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
761 function checkback(err, fname) { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
762 if (!fname) { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
763 sendError(res, 7); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
764 return; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
765 } |
142 | 766 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
|
767 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
|
768 if (err) { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
769 sendError(res, 7); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
770 return; |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
771 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
772 var pid = parseInt(fdata.split('\n')[0], 10); |
139 | 773 try { |
774 process.kill(pid, 'SIGHUP'); | |
775 } | |
776 catch (err) { | |
777 /* If the PID is invalid, the lockfile is stale. */ | |
778 if (err.code == "ESRCH") { | |
779 var nodere = RegExp("^" + pname + ":node:"); | |
780 if (fname.match(nodere)) { | |
781 fs.unlink(fullfile); | |
782 } | |
783 } | |
784 } | |
111
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
785 /* 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
|
786 * 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
|
787 * poll fname until it disappears. */ |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
788 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
|
789 res.write(JSON.stringify({"t": "q"})); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
790 res.end(); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
791 }); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
792 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
793 checkprogress(pname, games[gname], checkback, []); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
794 } |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
795 |
155
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
796 function startProgressWatcher() { |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
797 var watchdirs = []; |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
798 for (var gname in games) { |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
799 watchdirs.push(path.join("/dgldir/inprogress", gname)); |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
800 } |
167 | 801 var subproc = child_process.spawn("/bin/dglwatcher", watchdirs); |
155
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
802 subproc.stdout.setEncoding('utf8'); |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
803 subproc.stdout.on('data', function (chunk) { |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
804 var fname = chunk.slice(2, -1); |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
805 var filere = /.*\/([^\/]*)\/([^\/:]*):(node:)?(.*)/; |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
806 var matchresult = fname.match(filere); |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
807 if (!matchresult || matchresult[3]) |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
808 return; |
156
127f9e256d02
Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents:
155
diff
changeset
|
809 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
|
810 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
|
811 var tag = gname + "/" + pname; |
155
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
812 if (chunk[0] == "E") { |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
813 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
|
814 dglgames[tag] = new DglSession(fname); |
155
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
815 } |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
816 else if (chunk[0] == "C") { |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
817 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
|
818 dglgames[tag] = new DglSession(fname); |
155
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
819 } |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
820 else if (chunk[0] == "D") { |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
821 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
|
822 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
|
823 delete dglgames[tag]; |
155
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
824 } |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
825 else { |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
826 tslog("Watcher says: %s", chunk) |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
827 } |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
828 }); |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
829 subproc.stdout.resume(); |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
830 return subproc; |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
831 } |
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
832 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
833 function serveStatic(req, res, fname) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
834 var nname = path.normalize(fname); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
835 if (nname == "" || nname == "/") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
836 nname = "index.html"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
837 if (nname.match(/\/$/)) |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
838 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
|
839 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
|
840 var extension = path.extname(realname); |
81 | 841 fs.exists(realname, function (exists) { |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
842 var resheaders = {}; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
843 if (!exists || !extension || extension == ".html") |
31
7dd6becf9ce9
rlgwebd.js: improve MIME types.
John "Elwin" Edwards <elwin@sdf.org>
parents:
30
diff
changeset
|
844 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
|
845 else if (extension == ".png") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
846 resheaders["Content-Type"] = "image/png"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
847 else if (extension == ".css") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
848 resheaders["Content-Type"] = "text/css"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
849 else if (extension == ".js") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
850 resheaders["Content-Type"] = "text/javascript"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
851 else if (extension == ".svg") |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
852 resheaders["Content-Type"] = "image/svg+xml"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
853 else |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
854 resheaders["Content-Type"] = "application/octet-stream"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
855 if (exists) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
856 fs.readFile(realname, function (error, data) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
857 if (error) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
858 res.writeHead(500, {}); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
859 res.end(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
860 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
861 else { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
862 res.writeHead(200, resheaders); |
34
57f4b36ef06b
rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents:
32
diff
changeset
|
863 if (req.method != 'HEAD') |
57f4b36ef06b
rlgwebd.js: handle HTTP HEAD properly.
John "Elwin" Edwards <elwin@sdf.org>
parents:
32
diff
changeset
|
864 res.write(data); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
865 res.end(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
866 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
867 }); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
868 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
869 else { |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
870 send404(res, nname, req.method == 'HEAD'); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
871 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
872 }); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
873 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
874 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
875 |
160
ed837da65e5f
RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents:
159
diff
changeset
|
876 /* 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
|
877 function getStatus(callback) { |
66
57bf0dcd080e
Display idle time of games in progress.
John "Elwin" Edwards <elwin@sdf.org>
parents:
64
diff
changeset
|
878 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
|
879 var statusinfo = {"s": allowlogin, "g": []}; |
158
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
880 for (var tag in sessions) { |
176
bf518a00190b
Add client-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
175
diff
changeset
|
881 var gamedesc = {"c": "rlg"}; |
158
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
882 gamedesc["p"] = sessions[tag].pname; |
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
883 gamedesc["g"] = sessions[tag].game.uname; |
160
ed837da65e5f
RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents:
159
diff
changeset
|
884 gamedesc["i"] = now - sessions[tag].lasttime; |
175
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
885 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
|
886 statusinfo["g"].push(gamedesc); |
32
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
887 } |
156
127f9e256d02
Keep a list of dgamelaunch games and put it in the /status message.
John "Elwin" Edwards
parents:
155
diff
changeset
|
888 for (var tag in dglgames) { |
176
bf518a00190b
Add client-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
175
diff
changeset
|
889 var dglinfo = {"c": "dgl"}; |
163
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
890 var slash = tag.search('/'); |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
891 dglinfo["g"] = tag.slice(0, slash); |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
892 dglinfo["p"] = tag.slice(slash + 1); |
175
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
893 dglinfo["i"] = now - dglgames[tag].lasttime; |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
894 dglinfo["w"] = dglgames[tag].watchers.length; |
176
bf518a00190b
Add client-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
175
diff
changeset
|
895 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
|
896 } |
160
ed837da65e5f
RLGWebD: Clean up code related to session timestamps.
John "Elwin" Edwards
parents:
159
diff
changeset
|
897 callback(statusinfo); |
32
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
898 } |
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
899 |
103
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
900 function statusmsg(req, res) { |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
901 function respond(info) { |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
902 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
|
903 if (req.method != 'HEAD') |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
904 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
|
905 res.end(); |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
906 } |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
907 getStatus(respond); |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
908 } |
f30495f7ede8
RLG-Web server: refactor statusmsg() to work with WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
102
diff
changeset
|
909 |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
910 function pstatusmsg(req, res) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
911 if (req.method == 'HEAD') { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
912 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
|
913 res.end(); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
914 return; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
915 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
916 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
|
917 var pmatch = target.match(/^\/pstatus\/(.*)/); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
918 if (pmatch && pmatch[1]) |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
919 var pname = pmatch[1]; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
920 else { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
921 sendError(res, 2, "No name given."); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
922 return; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
923 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
924 var reply = {"name": pname}; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
925 playerstatus(pname, function (pdata) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
926 reply["stat"] = pdata; |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
927 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
|
928 res.write(JSON.stringify(reply)); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
929 res.end(); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
930 }); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
931 } |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
932 |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
933 function getuinfo(req, res) { |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
934 var urlobj = url.parse(req.url, true); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
935 var query = urlobj.query; |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
936 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
|
937 sendError(res, 1); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
938 return; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
939 } |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
940 var match = urlobj.pathname.match(/^\/[^\/]*\/(.*)/); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
941 if (!match || !match[1]) { |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
942 send404(res, urlobj.pathname, req.method == 'HEAD'); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
943 return; |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
944 } |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
945 var which = match[1]; |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
946 var name = logins[query["key"]].name; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
947 var reply = { "u": name }; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
948 function send() { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
949 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
|
950 res.write(JSON.stringify(reply)); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
951 res.end(); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
952 } |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
953 if (which == "pw") { |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
954 /* Don't actually divulge passwords. */ |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
955 reply["pw"] = ""; |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
956 send(); |
124
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 if (which == "email") { |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
959 var address; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
960 function finish(code, signal) { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
961 if (code != 0) { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
962 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
|
963 sendError(res, 2); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
964 } |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
965 else { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
966 reply["email"] = address; |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
967 send(); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
968 } |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
969 } |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
970 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
|
971 subproc.stdout.on("data", function (data) { |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
972 address = data.toString().replace(/\n/g, ""); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
973 }); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
974 subproc.on("exit", finish); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
975 subproc.stdin.end(name + '\n', "utf8"); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
976 } |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
977 else { |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
978 send404(res, urlobj.pathname, req.method == 'HEAD'); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
979 return; |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
980 } |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
981 } |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
982 |
126
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
983 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
|
984 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
|
985 var query = urlobj.query; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
986 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
|
987 sendError(res, 1); |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
988 return; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
989 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
990 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
|
991 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
|
992 if (!match || !match[1]) { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
993 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
|
994 return; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
995 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
996 var which = match[1]; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
997 if (!("v" in postdata)) { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
998 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
|
999 return; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1000 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1001 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
|
1002 var args; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1003 if (which == "email") |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1004 args = ["setmail"]; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1005 else |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1006 args = ["setpw"]; |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1007 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
|
1008 function (err, stdout, stderr) { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1009 if (err) { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1010 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
|
1011 sendError(res, 2); |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1012 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1013 else { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1014 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
|
1015 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
|
1016 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
|
1017 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1018 }); |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1019 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
|
1020 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1021 else { |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1022 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
|
1023 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1024 } |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1025 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1026 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
|
1027 "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
|
1028 "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
|
1029 |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1030 function sendError(res, ecode, msg, box) { |
31
7dd6becf9ce9
rlgwebd.js: improve MIME types.
John "Elwin" Edwards <elwin@sdf.org>
parents:
30
diff
changeset
|
1031 res.writeHead(200, { "Content-Type": "application/json" }); |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1032 var edict = {"t": "E"}; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1033 if (!(ecode < errorcodes.length && ecode > 0)) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1034 ecode = 0; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1035 edict["c"] = ecode; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1036 edict["s"] = errorcodes[ecode]; |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1037 if (msg) |
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1038 edict["s"] += ": " + msg; |
55
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1039 if (box) |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1040 res.write(JSON.stringify([edict])); |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1041 else |
96815eae4ebe
RLG-Web: make multiple watchers possible.
John "Elwin" Edwards <elwin@sdf.org>
parents:
49
diff
changeset
|
1042 res.write(JSON.stringify(edict)); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1043 res.end(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1044 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1045 |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1046 function send404(res, path, nopage) { |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1047 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
|
1048 if (!nopage) { |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1049 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
|
1050 + path + " Not Found</h1></body></html>\n"); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1051 } |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1052 res.end(); |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1053 } |
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1054 |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1055 function webHandler(req, res) { |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1056 /* default headers for the response */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1057 var resheaders = {'Content-Type': 'text/html'}; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1058 /* 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
|
1059 var reqbody = ""; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1060 var formdata; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1061 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1062 /* Register a listener to get the body. */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1063 function moredata(chunk) { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1064 reqbody += chunk; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1065 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1066 req.on('data', moredata); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1067 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1068 /* 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
|
1069 function respond() { |
16
ef6127ed6da3
RLGWeb: switch to JSON protocol.
John "Elwin" Edwards <elwin@sdf.org>
parents:
8
diff
changeset
|
1070 formdata = getMsg(reqbody); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1071 var target = url.parse(req.url).pathname; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1072 /* 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
|
1073 if (req.method == 'POST') { |
159 | 1074 if (target == "/login") { |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1075 login(req, res, formdata); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1076 } |
19
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
1077 else if (target == "/addacct") { |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
1078 register(req, res, formdata); |
188bbd857124
RLG-Web: add user registration
John "Elwin" Edwards <elwin@sdf.org>
parents:
17
diff
changeset
|
1079 } |
111
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
1080 else if (target == "/quit") { |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
1081 stopgame(res, formdata); |
f56fdfeed01a
Replace taking over games with forced saves.
John "Elwin" Edwards <elwin@sdf.org>
parents:
110
diff
changeset
|
1082 } |
126
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1083 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
|
1084 setuinfo(req, res, formdata); |
3e3824711791
RLG-Web server: allow changing e-mail and password.
John "Elwin" Edwards <elwin@sdf.org>
parents:
125
diff
changeset
|
1085 } |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1086 else { |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1087 res.writeHead(405, resheaders); |
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 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1091 else if (req.method == 'GET' || req.method == 'HEAD') { |
159 | 1092 if (target == '/status') { |
32
c75fc4b1d13d
rlgwebd.js: add a status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
31
diff
changeset
|
1093 statusmsg(req, res); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1094 } |
125
5ad15380f851
Improve the /uinfo interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
124
diff
changeset
|
1095 else if (target.match(/^\/uinfo\//)) { |
124
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1096 getuinfo(req, res); |
fbeb0bf2b51d
Add a user information interface at /uinfo.
John "Elwin" Edwards <elwin@sdf.org>
parents:
121
diff
changeset
|
1097 } |
42
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1098 else if (target.match(/^\/pstatus\//)) { |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1099 pstatusmsg(req, res); |
8f6bc0df58fa
rlgwebd.js: add a player status interface.
John "Elwin" Edwards <elwin@sdf.org>
parents:
40
diff
changeset
|
1100 } |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1101 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
|
1102 serveStatic(req, res, target); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1103 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1104 else { /* Some other method */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1105 res.writeHead(501, resheaders); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1106 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
|
1107 res.end(); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1108 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1109 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1110 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1111 req.on('end', respond); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1112 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1113 |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1114 function wsHandler(wsRequest) { |
158
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1115 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
|
1116 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
|
1117 if (watchmatch !== null) { |
175
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1118 if (watchmatch[1] in sessions) { |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1119 var tsession = sessions[watchmatch[1]]; |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1120 tsession.attach(wsRequest); |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1121 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
|
1122 } |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1123 else if (watchmatch[1] in dglgames) { |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1124 var dsession = dglgames[watchmatch[1]]; |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1125 dsession.attach(wsRequest); |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1126 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
|
1127 } |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1128 else { |
158
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1129 wsRequest.reject(404, errorcodes[7]); |
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1130 return; |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1131 } |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1132 } |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1133 else if (playmatch !== null) { |
170 | 1134 wsStartGame(wsRequest); |
107
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1135 } |
b64e31c5ec31
RLG-Web server: add playing through WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
104
diff
changeset
|
1136 else if (wsRequest.resourceURL.pathname == "/status") { |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1137 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
|
1138 var tell = function () { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1139 getStatus(function (info) { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1140 info["t"] = "t"; |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1141 conn.sendUTF(JSON.stringify(info)); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1142 }); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1143 } |
176
bf518a00190b
Add client-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
175
diff
changeset
|
1144 var beginH = function (gname, pname, client) { |
bf518a00190b
Add client-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
175
diff
changeset
|
1145 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
|
1146 "g": gname})); |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1147 }; |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1148 var listH = function (list) { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1149 conn.sendUTF(JSON.stringify(list)); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1150 }; |
158
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1151 var endH = function (gname, pname) { |
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1152 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
|
1153 }; |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1154 gamemux.on('begin', beginH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1155 gamemux.on('list', listH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1156 gamemux.on('end', endH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1157 conn.on('message', tell); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1158 conn.on('close', function () { |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1159 gamemux.removeListener('begin', beginH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1160 gamemux.removeListener('list', listH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1161 gamemux.removeListener('end', endH); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1162 }); |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1163 tell(); |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1164 } |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1165 else |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1166 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
|
1167 } |
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1168 |
163
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1169 /* 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
|
1170 * complete list. */ |
104
7d444ba4739e
RLG-Web server: send status events over WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
103
diff
changeset
|
1171 function pushStatus() { |
163
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1172 var now = new Date(); |
176
bf518a00190b
Add client-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
175
diff
changeset
|
1173 var statusinfo = {"t": "p", "s": allowlogin, "g": []}; |
163
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1174 for (var tag in sessions) { |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1175 var delta = now - sessions[tag].lasttime; |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1176 if (delta < 60000) { |
176
bf518a00190b
Add client-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
175
diff
changeset
|
1177 var gamedesc = {"c": "rlg"}; |
163
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1178 gamedesc["p"] = sessions[tag].pname; |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1179 gamedesc["g"] = sessions[tag].game.uname; |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1180 gamedesc["i"] = delta; |
175
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1181 gamedesc["w"] = sessions[tag].watchers.length; |
163
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1182 statusinfo["g"].push(gamedesc); |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1183 } |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1184 } |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1185 for (var tag in dglgames) { |
175
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1186 var delta = now - dglgames[tag].lasttime; |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1187 if (delta < 60000) { |
176
bf518a00190b
Add client-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
175
diff
changeset
|
1188 var dglinfo = {"c": "dgl"}; |
175
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1189 var slash = tag.search('/'); |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1190 dglinfo["g"] = tag.slice(0, slash); |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1191 dglinfo["p"] = tag.slice(slash + 1); |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1192 dglinfo["i"] = delta; |
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1193 dglinfo["w"] = dglgames[tag].watchers.length; |
176
bf518a00190b
Add client-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
175
diff
changeset
|
1194 statusinfo["g"].push(dglinfo); |
175
4dd87508fc96
Add server-side support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
174
diff
changeset
|
1195 } |
163
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1196 } |
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1197 gamemux.emit('list', statusinfo); |
100
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1198 } |
3dbfdaf62623
RLG-Web: begin converting to WebSockets.
John "Elwin" Edwards <elwin@sdf.org>
parents:
94
diff
changeset
|
1199 |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1200 function shutdown () { |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1201 httpServer.close(); |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1202 httpServer.removeAllListeners('request'); |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1203 ctlServer.close(); |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1204 tslog("Shutting down..."); |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1205 process.exit(); |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1206 } |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1207 |
158
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1208 function consoleHandler(chunk) { |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1209 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
|
1210 if (msg == "quit") { |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1211 allowlogin = false; |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1212 tslog("Disconnecting..."); |
158
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1213 for (var tag in sessions) { |
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1214 sessions[tag].close(); |
27
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1215 } |
155
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
1216 progressWatcher.stdin.end("\n"); |
198
ea28353d620a
Make sure games have saved and exited before stopping the server.
John "Elwin" Edwards
parents:
195
diff
changeset
|
1217 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
|
1218 setTimeout(shutdown, 500); |
ea28353d620a
Make sure games have saved and exited before stopping the server.
John "Elwin" Edwards
parents:
195
diff
changeset
|
1219 /* 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
|
1220 } |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1221 } |
83f9a799a374
rlgwebd.js: read commands from the console
John "Elwin" Edwards <elwin@sdf.org>
parents:
26
diff
changeset
|
1222 |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1223 process.on("exit", function () { |
158
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1224 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
|
1225 sessions[tag].term.kill('SIGTERM'); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1226 } |
26
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
1227 tslog("Quitting..."); |
0
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1228 return; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1229 }); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1230 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1231 /* Initialization STARTS HERE */ |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1232 process.env["TERM"] = "xterm-256color"; |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1233 |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1234 if (process.getuid() != 0) { |
26
9b58f8d3ea70
rlgwebd.js: add timestamps to log messages.
John "Elwin" Edwards <elwin@sdf.org>
parents:
23
diff
changeset
|
1235 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
|
1236 process.exit(1); |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1237 } |
bd412f63ce0d
Put this project under version control, finally.
John "Elwin" Edwards <elwin@sdf.org>
parents:
diff
changeset
|
1238 |
29
cf9d294bc52f
rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents:
28
diff
changeset
|
1239 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
|
1240 var wsServer; |
155
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
1241 var progressWatcher; |
29
cf9d294bc52f
rlgwebd.js: fix reference error
John "Elwin" Edwards <elwin@sdf.org>
parents:
28
diff
changeset
|
1242 |
157
e7f809f06c5c
Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents:
156
diff
changeset
|
1243 var pwent; |
e7f809f06c5c
Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents:
156
diff
changeset
|
1244 try { |
202
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1245 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
|
1246 } |
e7f809f06c5c
Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents:
156
diff
changeset
|
1247 catch (err) { |
202
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1248 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
|
1249 process.exit(1); |
e7f809f06c5c
Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents:
156
diff
changeset
|
1250 } |
e7f809f06c5c
Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents:
156
diff
changeset
|
1251 |
85
4303d94d87a2
rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents:
84
diff
changeset
|
1252 /* 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
|
1253 if (fs.existsSync(rlgwebd_options.control_socket)) { |
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1254 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
|
1255 } |
4303d94d87a2
rlgwebd.js: Unlink control socket at startup.
John "Elwin" Edwards <elwin@sdf.org>
parents:
84
diff
changeset
|
1256 |
202
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1257 var tls_options = {}; |
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1258 if (rlgwebd_options.use_https) { |
203
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
1259 /* If the cert can't be found, don't fall back to insecure HTTP. */ |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
1260 tls_options.key = read_or_die(rlgwebd_options.keyfile, "Keyfile"); |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
1261 tls_options.cert = read_or_die(rlgwebd_options.certfile, "Certfile"); |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
1262 if ("cafile" in rlgwebd_options) |
5491ca3a335b
Fail cleanly if necessary files can't be opened.
John "Elwin" Edwards
parents:
202
diff
changeset
|
1263 tls_options.ca = read_or_die(rlgwebd_options.cafile, "CA file"); |
201 | 1264 }; |
1265 | |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1266 /* 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
|
1267 var ctlServer = net.createServer(function (sock) { |
158
9961a538c00e
rlgwebd.js: get rid of numerical game identifiers.
John "Elwin" Edwards
parents:
157
diff
changeset
|
1268 sock.on('data', consoleHandler); |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1269 }); |
202
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1270 ctlServer.listen(rlgwebd_options.control_socket, function () { |
139 | 1271 /* rlgwebd.js now assumes that it has been started by the rlgwebd shell |
1272 * script, or some other method that detaches it and sets up stdio. */ | |
1273 /* 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
|
1274 try { |
202
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1275 posix.chroot(rlgwebd_options.chrootDir); |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1276 } |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1277 catch (err) { |
202
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1278 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
|
1279 process.exit(1); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1280 } |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1281 try { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1282 // 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
|
1283 process.setgid(pwent.gid); |
e7f809f06c5c
Use posix.getpwnam() to look up UID/GID to drop to.
John "Elwin" Edwards
parents:
156
diff
changeset
|
1284 process.setuid(pwent.uid); |
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 catch (err) { |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1287 tslog("Could not drop permissions: %s", err); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1288 process.exit(1); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1289 } |
202
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1290 if (rlgwebd_options.use_https) { |
204 | 1291 httpServer = https.createServer(tls_options, webHandler); |
1292 httpServer.listen(rlgwebd_options.port); | |
1293 tslog('rlgwebd running on port %d (TLS)', rlgwebd_options.port); | |
1294 wsServer = new WebSocketServer({"httpServer": httpServer}); | |
1295 wsServer.on("request", wsHandler); | |
202
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1296 tslog('Secure WebSockets are online'); |
7f25bb89b59c
Move RLGWebD configuration options into a configuration file.
John "Elwin" Edwards
parents:
201
diff
changeset
|
1297 } |
204 | 1298 else { |
1299 httpServer = http.createServer(webHandler); | |
1300 httpServer.listen(rlgwebd_options.port); | |
1301 tslog('rlgwebd running on port %d', rlgwebd_options.port); | |
1302 wsServer = new WebSocketServer({"httpServer": httpServer}); | |
1303 wsServer.on("request", wsHandler); | |
1304 tslog('WebSockets are online'); | |
1305 } | |
155
245a2959f504
Begin support for watching dgamelaunch games.
John "Elwin" Edwards
parents:
148
diff
changeset
|
1306 progressWatcher = startProgressWatcher(); |
163
0f6da35b27a0
RLGWebD: overhaul the list of current games.
John "Elwin" Edwards
parents:
162
diff
changeset
|
1307 setInterval(pushStatus, 40000); |
28
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1308 }); |
2ad2b6491aa9
rlgwebd.js: become a real daemon.
John "Elwin" Edwards <elwin@sdf.org>
parents:
27
diff
changeset
|
1309 |