X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=server%2Fsockets.js;h=e7bb556ca43846f87111d458d035a97d8ee552e7;hb=c4f6d5a15bac583f9392e4fc1fabee23eaf9d1f5;hp=795ed433421367895f650771bb69c441473052da;hpb=9335d45b03966f433df8dd84ec31e8a22585a97f;p=vchess.git diff --git a/server/sockets.js b/server/sockets.js index 795ed433..e7bb556c 100644 --- a/server/sockets.js +++ b/server/sockets.js @@ -1,6 +1,7 @@ const url = require('url'); // Node version in Ubuntu 16.04 does not know about URL class +// NOTE: url is already transformed, without ?xxx=yyy... parts function getJsonFromUrl(url) { const query = url.substr(2); //starts with "/?" @@ -18,7 +19,14 @@ module.exports = function(wss) { const query = getJsonFromUrl(req.url); const sid = query["sid"]; if (!!clients[sid]) - return socket.send(JSON.stringify({code:"duplicate"})); + { + // Dummy messages listener: just send "duplicate" event on anything + // ('connect' events for Hall and Game, 'askfullgame' for observers) + return socket.on("message", objtxt => { + if (["connect","askfullgame"].includes(JSON.parse(objtxt).code)) + socket.send(JSON.stringify({code:"duplicate"})); + }); + } clients[sid] = {sock: socket, page: query["page"]}; const notifyRoom = (page,code,obj={},excluded=[]) => { Object.keys(clients).forEach(k => { @@ -41,10 +49,13 @@ module.exports = function(wss) { switch (obj.code) { case "connect": - notifyRoom(query["page"], "connect"); //Hall or Game - if (query["page"].indexOf("/game/") >= 0) + { + const curPage = clients[sid].page; + notifyRoom(curPage, "connect"); //Hall or Game + if (curPage.indexOf("/game/") >= 0) notifyRoom("/", "gconnect"); //notify main hall break; + } case "pollclients": { const curPage = clients[sid].page; @@ -62,12 +73,13 @@ module.exports = function(wss) { break; case "pagechange": // page change clients[sid].page --> obj.page -console.log("page change: " + clients[sid].page + " " + obj.page + " " + sid); + // TODO: some offline rooms don't need to receive disconnect event notifyRoom(clients[sid].page, "disconnect"); if (clients[sid].page.indexOf("/game/") >= 0) notifyRoom("/", "gdisconnect"); clients[sid].page = obj.page; - notifyRoom(obj.page, "connect"); + // No need to notify connection: it's self-sent in .vue file + //notifyRoom(obj.page, "connect"); if (obj.page.indexOf("/game/") >= 0) notifyRoom("/", "gconnect"); break; @@ -75,6 +87,10 @@ console.log("page change: " + clients[sid].page + " " + obj.page + " " + sid); clients[obj.target].sock.send(JSON.stringify( {code:"askidentity",from:sid})); break; + case "asklastate": + clients[obj.target].sock.send(JSON.stringify( + {code:"asklastate",from:sid})); + break; case "askchallenge": clients[obj.target].sock.send(JSON.stringify( {code:"askchallenge",from:sid})); @@ -107,6 +123,10 @@ console.log("page change: " + clients[sid].page + " " + obj.page + " " + sid); }); break; } + case "askgame": + clients[obj.target].sock.send(JSON.stringify( + {code:"askgame", from:sid})); + break; case "askfullgame": clients[obj.target].sock.send(JSON.stringify( {code:"askfullgame", from:sid})); @@ -151,7 +171,7 @@ console.log("page change: " + clients[sid].page + " " + obj.page + " " + sid); notifyRoom(clients[sid].page, "newchat", {chat:obj.chat}); break; // TODO: WebRTC instead in this case (most demanding?) - // --> At least do a "notifyRoom" + // --> Or else: at least do a "notifyRoom" (also for draw, resign...) case "newmove": clients[obj.target].sock.send(JSON.stringify( {code:"newmove", move:obj.move}));