Styles must be improved (full width for smartphones, selectable text for PGN...)
Tooltip text should fade (even when mouse stay on it, especially for small screens)
Checkered stage 2: switch button at reserve position (or on top).
-If a played disconnect right after opponent sent a move, it might be never received: secure this
Mode expert: game.js, button on top (with online indicator)
Turn indicator on top too (black or white)
+incheck by checkered pawns: not marked (because of turn changed?)
{
// New game request has been cancelled on disconnect
this.seek = true;
- this.newGame("human");
+ this.newGame("human", "reconnect");
}
};
const socketMessageListener = msg => {
} catch (INVALID_STATE_ERR) {
return; //nothing achieved
}
- let modalBox = document.getElementById("modal-control2");
- modalBox.checked = true;
- setTimeout(() => { modalBox.checked = false; }, 2000);
+ if (!fenInit || fenInit!="reconnect") //TODO: bad HACK...
+ {
+ let modalBox = document.getElementById("modal-control2");
+ modalBox.checked = true;
+ setTimeout(() => { modalBox.checked = false; }, 2000);
+ }
return;
}
this.vr = new VariantRules(fen, moves || []);
for (const v of Variants)
clients[v.name] = {};
- // TODO: when relaying to opponent, check readyState, potential setTimeout()? + send opponent (re)disconnect
// (resign, newgame, newmove). See https://github.com/websockets/ws/blob/master/lib/websocket.js around line 313
- // TODO: awaiting newmove, resign, newgame :: in memory structure (use Redis ?)
+ // TODO: awaiting newmove, resign, (+newgame?) :: in memory structure (use Redis ?)
+ let newmoves = {};
+ let newresign = {};
+ for (const v of Variants)
+ {
+ newmoves[v.name] = {};
+ newresign[v.name] = {};
+ }
wss.on("connection", (socket, req) => {
//const params = new URL("http://localhost" + req.url).searchParams;
Object.keys(clients[page]).forEach( k => {
clients[page][k].send(JSON.stringify({code:"connect",id:sid}));
});
+ if (!!newmoves[page][sid])
+ {
+ socket.send(JSON.stringify({code:"newmove",move:newmoves[page][sid]}));
+ delete newmoves[page][sid];
+ }
+ if (!!newresign[page][sid])
+ {
+ socket.send(JSON.stringify({code:"resign"}));
+ delete newresign[page][sid];
+ }
socket.on("message", objtxt => {
let obj = JSON.parse(objtxt);
switch (obj.code)
{
case "newmove":
- clients[page][obj.oppid].send(JSON.stringify({code:"newmove",move:obj.move}));
+ if (!!clients[page][obj.oppid] && clients[page][obj.oppid].readyState == WebSocket.OPEN)
+ clients[page][obj.oppid].send(JSON.stringify({code:"newmove",move:obj.move}));
+ else
+ newmoves[page][obj.oppid] = obj.move;
break;
case "ping":
- if (!!clients[page][obj.oppid])
+ if (!!clients[page][obj.oppid] && clients[page][obj.oppid].readyState == WebSocket.OPEN)
socket.send(JSON.stringify({code:"pong"}));
break;
case "newgame":
games[page] = {id:sid, fen:obj.fen}; //wait for opponent
break;
case "resign":
- clients[page][obj.oppid].send(JSON.stringify({code:"resign"}));
+ if (!!clients[page][obj.oppid] && clients[page][obj.oppid].readyState == WebSocket.OPEN)
+ clients[page][obj.oppid].send(JSON.stringify({code:"resign"}));
+ else
+ newresign[page][obj.oppid] = true;
break;
}
});