X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FHall.vue;h=22aa53e053981169373c0b9a0658de10a3976392;hb=967a2686ea801d4b33129d78087651451ef1904b;hp=89663b750f50d83a1a26dcc23f0eff2761b35915;hpb=2ada153c93cd32deb847707b60b5424aa338803d;p=vchess.git diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue index 89663b75..22aa53e0 100644 --- a/client/src/views/Hall.vue +++ b/client/src/views/Hall.vue @@ -79,9 +79,10 @@ import { checkChallenge } from "@/data/challengeCheck"; import { ArrayFun } from "@/utils/array"; import { ajax } from "@/utils/ajax"; import { getRandString, shuffle } from "@/utils/alea"; -import { extractTime } from "@/utils/timeControl"; import GameList from "@/components/GameList.vue"; import ChallengeList from "@/components/ChallengeList.vue"; +import { GameStorage } from "@/utils/gameStorage"; +import { extractTime } from "@/utils/timeControl"; export default { name: "my-hall", components: { @@ -101,7 +102,7 @@ export default { fen: "", vid: 0, nbPlayers: 0, - to: ["", "", ""], //name of challenged players + to: ["", "", ""], //name(s) of challenged player(s) timeControl: "", //"2m+2s" ...etc }, }; @@ -125,22 +126,29 @@ export default { created: function() { // Always add myself to players' list this.players.push(this.st.user); + if (this.st.user.id > 0) + { // Ask server for current corr games (all but mines) // ajax( -// "", +// "/games", // "GET", +// {excluded: this.st.user.id}, // response => { -// -// } -// ); - // // Also ask for corr challenges (all) --> + accepted status if I play -// ajax( -// "", -// "GET", -// response => { -// +// this.games = this.games.concat(response.games); // } // ); + // Also ask for corr challenges (open + sent to me) + ajax( + "/challenges", + "GET", + {uid: this.st.user.id}, + response => { + console.log(response.challenges); + // TODO: post-treatment on challenges ? + this.challenges = this.challenges.concat(response.challenges); + } + ); + } // 0.1] Ask server for room composition: const socketOpenListener = () => { this.st.conn.send(JSON.stringify({code:"pollclients"})); @@ -208,7 +216,7 @@ export default { {target: sid} ))); }; - else if (!!to[0]) + if (!!to[0]) { to.forEach(pname => { // Challenge with targeted players @@ -285,20 +293,21 @@ export default { } case "askgame": { - // Send my current live game (if any) - if (!!localStorage["gid"]) - { - const myGame = - { - // Minimal game informations: (fen+clock not required) - id: localStorage["gid"], - players: JSON.parse(localStorage["players"]), //array sid+name - vid: localStorage["vid"], - timeControl: localStorage["timeControl"], - }; - this.st.conn.send(JSON.stringify({code:"game", - game:myGame, target:data.from})); - } + // Send my current live games (if any) + // TODO: from indexedDB, through GameStorage. +// if (!!localStorage["gid"]) +// { +// const myGame = +// { +// // Minimal game informations: (fen+clock not required) +// id: localStorage["gid"], +// players: JSON.parse(localStorage["players"]), //array sid+id+name +// vname: localStorage["vname"], +// timeControl: localStorage["timeControl"], +// }; +// this.st.conn.send(JSON.stringify({code:"game", +// game:myGame, target:data.from})); +// } break; } case "identity": @@ -324,9 +333,10 @@ export default { { // Receive game from some player (+sid) // NOTE: it may be correspondance (if newgame while we are connected) + // TODO: ambiguous naming "newGame" ==> rename function ? let newGame = data.game; newGame.type = this.classifyObject(data.game); - newGame.vname = this.getVname(newGame.vid); + newGame.vname = newGame.vname; this.games.push(newGame); break; } @@ -390,8 +400,8 @@ export default { { this.players.push({name:"", id:0, sid:data.sid}); this.st.conn.send(JSON.stringify({code:"askidentity", target:data.sid})); - this.st.conn.send(JSON.stringify({code:"askchallenge", target:sid})); - this.st.conn.send(JSON.stringify({code:"askgame", target:sid})); + this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.sid})); + this.st.conn.send(JSON.stringify({code:"askgame", target:data.sid})); break; } case "disconnect": @@ -422,7 +432,7 @@ export default { if (!!error) return alert(error); const ctype = this.classifyObject(this.newchallenge); - const cto = this.newchallenge.to.slice(0, this.newchallenge.nbPlayers); + const cto = this.newchallenge.to.slice(0, this.newchallenge.nbPlayers - 1); // NOTE: "from" information is not required here let chall = { @@ -483,30 +493,38 @@ export default { // * - prepare and start new game (if challenge is full after acceptation) // * --> include challenge ID (so that opponents can delete the challenge too) clickChallenge: function(c) { - switch (c.type) + + console.log("click challenge"); + console.log(c); + + if (!!c.accepted) { - case "live": - if (!!c.accepted) - { - this.st.conn.send(JSON.stringify({code: "withdrawchallenge", - cid: c.id, target: c.from.sid})); - - break; - case "corr": + this.st.conn.send(JSON.stringify({code: "withdrawchallenge", + cid: c.id, target: c.from.sid})); + if (c.type == "corr") + { ajax( "/challenges", "PUT", {action:"withdraw", id: this.challenges[cIdx].id} ); - break; - } - c.accepted = false; - { + } + c.accepted = false; } - else if (c.from.sid == this.st.user.sid) //it's my challenge: cancel it + else if (c.from.sid == this.st.user.sid + || (this.st.user.id > 0 && c.from.id == this.st.user.id)) { + // It's my challenge: cancel it this.sendSomethingTo(c.to, "deletechallenge", {cid:c.id}); ArrayFun.remove(this.challenges, ch => ch.id == c.id); + if (c.type == "corr") + { + ajax( + "/challenges", + "DELETE", + {id: this.challenges[cIdx].id} + ); + } } else //accept (or refuse) a challenge { @@ -519,25 +537,44 @@ export default { this.st.conn.send(JSON.stringify({ code: (c.accepted ? "accept" : "refuse") + "challenge", cid: c.id, target: c.from.sid})); + if (c.type == "corr" && c.accepted) + { + ajax( + "/challenges", + "PUT", + {action: "accept", id: this.challenges[cIdx].id} + ); + } if (!c.accepted) + { ArrayFun.remove(this.challenges, ch => ch.id == c.id); + if (c.type == "corr") + { + ajax( + "/challenges", + "DELETE", + {id: this.challenges[cIdx].id} + ); + } + } } }, - // c.type == corr alors use id...sinon sid (figés) - // NOTE: only for live games ? - launchGame: function(c) { + // NOTE: for live games only (corr games are launched on server) + launchGame: async function(c) { // Just assign colors and pass the message const vname = this.getVname(c.vid); const vModule = await import("@/variants/" + vname + ".js"); window.V = vModule.VariantRules; let players = [c.from]; Array.prototype.push.apply(players, c.seats); - let gameInfo = + // These game informations will be sent to other players + const gameInfo = { + gameId: getRandString(), fen: c.fen || V.GenRandInitFen(), - // Shuffle players order (white then black then other colors). // Players' names may be required if game start when a player is offline - players: shuffle(players).map(p => {name:p.name, sid:p.sid}, + // Shuffle players order (white then black then other colors). + players: shuffle(players.map(p => { return {name:p.name, sid:p.sid} })), vid: c.vid, timeControl: c.timeControl, }; @@ -550,15 +587,32 @@ export default { ArrayFun.remove(this.challenges, ch => ch.id == c.id); this.newGame(gameInfo); //also! }, - // NOTE: for live games only (corr games are laucnhed on server) + // NOTE: for live games only (corr games are launched on server) newGame: function(gameInfo) { - // Extract times (in [milli]seconds), set clocks, store in localStorage + // Extract times (in [milli]seconds), set clocks const tc = extractTime(gameInfo.timeControl); - dddddddd - // TODO: [in game] send move + elapsed time (in milliseconds); in case of "lastate" message too - // //setStorage(game); //TODO -// if (this.settings.sound >= 1) -// new Audio("/sounds/newgame.mp3").play().catch(err => {}); + const IPlayFirst = (gameInfo.players[0].sid == this.st.user.sid); + const game = + { + // Game infos: constant + gameId: gameInfo.gameId, + vname: this.getVname(gameInfo.vid), + fenStart: gameInfo.fen, + players: gameInfo.players, + timeControl: gameInfo.timeControl, + increment: tc.increment, + mode: "live", //function for live games only + // Game state: will be updated + fen: gameInfo.fen, + moves: [], + clocks: [...Array(gameInfo.players.length)].fill(tc.mainTime), + initime: (IPlayFirst ? Date.now() : undefined), + score: "*", + }; + GameStorage.add(game); + if (this.st.settings.sound >= 1) + new Audio("/sounds/newgame.mp3").play().catch(err => {}); + // TODO: redirect to game }, }, }; @@ -567,3 +621,9 @@ export default { + +