Mercurial > hg > rlgwebd
comparison rlgwebd.js @ 181:926b0780bc44
Print metadata at the beginning of ttyrec files.
author | John "Elwin" Edwards |
---|---|
date | Sat, 17 Jan 2015 15:48:41 -0500 |
parents | 85fde763c7ed |
children | 3c0e7697bb30 |
comparison
equal
deleted
inserted
replaced
180:85fde763c7ed | 181:926b0780bc44 |
---|---|
64 var sessions = {}; | 64 var sessions = {}; |
65 var dglgames = {}; | 65 var dglgames = {}; |
66 var allowlogin = true; | 66 var allowlogin = true; |
67 var gamemux = new events.EventEmitter(); | 67 var gamemux = new events.EventEmitter(); |
68 | 68 |
69 /* TODO move TermSession and DglSession methods into the prototypes. */ | |
70 | |
69 /* Constructor. A TermSession handles a pty and the game running on it. | 71 /* Constructor. A TermSession handles a pty and the game running on it. |
70 * gname: (String) Name of the game to launch. | 72 * gname: (String) Name of the game to launch. |
71 * pname: (String) The player's name. | 73 * pname: (String) The player's name. |
72 * wsReq: (WebSocketRequest) The request from the client. | 74 * wsReq: (WebSocketRequest) The request from the client. |
73 * | 75 * |
126 this.frameoff = 0; | 128 this.frameoff = 0; |
127 this.playerconn = wsReq.accept(null, wsReq.origin); | 129 this.playerconn = wsReq.accept(null, wsReq.origin); |
128 /* Array for watcher connections. */ | 130 /* Array for watcher connections. */ |
129 this.watchers = []; | 131 this.watchers = []; |
130 /* END setup */ | 132 /* END setup */ |
133 this.framepush = function(chunk) { | |
134 /* If this chunk resets the screen, discard what preceded it. */ | |
135 if (isclear(chunk)) { | |
136 this.framebuf = new Buffer(1024); | |
137 this.frameoff = 0; | |
138 } | |
139 /* Make sure there's space. */ | |
140 while (this.framebuf.length < chunk.length + this.frameoff) { | |
141 var nbuf = new Buffer(this.framebuf.length * 2); | |
142 this.framebuf.copy(nbuf, 0, 0, this.frameoff); | |
143 this.framebuf = nbuf; | |
144 if (this.framebuf.length > 65536) { | |
145 tslog("Warning: Game %s frame buffer at %d bytes", this.tag(), | |
146 this.framebuf.length); | |
147 } | |
148 } | |
149 chunk.copy(this.framebuf, this.frameoff); | |
150 this.frameoff += chunk.length; | |
151 }; | |
131 function ttyrec_chunk(datastr) { | 152 function ttyrec_chunk(datastr) { |
132 ss.lasttime = new Date(); | 153 ss.lasttime = new Date(); |
133 var buf = new Buffer(datastr); | 154 var buf = new Buffer(datastr); |
134 var chunk = new Buffer(buf.length + 12); | 155 var chunk = new Buffer(buf.length + 12); |
135 /* TTYREC headers */ | 156 /* TTYREC headers */ |
147 if (ss.watchers[i].connected) | 168 if (ss.watchers[i].connected) |
148 ss.watchers[i].sendUTF(msg); | 169 ss.watchers[i].sendUTF(msg); |
149 } | 170 } |
150 ss.emit('data', buf); | 171 ss.emit('data', buf); |
151 } | 172 } |
173 /* Begin the ttyrec with some metadata, like dgamelaunch does. */ | |
174 var descstr = "\x1b[2J\x1b[1;1H\r\n"; | |
175 descstr += "Player: " + this.pname + "\r\nGame: " + this.game.name + "\r\n"; | |
176 descstr += "Server: Roguelike Gallery - rlgallery.org\r\n"; | |
177 descstr += "Filename: " + ts + ".ttyrec\r\n"; | |
178 descstr += "Time: (" + Math.floor(this.lasttime.getTime() / 1000) + ") "; | |
179 descstr += this.lasttime.toUTCString().slice(0, -4) + "\r\n"; | |
180 descstr += "Size: " + this.w + "x" + this.h + "\r\n\x1b[2J"; | |
181 ttyrec_chunk(descstr); | |
152 this.term.on("data", ttyrec_chunk); | 182 this.term.on("data", ttyrec_chunk); |
153 this.framepush = function(chunk) { | |
154 /* If this chunk resets the screen, discard what preceded it. */ | |
155 if (isclear(chunk)) { | |
156 this.framebuf = new Buffer(1024); | |
157 this.frameoff = 0; | |
158 } | |
159 /* Make sure there's space. */ | |
160 while (this.framebuf.length < chunk.length + this.frameoff) { | |
161 var nbuf = new Buffer(this.framebuf.length * 2); | |
162 this.framebuf.copy(nbuf, 0, 0, this.frameoff); | |
163 this.framebuf = nbuf; | |
164 if (this.framebuf.length > 65536) { | |
165 tslog("Warning: Game %s frame buffer at %d bytes", this.tag(), | |
166 this.framebuf.length); | |
167 } | |
168 } | |
169 chunk.copy(this.framebuf, this.frameoff); | |
170 this.frameoff += chunk.length; | |
171 }; | |
172 this.write = function(data) { | 183 this.write = function(data) { |
173 this.term.write(data); | 184 this.term.write(data); |
174 }; | 185 }; |
175 this.tag = function() { | 186 this.tag = function() { |
176 return this.game.uname + "/" + this.pname; | 187 return this.game.uname + "/" + this.pname; |