X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FMyGames.vue;h=5d8620736b380eb1f00b3893289ab27baf95e84f;hb=cafe016679ee9c14bf7bf0a37104ade7f74aff89;hp=c9c6565979f6bcef41f077272de8a1a610c5e75d;hpb=23ecf00824691b5622b468e0409fc543c87d75dc;p=vchess.git diff --git a/client/src/views/MyGames.vue b/client/src/views/MyGames.vue index c9c65659..5d862073 100644 --- a/client/src/views/MyGames.vue +++ b/client/src/views/MyGames.vue @@ -11,11 +11,13 @@ main v-show="display=='live'" :games="liveGames" @show-game="showGame" + @abortgame="abortGame" ) GameList( v-show="display=='corr'" :games="corrGames" @show-game="showGame" + @abortgame="abortGame" ) @@ -23,6 +25,7 @@ main import { store } from "@/store"; import { GameStorage } from "@/utils/gameStorage"; import { ajax } from "@/utils/ajax"; +import { getScoreMessage } from "@/utils/scoring"; import params from "@/parameters"; import { getRandString } from "@/utils/alea"; import GameList from "@/components/GameList.vue"; @@ -43,20 +46,36 @@ export default { }, created: function() { GameStorage.getAll(true, localGames => { - localGames.forEach(g => (g.type = this.classifyObject(g))); + localGames.forEach(g => g.type = "live"); this.liveGames = localGames; }); if (this.st.user.id > 0) { - ajax("/games", "GET", { uid: this.st.user.id }, res => { - res.games.forEach(g => (g.type = this.classifyObject(g))); - this.corrGames = res.games; - }); + ajax( + "/games", + "GET", + { + data: { uid: this.st.user.id }, + success: (res) => { + let serverGames = res.games.filter(g => { + const mySide = + g.players[0].uid == this.st.user.id + ? "White" + : "Black"; + return !g["deletedBy" + mySide]; + }); + serverGames.forEach(g => g.type = "corr"); + this.corrGames = serverGames; + } + } + ); } // Initialize connection this.connexionString = params.socketUrl + "/?sid=" + this.st.user.sid + + "&id=" + + this.st.user.id + "&tmpId=" + getRandString() + "&page=" + @@ -83,30 +102,52 @@ export default { elt.previousElementSibling.classList.remove("active"); else elt.nextElementSibling.classList.remove("active"); }, - // TODO: classifyObject is redundant (see Hall.vue) - classifyObject: function(o) { - return o.cadence.indexOf("d") === -1 ? "live" : "corr"; - }, - showGame: function(g) { - this.$router.push("/game/" + g.id); + tryShowNewsIndicator: function(type) { + if ( + (type == "live" && this.display == "corr") || + (type == "corr" && this.display == "live") + ) { + document + .getElementById(type + "Games") + .classList.add("somethingnew"); + } }, socketMessageListener: function(msg) { const data = JSON.parse(msg.data); - // Only event is newmove, and received only: - if (data.code == "newmove") { - let games = !!parseInt(data.gid) - ? this.corrGames - : this.liveGames; - // NOTE: new move itself is not received, because it wouldn't be used. - let g = games.find(g => g.id == data.gid); - this.$set(g, "movesCount", g.movesCount + 1); - if ( - (g.type == "live" && this.display == "corr") || - (g.type == "corr" && this.display == "live") - ) { - document - .getElementById(g.type + "Games") - .classList.add("somethingnew"); + switch (data.code) { + // NOTE: no need to increment movesCount: unused if turn is provided + case "notifyturn": + case "notifyscore": { + const info = data.data; + let games = + !!parseInt(info.gid) + ? this.corrGames + : this.liveGames; + let g = games.find(g => g.id == info.gid); + // "notifything" --> "thing": + const thing = data.code.substr(6); + this.$set(g, thing, info[thing]); + this.tryShowNewsIndicator(g.type); + break; + } + case "notifynewgame": { + const gameInfo = data.data; + // st.variants might be uninitialized, + // if unlucky and newgame right after connect: + const v = this.st.variants.find(v => v.id == gameInfo.vid); + const vname = !!v ? v.name : ""; + const type = gameInfo.cadence.indexOf('d') >= 0 ? "corr": "live"; + const game = Object.assign( + { + vname: vname, + type: type, + score: "*" + }, + gameInfo + ); + this[type + "Games"].push(game); + this.tryShowNewsIndicator(type); + break; } } }, @@ -114,6 +155,73 @@ export default { this.conn = new WebSocket(this.connexionString); this.conn.addEventListener("message", this.socketMessageListener); this.conn.addEventListener("close", this.socketCloseListener); + }, + showGame: function(game) { + // TODO: "isMyTurn" is duplicated (see GameList component). myColor also + const isMyTurn = (g) => { + if (g.score != "*") return false; + const myColor = + g.players[0].uid == this.st.user.id || + g.players[0].sid == this.st.user.sid + ? "w" + : "b"; + const rem = g.movesCount % 2; + return ( + (rem == 0 && myColor == "w") || + (rem == 1 && myColor == "b") + ); + }; + if (game.type == "live" || !isMyTurn(game)) { + this.$router.push("/game/" + game.id); + return; + } + // It's my turn in this game. Are there others? + let nextIds = ""; + let otherCorrGamesMyTurn = this.corrGames.filter( + g => g.id != game.id && isMyTurn(g)); + if (otherCorrGamesMyTurn.length > 0) { + nextIds += "/?next=["; + otherCorrGamesMyTurn.forEach(g => { nextIds += g.id + ","; }); + // Remove last comma and close array: + nextIds = nextIds.slice(0, -1) + "]"; + } + this.$router.push("/game/" + game.id + nextIds); + }, + abortGame: function(game) { + // Special "trans-pages" case: from MyGames to Game + // TODO: also for corr games? (It's less important) + if (game.type == "live") { + const oppsid = + game.players[0].sid == this.st.user.sid + ? game.players[1].sid + : game.players[0].sid; + this.conn.send( + JSON.stringify( + { + code: "mabort", + gid: game.id, + // NOTE: target might not be online + target: oppsid + } + ) + ); + } + else if (!game.deletedByWhite || !game.deletedByBlack) { + // Set score if game isn't deleted on server: + ajax( + "/games", + "PUT", + { + data: { + gid: game.id, + newObj: { + score: "?", + scoreMsg: getScoreMessage("?") + } + } + } + ); + } } } };