Advance on components/game.js
[vchess.git] / sockets.js
index f1354f3..21742d1 100644 (file)
@@ -1,6 +1,20 @@
 const url = require('url');
 const sqlite3 = require('sqlite3');
-const db = new sqlite3.Database('db/vchess.sqlite');
+const db = new sqlite3.Database(__dirname + "/db/vchess.sqlite");
+
+// Node version in Ubuntu 16.04 does not know about URL class
+function getJsonFromUrl(url) {
+       var query = url.substr(2); //starts with "/?"
+       var result = {};
+       query.split("&").forEach(function(part) {
+               var item = part.split("=");
+               result[item[0]] = decodeURIComponent(item[1]);
+       });
+       return result;
+}
+
+// TODO: empêcher multi-log du même user (envoyer le user ID + secret en même temps que name et...)
+// --> si secret ne matche pas celui trouvé en DB, stop
 
 module.exports = function(wss) {
        db.serialize(function() {
@@ -8,13 +22,16 @@ module.exports = function(wss) {
                        let clients = { "index": {} };
                        let games = {}; //pending games (player sid)
                        for (const v of variants)
-                               clients[v.name] = {};
+                               clients[v.id] = {};
                        // No-op function as a callback when sending messages
                        const noop = () => { };
                        wss.on("connection", (socket, req) => {
-                               const params = new URL("http://localhost" + req.url).searchParams;
-                               const sid = params.get("sid");
-                               const page = params.get("page");
+//                             const params = new URL("http://localhost" + req.url).searchParams;
+//                             const sid = params.get("sid");
+//                             const page = params.get("page");
+                               var query = getJsonFromUrl(req.url);
+                               const sid = query["sid"];
+                               const page = query["page"];
                                // Ignore duplicate connections:
                                if (!!clients[page][sid])
                                {
@@ -27,7 +44,7 @@ module.exports = function(wss) {
                                        // Send counting info
                                        const countings = {};
                                        for (const v of variants)
-                                               countings[v.name] = Object.keys(clients[v.name]).length;
+                                               countings[v.id] = Object.keys(clients[v.id]).length;
                                        socket.send(JSON.stringify({code:"counts",counts:countings}));
                                }
                                else
@@ -35,7 +52,7 @@ module.exports = function(wss) {
                                        // Send to every client connected on index an update message for counts
                                        Object.keys(clients["index"]).forEach( k => {
                                                clients["index"][k].send(
-                                                       JSON.stringify({code:"increase",vname:page}), noop);
+                                                       JSON.stringify({code:"increase",vid:page}), noop);
                                        });
                                        // Also notify potential opponents:
                                        // hit all clients which check if sid corresponds
@@ -46,6 +63,13 @@ module.exports = function(wss) {
                                                let obj = JSON.parse(objtxt);
                                                switch (obj.code)
                                                {
+                                                       case "newchat":
+                                                               if (!!clients[page][obj.oppid])
+                                                               {
+                                                                       clients[page][obj.oppid].send(
+                                                                               JSON.stringify({code:"newchat",msg:obj.msg}), noop);
+                                                               }
+                                                               break;
                                                        case "newmove":
                                                                if (!!clients[page][obj.oppid])
                                                                {
@@ -55,7 +79,15 @@ module.exports = function(wss) {
                                                                break;
                                                        case "ping":
                                                                if (!!clients[page][obj.oppid])
-                                                                       socket.send(JSON.stringify({code:"pong"}));
+                                                                       socket.send(JSON.stringify({code:"pong",gameId:obj.gameId}));
+                                                               break;
+                                                       case "myname":
+                                                               // Reveal my username to opponent
+                                                               if (!!clients[page][obj.oppid])
+                                                               {
+                                                                       clients[page][obj.oppid].send(JSON.stringify({
+                                                                               code:"oppname", name:obj.name}));
+                                                               }
                                                                break;
                                                        case "lastate":
                                                                if (!!clients[page][obj.oppid])
@@ -71,20 +103,21 @@ module.exports = function(wss) {
                                                                        // Start a new game
                                                                        const oppId = games[page]["id"];
                                                                        const fen = games[page]["fen"];
+                                                                       const gameId = games[page]["gameid"];
                                                                        delete games[page];
-                                                                       const mycolor = Math.random() < 0.5 ? 'w' : 'b';
+                                                                       const mycolor = (Math.random() < 0.5 ? 'w' : 'b');
                                                                        socket.send(JSON.stringify(
-                                                                               {code:"newgame",fen:fen,oppid:oppId,color:mycolor}));
+                                                                               {code:"newgame",fen:fen,oppid:oppId,color:mycolor,gameid:gameId}));
                                                                        if (!!clients[page][oppId])
                                                                        {
                                                                                clients[page][oppId].send(
                                                                                        JSON.stringify(
-                                                                                               {code:"newgame",fen:fen,oppid:sid,color:mycolor=="w"?"b":"w"}),
+                                                                                               {code:"newgame",fen:fen,oppid:sid,color:mycolor=="w"?"b":"w",gameid:gameId}),
                                                                                        noop);
                                                                        }
                                                                }
                                                                else
-                                                                       games[page] = {id:sid, fen:obj.fen}; //wait for opponent
+                                                                       games[page] = {id:sid, fen:obj.fen, gameid:obj.gameid}; //wait for opponent
                                                                break;
                                                        case "cancelnewgame": //if a user cancel his seek
                                                                delete games[page];
@@ -106,7 +139,7 @@ module.exports = function(wss) {
                                                // Send to every client connected on index an update message for counts
                                                Object.keys(clients["index"]).forEach( k => {
                                                        clients["index"][k].send(
-                                                               JSON.stringify({code:"decrease",vname:page}), noop);
+                                                               JSON.stringify({code:"decrease",vid:page}), noop);
                                                });
                                        }
                                        // Also notify potential opponents: