RLG-Web: separate logging in and starting a game.

The user now logs in with a username and password, receiving a token
which is then used for any actions requiring authentication.  Starting
a game is one such action.  Games use a different set of id keys.
This allows users to supply their passwords once and then play any
number of successive games.  Also, newly registered users do not need
to supply their passwords again.
This commit is contained in:
John "Elwin" Edwards 2012-06-07 15:43:06 -07:00
parent 94e9fa330c
commit 012c86faa8
3 changed files with 193 additions and 98 deletions

View file

@ -48,6 +48,10 @@ var ajaxstate = {
}
};
/* Login name and key */
var lname = null;
var lcred = null;
function writeData(hexstr) {
var codenum;
var codes = [];
@ -138,8 +142,8 @@ function processMsg(msg) {
if (!msgDict.t)
return null;
else if (msgDict.t == "E") {
if (msgDict.c == 1 || msgDict.c == 6) {
logout();
if (msgDict.c == 1 || msgDict.c == 6 || msgDict == 7) {
gameover();
}
debug(1, "Server error: " + msgDict.s);
}
@ -174,7 +178,7 @@ function processMsg(msg) {
setTitle(msgDict.d);
}
else if (msgDict.t == "q") {
logout();
gameover();
}
else {
debug(1, "Unrecognized server message " + msg);
@ -357,9 +361,39 @@ function formlogin(ev) {
var loginmsg = {};
loginmsg["name"] = document.getElementById("input_name").value;
loginmsg["pw"] = document.getElementById("input_pw").value;
loginmsg["game"] = document.getElementById("input_game").value;
loginmsg["h"] = 24;
loginmsg["w"] = 80;
var req = new XMLHttpRequest();
req.onreadystatechange = function () {
if (req.readyState != 4 || req.status != 200)
return;
var reply = JSON.parse(req.responseText);
if (reply.t == 'l') {
/* Success */
lcred = reply.k;
lname = reply.u;
setTitle("Logged in as " + reply.u);
debug(1, "Logged in as " + reply.u + " with id " + reply.k);
setmode("choose");
}
else if (reply.t == 'E') {
debug(1, "Could not log in: " + reply.s);
document.getElementById("input_name").value = "";
document.getElementById("input_pw").value = "";
}
};
req.open('POST', '/login', true);
req.send(JSON.stringify(loginmsg));
return;
}
function startgame(ev) {
ev.preventDefault();
if (termemu.sessid != null || !lcred)
return;
var smsg = {};
smsg["key"] = lcred;
smsg["game"] = document.getElementById("input_game").value;
smsg["h"] = 24;
smsg["w"] = 80;
var req = new XMLHttpRequest();
req.onreadystatechange = function () {
if (req.readyState != 4 || req.status != 200)
@ -369,20 +403,17 @@ function formlogin(ev) {
/* Success */
termemu.sessid = reply.id;
termemu.resize(reply.h, reply.w);
setTitle("Playing as " + loginmsg["name"]);
debug(1, "Logged in with id " + termemu.sessid);
//document.getElementById("loginform").style.display = "none";
setTitle("Playing as " + lname);
debug(1, "Playing with id " + termemu.sessid);
setmode("play");
getData();
}
else if (reply.t == 'E') {
debug(1, "Could not start game: " + reply.s);
document.getElementById("input_name").value = "";
document.getElementById("input_pw").value = "";
}
};
req.open('POST', '/login', true);
req.send(JSON.stringify(loginmsg));
req.open('POST', '/play', true);
req.send(JSON.stringify(smsg));
return;
}
@ -402,7 +433,11 @@ function formreg(ev) {
if (reply.t == 'r') {
/* Success */
debug(1, "Registered account: " + reply.d);
setmode("login");
lcred = reply.k;
lname = reply.u;
setTitle("Logged in as " + lname);
debug(1, "Logged in as " + lname + "with id " + lcred);
setmode("choose");
}
else if (reply.t == 'E') {
debug(1, "Could not register: " + reply.s);
@ -416,7 +451,7 @@ function formreg(ev) {
return;
}
function logout() {
function gameover() {
if (termemu.sessid == null)
return;
/* TODO IFACE2 If the end was unexpected, tell player the game was saved. */
@ -426,11 +461,13 @@ function logout() {
nsend = 0;
nrecv = 0;
msgQ = [];
setmode("login");
setmode("choose");
return;
}
function stop() {
if (!termemu.sessid)
return;
var req = new XMLHttpRequest();
req.onreadystatechange = function () {
if (req.readyState == 4 && req.status == 200) {
@ -448,16 +485,25 @@ function setmode(mode, ev) {
ev.preventDefault();
if (mode == "play") {
document.getElementById("keyboard").style.display = "block";
document.getElementById("startgame").style.display = "none";
document.getElementById("login").style.display = "none";
document.getElementById("register").style.display = "none";
}
if (mode == "choose") {
document.getElementById("keyboard").style.display = "none";
document.getElementById("startgame").style.display = "block";
document.getElementById("login").style.display = "none";
document.getElementById("register").style.display = "none";
}
else if (mode == "login") {
document.getElementById("keyboard").style.display = "none";
document.getElementById("startgame").style.display = "none";
document.getElementById("login").style.display = "block";
document.getElementById("register").style.display = "none";
}
else if (mode == "register") {
document.getElementById("keyboard").style.display = "none";
document.getElementById("startgame").style.display = "none";
document.getElementById("login").style.display = "none";
document.getElementById("register").style.display = "block";
}