Mercurial > hg > rlgwebd
comparison rlgwebd.js @ 169:6f4b7e1b32e8
rlgwebd.js: clean up TermSession parameters.
Use the player name instead of a login key that has already been
verified and resolved to a player name.
| author | John "Elwin" Edwards |
|---|---|
| date | Fri, 09 Jan 2015 09:43:21 -0500 |
| parents | 0ceaca924b4c |
| children | 50e4c9feeac2 |
comparison
equal
deleted
inserted
replaced
| 168:0ceaca924b4c | 169:6f4b7e1b32e8 |
|---|---|
| 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 /* Constructor. A TermSession handles a pty and the game running on it. | 69 /* Constructor. A TermSession handles a pty and the game running on it. |
| 70 * game: (String) Name of the game to launch. | 70 * gname: (String) Name of the game to launch. |
| 71 * lkey: (String, key) The user's id, a key into logins. | 71 * pname: (String) The player's name. |
| 72 * dims: (Array [Number, Number]) Height and width of the pty. | 72 * dims: (Array [Number, Number]) Height and width of the pty. |
| 73 * handlers: (Object) Key-value pairs, event names and functions to | 73 * handlers: (Object) Key-value pairs, event names and functions to |
| 74 * install to handle them. | 74 * install to handle them. |
| 75 * Events: | 75 * Events: |
| 76 * "data": Data generated by child. Parameters: buf (Buffer) | 76 * "data": Data generated by child. Parameters: buf (Buffer) |
| 77 * "exit": Child terminated. Parameters: none | 77 * "exit": Child terminated. Parameters: none |
| 78 */ | 78 */ |
| 79 function TermSession(game, lkey, dims, handlers) { | 79 function TermSession(gname, pname, dims, handlers) { |
| 80 var ss = this; | 80 var ss = this; |
| 81 /* Subclass EventEmitter to do the hard work. */ | 81 /* Subclass EventEmitter to do the hard work. */ |
| 82 events.EventEmitter.call(this); | 82 events.EventEmitter.call(this); |
| 83 for (var evname in handlers) | 83 for (var evname in handlers) |
| 84 this.on(evname, handlers[evname]); | 84 this.on(evname, handlers[evname]); |
| 85 /* Don't launch anything that's not a real game. */ | 85 /* Don't launch anything that's not a real game. */ |
| 86 if (game in games) { | 86 if (gname in games) { |
| 87 this.game = games[game]; | 87 this.game = games[gname]; |
| 88 } | 88 } |
| 89 else { | 89 else { |
| 90 this.failed = true; | 90 this.failed = true; |
| 91 return; | 91 return; |
| 92 } | 92 } |
| 93 if (lkey in logins) { | 93 this.pname = pname; |
| 94 this.key = lkey; | |
| 95 this.pname = logins[lkey].name; | |
| 96 } | |
| 97 else { | |
| 98 this.failed = true; | |
| 99 return; | |
| 100 } | |
| 101 /* Grab a spot in the sessions table. */ | 94 /* Grab a spot in the sessions table. */ |
| 102 sessions[this.game.uname + "/" + this.pname] = this; | 95 sessions[this.game.uname + "/" + this.pname] = this; |
| 103 /* Set up the sizes. */ | 96 /* Set up the sizes. */ |
| 104 this.w = Math.floor(Number(dims[1])); | 97 this.w = Math.floor(Number(dims[1])); |
| 105 if (!(this.w > 0 && this.w < 256)) | 98 if (!(this.w > 0 && this.w < 256)) |
| 320 })); | 313 })); |
| 321 conn.sendUTF(JSON.stringify({"t": "d", | 314 conn.sendUTF(JSON.stringify({"t": "d", |
| 322 "d": session.framebuf.toString("hex", 0, session.frameoff)})); | 315 "d": session.framebuf.toString("hex", 0, session.frameoff)})); |
| 323 } | 316 } |
| 324 | 317 |
| 325 function wsPlay(wsReq, game, lkey, dims) { | 318 function wsPlay(wsReq, game, pname, dims) { |
| 326 tslog("wsPlay: running for %s/%s", game, logins[lkey].name); | 319 tslog("wsPlay: running for %s/%s", game, pname); |
| 327 tslog("Request is for %s", logins[wsReq.resourceURL.query["key"]].name); | 320 tslog("Request is for %s", logins[wsReq.resourceURL.query["key"]].name); |
| 328 var conn; | 321 var conn; |
| 329 var session; | 322 var session; |
| 330 /* Listeners on the WebSocket */ | 323 /* Listeners on the WebSocket */ |
| 331 function messageH(message) { | 324 function messageH(message) { |
| 358 conn.close(); | 351 conn.close(); |
| 359 session.removeListener('data', dataH); | 352 session.removeListener('data', dataH); |
| 360 session.removeListener('exit', exitH); | 353 session.removeListener('exit', exitH); |
| 361 } | 354 } |
| 362 var handlers = {'data': dataH, 'exit': exitH}; | 355 var handlers = {'data': dataH, 'exit': exitH}; |
| 363 session = new TermSession(game, lkey, dims, handlers); | 356 session = new TermSession(game, pname, dims, handlers); |
| 364 if (!session.failed) { | 357 if (!session.failed) { |
| 365 var tag = session.game.uname + "/" + session.pname; | 358 var tag = session.game.uname + "/" + session.pname; |
| 366 var reply = {"t": "s", "tag": tag, "w": session.w, "h": session.h, | 359 var reply = {"t": "s", "tag": tag, "w": session.w, "h": session.h, |
| 367 "p": session.pname, "g": session.game.uname}; | 360 "p": session.pname, "g": session.game.uname}; |
| 368 tslog("Accepting for %s", tag); | 361 tslog("Accepting for %s", tag); |
| 405 if (fname) { | 398 if (fname) { |
| 406 wsReq.reject(404, errorcodes[4]); | 399 wsReq.reject(404, errorcodes[4]); |
| 407 tslog("%s is already playing %s", pname, gname); | 400 tslog("%s is already playing %s", pname, gname); |
| 408 } | 401 } |
| 409 else | 402 else |
| 410 wsPlay(wsReq, gname, lkey, dims); | 403 wsPlay(wsReq, gname, pname, dims); |
| 411 }; | 404 }; |
| 412 checkprogress(pname, games[gname], progcallback, []); | 405 checkprogress(pname, games[gname], progcallback, []); |
| 413 } | 406 } |
| 414 | 407 |
| 415 /* Some functions which check whether a player is currently playing or | 408 /* Some functions which check whether a player is currently playing or |
