X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=sockets.js;h=21742d1dbb662440cc07bfba4fb6643dee5c9ace;hb=d44df0b01732d1948525daef5df62211ea6e1f64;hp=f1354f3666d36f936efbd3d98c6e9ddc97a2d85d;hpb=da06a6eb0237123ce43fdb01cb06246b8b57f5e5;p=vchess.git diff --git a/sockets.js b/sockets.js index f1354f36..21742d1d 100644 --- a/sockets.js +++ b/sockets.js @@ -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: