X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FHall.vue;h=92030e74089650d9c1b697f40e38cdd6d1a40d4a;hb=e727fe31742dfb3e40eb222c94f4199e2be98453;hp=9656c96707f6d3806a28ae91d952c40de520a735;hpb=afde76668963c4d0d96002fcae2ebabb9acf81e4;p=vchess.git diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue index 9656c967..92030e74 100644 --- a/client/src/views/Hall.vue +++ b/client/src/views/Hall.vue @@ -256,7 +256,15 @@ export default { response.games.map(g => { const type = this.classifyObject(g); const vname = this.getVname(g.vid); - return Object.assign({}, g, { type: type, vname: vname }); + return Object.assign( + {}, + g, + { + type: type, + vname: vname, + priority: g.score == "*" ? 1 : 0 //for display + } + ); }) ); } @@ -324,6 +332,8 @@ export default { params.socketUrl + "/?sid=" + this.st.user.sid + + "&id=" + + this.st.user.id + "&tmpId=" + getRandString() + "&page=" + @@ -682,20 +692,21 @@ export default { } case "game": //individual request case "newgame": { - // NOTE: it may be live or correspondance const game = data.data; - // Ignore games where I play (corr games) + // Ignore games where I play (will go in MyGames page) if (game.players.every(p => - p.sid != this.st.user.sid || p.id != this.st.user.id)) + p.sid != this.st.user.sid || p.uid != this.st.user.id)) { let locGame = this.games.find(g => g.id == game.id); if (!locGame) { let newGame = game; newGame.type = this.classifyObject(game); newGame.vname = this.getVname(game.vid); + newGame.priority = 0; if (!game.score) - //if new game from Hall + // New game from Hall newGame.score = "*"; + if (newGame.score == "*") newGame.priority++; newGame.rids = [game.rid]; delete newGame["rid"]; this.games.push(newGame); @@ -716,11 +727,14 @@ export default { } case "result": { let g = this.games.find(g => g.id == data.gid); - if (!!g) g.score = data.score; + if (!!g) { + g.score = data.score; + g.priority = 0; + } break; } case "startgame": { - // New game just started: data contain all information + // New game just started, I'm involved const gameInfo = data.data; if (this.classifyObject(gameInfo) == "live") this.startNewGame(gameInfo); @@ -733,8 +747,7 @@ export default { "#/game/" + gameInfo.id + ""; - let modalBox = document.getElementById("modalInfo"); - modalBox.checked = true; + document.getElementById("modalInfo").checked = true; } break; } @@ -907,6 +920,7 @@ export default { } this.send("deletechallenge", { data: c.id }); }, + // TODO: if several players click same challenge at the same time: problem clickChallenge: async function(c) { const myChallenge = c.from.sid == this.st.user.sid || //live @@ -950,6 +964,16 @@ export default { }, // NOTE: when launching game, the challenge is already being deleted launchGame: function(c) { + let players = + !!c.mycolor + ? (c.mycolor == "w" ? [c.seat, c.from] : [c.from, c.seat]) + : shuffle([c.from, c.seat]); + // Convention for players IDs in stored games is 'uid' + players.forEach(p => { + let pWithUid = p; + pWithUid["uid"] = p.id; + delete pWithUid["id"]; + }); // These game informations will be shared let gameInfo = { id: getRandString(), @@ -964,16 +988,27 @@ export default { const notifyNewgame = () => { const oppsid = this.getOppsid(c); if (!!oppsid) - //opponent is online + // Opponent is online this.send("startgame", { data: gameInfo, target: oppsid }); - // Send game info (only if live) to everyone except me in this tab - this.send("newgame", { data: gameInfo }); + // Send game info (only if live) to everyone except me and opponent + // TODO: this double message send could be avoided. + this.send("newgame", { data: gameInfo, oppsid: oppsid }); + // Also to MyGames page: + this.send( + "notifynewgame", + { + data: gameInfo, + targets: gameInfo.players.map(p => { + return { sid: p.sid, uid: p.uid }; + }) + } + ); }; if (c.type == "live") { notifyNewgame(); this.startNewGame(gameInfo); - } //corr: game only on server - else { + } else { + // corr: game only on server ajax( "/games", "POST", @@ -991,25 +1026,36 @@ export default { }, // NOTE: for live games only (corr games start on the server) startNewGame: function(gameInfo) { - const game = Object.assign({}, gameInfo, { - // (other) Game infos: constant - fenStart: gameInfo.fen, - vname: this.getVname(gameInfo.vid), - created: Date.now(), - // Game state (including FEN): will be updated - moves: [], - clocks: [-1, -1], //-1 = unstarted - initime: [0, 0], //initialized later - score: "*" - }); - GameStorage.add(game, (err) => { - // If an error occurred, game is not added: abort - if (!err) { - if (this.st.settings.sound) - new Audio("/sounds/newgame.flac").play().catch(() => {}); - this.$router.push("/game/" + gameInfo.id); + const game = Object.assign( + {}, + gameInfo, + { + // (other) Game infos: constant + fenStart: gameInfo.fen, + vname: this.getVname(gameInfo.vid), + created: Date.now(), + // Game state (including FEN): will be updated + moves: [], + clocks: [-1, -1], //-1 = unstarted + initime: [0, 0], //initialized later + score: "*" } - }); + ); + setTimeout( + () => { + GameStorage.add(game, (err) => { + // If an error occurred, game is not added: a tab already + // added the game and (if focused) is redirected toward it. + // If no error and the tab is hidden: do not show anything. + if (!err && !document.hidden) { + if (this.st.settings.sound) + new Audio("/sounds/newgame.flac").play().catch(() => {}); + this.$router.push("/game/" + gameInfo.id); + } + }); + }, + document.hidden ? 500 + 1000 * Math.random() : 0 + ); } } };