X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FMyGames.vue;h=953c976eb9e1f0a89f68961a664da77815816f7d;hb=2a8a94c9e539319c76c0a72967b39f2e7e7b279e;hp=5148c3cfd00ab5f21445fecec10d1b673c74cb83;hpb=e57c4de4148d43e7635e09adcde4e56585aea303;p=vchess.git diff --git a/client/src/views/MyGames.vue b/client/src/views/MyGames.vue index 5148c3cf..953c976e 100644 --- a/client/src/views/MyGames.vue +++ b/client/src/views/MyGames.vue @@ -74,6 +74,8 @@ export default { params.socketUrl + "/?sid=" + this.st.user.sid + + "&id=" + + this.st.user.id + "&tmpId=" + getRandString() + "&page=" + @@ -100,9 +102,65 @@ 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"; + 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); + 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: "*", + turn: "w" + }, + gameInfo + ); + // TODO: the new game isn't sorted. Maybe apply a different strategy: + // 1) Sort all at loading, + // 2) Insert in place when new games arrive, + // 3) Change position when score or turn change. + // And GameList just show list unsorted. + this[type + "Games"].unshift(game); + this.tryShowNewsIndicator(type); + break; + } + } + }, + socketCloseListener: function() { + 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 @@ -113,6 +171,7 @@ export default { g.players[0].sid == this.st.user.sid ? "w" : "b"; + if (!!g.turn) return g.turn == myColor; const rem = g.movesCount % 2; return ( (rem == 0 && myColor == "w") || @@ -170,30 +229,6 @@ export default { } ); } - }, - 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); } } };