X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=server%2Fsockets.js;h=f904311cbcf5b92e08f62faa220597437616e165;hp=4907965d041a38575ee7a2959b547b9fe9dac2ab;hb=f54f4c26b4c820b14aca298e94644efb20beeed6;hpb=84fc0f02d3d399af66c40b3e9994f67b415ffd0e diff --git a/server/sockets.js b/server/sockets.js index 4907965d..f904311c 100644 --- a/server/sockets.js +++ b/server/sockets.js @@ -155,22 +155,42 @@ module.exports = function(wss) { case "askidentity": case "asklastate": case "askchallenges": - case "askgame": - case "askfullgame": { + case "askgame": { const pg = obj.page || page; //required for askidentity and askgame - // In cas askfullgame to wrong SID for example, would crash: if (!!clients[pg] && !!clients[pg][obj.target]) { - const tmpIds = Object.keys(clients[pg][obj.target]); + let tmpIds = Object.keys(clients[pg][obj.target]); if (obj.target == sid) { // Targetting myself const idx_myTmpid = tmpIds.findIndex(x => x == tmpId); if (idx_myTmpid >= 0) tmpIds.splice(idx_myTmpid, 1); } - const tmpId_idx = Math.floor(Math.random() * tmpIds.length); - send( - clients[pg][obj.target][tmpIds[tmpId_idx]].socket, - { code: obj.code, from: [sid,tmpId,page] } - ); + if (tmpIds.length > 0) { + const ttmpId = tmpIds[Math.floor(Math.random() * tmpIds.length)]; + send( + clients[pg][obj.target][ttmpId].socket, + { code: obj.code, from: [sid,tmpId,page] } + ); + } + } + break; + } + + // Special situation of the previous "case": + // Full game can be asked to any observer. + case "askfullgame": { + if (!!clients[page]) { + let sids = Object.keys(clients[page]).filter(k => k != sid); + if (sids.length > 0) { + // Pick a SID at random in this set, and ask full game: + const rid = sids[Math.floor(Math.random() * sids.length)]; + // ..to a random tmpId: + const tmpIds = Object.keys(clients[page][rid]); + const rtmpId = tmpIds[Math.floor(Math.random() * tmpIds.length)]; + send( + clients[page][rid][rtmpId].socket, + { code: "askfullgame", from: [sid,tmpId] } + ); + } } break; }