From c6788ecf8a595409c7e31febf3d13c97bde2a725 Mon Sep 17 00:00:00 2001 From: Benjamin Auder Date: Sat, 18 Jan 2020 17:56:28 +0100 Subject: [PATCH] Save state: draft of askgame logic but some bugs for now --- client/src/components/Chat.vue | 2 +- client/src/views/Game.vue | 19 ++++++++++-- client/src/views/Hall.vue | 43 ++++++++++---------------- server/sockets.js | 55 ++++++++++++++++++++++++---------- 4 files changed, 73 insertions(+), 46 deletions(-) diff --git a/client/src/components/Chat.vue b/client/src/components/Chat.vue index b4970f70..c7f63cfa 100644 --- a/client/src/components/Chat.vue +++ b/client/src/components/Chat.vue @@ -28,7 +28,7 @@ export default { if (data.code == "newchat") //only event at this level { this.chats.push({msg:data.msg, - name:data.name || "@nonymous", sid:data.sid}); + name:data.name || "@nonymous", sid:data.from}); } }; const socketCloseListener = () => { diff --git a/client/src/views/Game.vue b/client/src/views/Game.vue index 8fbc9d0b..5939c905 100644 --- a/client/src/views/Game.vue +++ b/client/src/views/Game.vue @@ -184,6 +184,19 @@ export default { } break; } + case "askgame": + // Send current (live) game + const myGame = + { + // Minimal game informations: + id: this.game.id, + players: this.game.players.map(p => p.name), + vid: this.game.vid, + timeControl: this.game.timeControl, + }; + this.st.conn.send(JSON.stringify({code:"game", + game:myGame, target:data.from})); + break; case "newmove": // NOTE: this call to play() will trigger processMove() this.$refs["basegame"].play(data.move, @@ -235,12 +248,12 @@ export default { // ==> on "newmove", check "drawOffer" field case "connect": { - this.people.push({name:"", id:0, sid:data.sid}); - this.st.conn.send(JSON.stringify({code:"askidentity", target:data.sid})); + this.people.push({name:"", id:0, sid:data.from}); + this.st.conn.send(JSON.stringify({code:"askidentity", target:data.from})); break; } case "disconnect": - ArrayFun.remove(this.people, p => p.sid == data.sid); + ArrayFun.remove(this.people, p => p.sid == data.from); break; } }, diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue index 287788a1..e11e8e13 100644 --- a/client/src/views/Hall.vue +++ b/client/src/views/Hall.vue @@ -317,26 +317,6 @@ export default { } break; } - case "askgame": - { - // Send my current live game (if any) - GameStorage.getCurrent((game) => { - if (!!game) - { - const myGame = - { - // Minimal game informations: - id: game.id, - players: game.players.map(p => p.name), - vid: game.vid, - timeControl: game.timeControl, - }; - this.st.conn.send(JSON.stringify({code:"game", - game:myGame, target:data.from})); - } - }); - break; - } case "identity": { const pIdx = this.people.findIndex(p => p.sid == data.user.sid); @@ -404,20 +384,20 @@ export default { } case "connect": { - this.people.push({name:"", id:0, sid:data.sid}); - this.st.conn.send(JSON.stringify({code:"askidentity", target:data.sid})); - this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.sid})); - this.st.conn.send(JSON.stringify({code:"askgame", target:data.sid})); + this.people.push({name:"", id:0, sid:data.from}); + this.st.conn.send(JSON.stringify({code:"askidentity", target:data.from})); + this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.from})); + this.st.conn.send(JSON.stringify({code:"askgame", target:data.from})); break; } case "disconnect": { - ArrayFun.remove(this.people, p => p.sid == data.sid); + ArrayFun.remove(this.people, p => p.sid == data.from); // Also remove all challenges sent by this player: - ArrayFun.remove(this.challenges, c => c.from.sid == data.sid); + ArrayFun.remove(this.challenges, c => c.from.sid == data.from); // And all live games where he plays and no other opponent is online ArrayFun.remove(this.games, g => - g.type == "live" && (g.players.every(p => p.sid == data.sid + g.type == "live" && (g.players.every(p => p.sid == data.from || !this.people.some(pl => pl.sid == p.sid))), "all"); break; } @@ -578,6 +558,15 @@ export default { } ); } + // Send game info to everyone except opponent (and me) + this.st.conn.send(JSON.stringify({code:"game", + game: { //minimal game info: + id: gameInfo.id, + players: gameInfo.players.map(p => p.name), + vid: gameInfo.vid, + timeControl: gameInfo.timeControl, + }, + oppsid: target})); }, // NOTE: for live games only (corr games start on the server) startNewGame: function(gameInfo) { diff --git a/server/sockets.js b/server/sockets.js index c2fd552b..b3c3a1d6 100644 --- a/server/sockets.js +++ b/server/sockets.js @@ -3,9 +3,10 @@ const url = require('url'); // Node version in Ubuntu 16.04 does not know about URL class function getJsonFromUrl(url) { - const query = url.substr(2); //starts with "/?" - let result = {}; - query.split("&").forEach((part) => { + // url: /game/XYZ/?sid=XYZ + const queryParts = url.split("?"); + let result = {page: queryParts[0]}; + queryParts[1].split("&").forEach((part) => { const item = part.split("="); result[item[0]] = decodeURIComponent(item[1]); }); @@ -21,32 +22,41 @@ module.exports = function(wss) { if (!!clients[sid]) return socket.send(JSON.stringify({code:"duplicate"})); clients[sid] = {sock: socket, page: query["page"]}; - const notifyRoom = (page,code,obj) => { + const notifyRoom = (page,code,obj={},excluded=[]) => { Object.keys(clients).forEach(k => { + if (k in excluded) + return; if (k != sid && clients[k].page == page) { clients[k].sock.send(JSON.stringify(Object.assign( - {code:code}, obj))); + {code:code, from:sid}, obj))); } }); }; - notifyRoom(query["page"],"connect",{sid:sid}); + notifyRoom(query["page"], "connect"); //Hall or Game socket.on("message", objtxt => { let obj = JSON.parse(objtxt); if (!!obj.target && !clients[obj.target]) return; //receiver not connected, nothing we can do + +console.log(obj.code); +console.log(clients); + switch (obj.code) { case "pollclients": const curPage = clients[sid].page; socket.send(JSON.stringify({code:"pollclients", - sockIds: Object.keys(clients).filter(k => - k != sid && clients[k].page == curPage)})); + sockIds: Object.keys(clients).filter(k => k != sid && + (clients[k].page == curPage || + // Consider that people playing are in Hall too: + (curPage == "/" && clients[k].page.indexOf("/game/") >= 0)) + )})); break; case "pagechange": - notifyRoom(clients[sid].page, "disconnect", {sid:sid}); + notifyRoom(clients[sid].page, "disconnect"); clients[sid].page = obj.page; - notifyRoom(obj.page, "connect", {sid:sid}); + notifyRoom(obj.page, "connect"); break; case "askidentity": clients[obj.target].sock.send(JSON.stringify( @@ -57,6 +67,14 @@ module.exports = function(wss) { {code:"askchallenge",from:sid})); break; case "askgame": + // Check all clients playing, and send them a "askgame" message + Object.keys(clients).forEach(k => { + if (k != sid && clients[k].page.indexOf("/game/") >= 0) + { + clients[k].sock.send(JSON.stringify( + {code:"askgame", from: sid})); + } + }); clients[obj.target].sock.send(JSON.stringify( {code:"askgame",from:sid})); break; @@ -81,17 +99,24 @@ module.exports = function(wss) { {code:"challenge", chall:obj.chall, from:sid})); break; case "game": - clients[obj.target].sock.send(JSON.stringify( - {code:"game", game:obj.game, from:sid})); + if (!!obj.target) + { + clients[obj.target].sock.send(JSON.stringify( + {code:"game", game:data.game, from:sid})); + } + else + { + // Notify all room except opponent and me: + notifyRoom("/", "game", {game:data.game}, [data.oppsid]); + } break; case "newchat": - notifyRoom(query["page"], "newchat", - {msg:obj.msg, name:obj.name, sid:sid}) + notifyRoom(query["page"], "newchat", {msg:obj.msg, name:obj.name}); break; // TODO: WebRTC instead in this case (most demanding?) case "newmove": clients[obj.target].sock.send(JSON.stringify( - {code:"newmove",move:obj.move})); + {code:"newmove", move:obj.move})); break; case "lastate": clients[obj.target].sock.send(JSON.stringify( -- 2.44.0