X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FMyGames.vue;h=bcf7d18271ad08756e708ea901b5c581a3e13d5c;hp=22f804dc29d54a8f94d99e13e91407a87e43a537;hb=620a88ede2ad25e66d9cbb521388ee53e4a564c0;hpb=910d631b73cad5ffef1b4461157b704e7e7057d8 diff --git a/client/src/views/MyGames.vue b/client/src/views/MyGames.vue index 22f804dc..bcf7d182 100644 --- a/client/src/views/MyGames.vue +++ b/client/src/views/MyGames.vue @@ -23,6 +23,8 @@ main import { store } from "@/store"; import { GameStorage } from "@/utils/gameStorage"; import { ajax } from "@/utils/ajax"; +import params from "@/parameters"; +import { getRandString } from "@/utils/alea"; import GameList from "@/components/GameList.vue"; export default { name: "my-my-games", @@ -34,11 +36,13 @@ export default { st: store.state, display: "live", liveGames: [], - corrGames: [] + corrGames: [], + conn: null, + connexionString: "" }; }, created: function() { - GameStorage.getAll(localGames => { + GameStorage.getAll(true, localGames => { localGames.forEach(g => (g.type = this.classifyObject(g))); this.liveGames = localGames; }); @@ -48,17 +52,33 @@ export default { this.corrGames = res.games; }); } + // Initialize connection + this.connexionString = + params.socketUrl + + "/?sid=" + + this.st.user.sid + + "&tmpId=" + + getRandString() + + "&page=" + + encodeURIComponent(this.$route.path); + this.conn = new WebSocket(this.connexionString); + this.conn.onmessage = this.socketMessageListener; + this.conn.onclose = this.socketCloseListener; }, mounted: function() { const showType = localStorage.getItem("type-myGames") || "live"; this.setDisplay(showType); }, + beforeDestroy: function() { + this.conn.send(JSON.stringify({code: "disconnect"})); + }, methods: { setDisplay: function(type, e) { this.display = type; localStorage.setItem("type-myGames", type); let elt = e ? e.target : document.getElementById(type + "Games"); elt.classList.add("active"); + elt.classList.remove("somethingnew"); //in case of if (elt.previousElementSibling) elt.previousElementSibling.classList.remove("active"); else elt.nextElementSibling.classList.remove("active"); @@ -67,17 +87,75 @@ export default { classifyObject: function(o) { return o.cadence.indexOf("d") === -1 ? "live" : "corr"; }, - showGame: function(g) { - this.$router.push("/game/" + g.id); + 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); + }, + socketMessageListener: function(msg) { + const data = JSON.parse(msg.data); + if (data.code == "changeturn") { + 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"); + } + } + }, + socketCloseListener: function() { + this.conn = new WebSocket(this.connexionString); + this.conn.addEventListener("message", this.socketMessageListener); + this.conn.addEventListener("close", this.socketCloseListener); } } }; -