X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FHall.vue;h=190717d0dbe2df25c4529f597aba68565102163c;hp=6f2dfeab9b616c0a04869106e446361f1dcaa9e1;hb=6808d7a16ec1e761c6a2dffec2281c96953e4d89;hpb=ae2c49bb0bbaac3953f63be5b720e9c6835f00b6 diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue index 6f2dfeab..190717d0 100644 --- a/client/src/views/Hall.vue +++ b/client/src/views/Hall.vue @@ -91,9 +91,9 @@ export default { components: { Chat, GameList, - ChallengeList, + ChallengeList }, - data: function () { + data: function() { return { st: store.state, cdisplay: "live", //or corr @@ -106,125 +106,129 @@ export default { fen: "", vid: localStorage.getItem("vid") || "", to: "", //name of challenged player (if any) - cadence: localStorage.getItem("cadence") || "", + cadence: localStorage.getItem("cadence") || "" }, newChat: "", conn: null, connexionString: "", // Related to (killing of) self multi-connects: newConnect: {}, - killed: {}, + killed: {} }; }, watch: { // st.variants changes only once, at loading from [] to [...] - "st.variants": function(variantArray) { + "st.variants": function() { // Set potential challenges and games variant names: this.challenges.concat(this.games).forEach(o => { - if (o.vname == "") - o.vname = this.getVname(o.vid); + if (o.vname == "") o.vname = this.getVname(o.vid); }); - }, + } }, computed: { anonymousCount: function() { let count = 0; - Object.values(this.people).forEach(p => { count += (!p.name ? 1 : 0); }); + Object.values(this.people).forEach(p => { + count += !p.name ? 1 : 0; + }); return count; - }, + } }, created: function() { const my = this.st.user; - this.$set(this.people, my.sid, {id:my.id, name:my.name, pages:["/"]}); + this.$set(this.people, my.sid, { id: my.id, name: my.name, pages: ["/"] }); // Ask server for current corr games (all but mines) ajax( "/games", "GET", - {uid: this.st.user.id, excluded: true}, + { uid: this.st.user.id, excluded: true }, response => { - this.games = this.games.concat(response.games.map(g => { - const type = this.classifyObject(g); - const vname = this.getVname(g.vid); - return Object.assign({}, g, {type: type, vname: vname}); - })); + this.games = this.games.concat( + response.games.map(g => { + const type = this.classifyObject(g); + const vname = this.getVname(g.vid); + return Object.assign({}, g, { type: type, vname: vname }); + }) + ); } ); // Also ask for corr challenges (open + sent by/to me) - ajax( - "/challenges", - "GET", - {uid: this.st.user.id}, - response => { - // Gather all senders names, and then retrieve full identity: - // (TODO [perf]: some might be online...) - let names = {}; - response.challenges.forEach(c => { - if (c.uid != this.st.user.id) - names[c.uid] = ""; //unknwon for now - else if (!!c.target && c.target != this.st.user.id) - names[c.target] = ""; - }); - const addChallenges = (newChalls) => { - names[this.st.user.id] = this.st.user.name; //in case of - this.challenges = this.challenges.concat( - response.challenges.map(c => { - const from = {name: names[c.uid], id: c.uid}; //or just name - const type = this.classifyObject(c); - const vname = this.getVname(c.vid); - return Object.assign({}, - { - type: type, - vname: vname, - from: from, - to: (!!c.target ? names[c.target] : ""), - }, - c); - }) - ); - }; - if (Object.keys(names).length > 0) - { - ajax("/users", - "GET", - { ids: Object.keys(names).join(",") }, - response2 => { - response2.users.forEach(u => {names[u.id] = u.name}); - addChallenges(); - } - ); - } - else - addChallenges(); - } - ); + ajax("/challenges", "GET", { uid: this.st.user.id }, response => { + // Gather all senders names, and then retrieve full identity: + // (TODO [perf]: some might be online...) + let names = {}; + response.challenges.forEach(c => { + if (c.uid != this.st.user.id) names[c.uid] = ""; + //unknwon for now + else if (!!c.target && c.target != this.st.user.id) + names[c.target] = ""; + }); + const addChallenges = () => { + names[this.st.user.id] = this.st.user.name; //in case of + this.challenges = this.challenges.concat( + response.challenges.map(c => { + const from = { name: names[c.uid], id: c.uid }; //or just name + const type = this.classifyObject(c); + const vname = this.getVname(c.vid); + return Object.assign( + {}, + { + type: type, + vname: vname, + from: from, + to: c.target ? names[c.target] : "" + }, + c + ); + }) + ); + }; + if (Object.keys(names).length > 0) { + ajax( + "/users", + "GET", + { ids: Object.keys(names).join(",") }, + response2 => { + response2.users.forEach(u => { + names[u.id] = u.name; + }); + addChallenges(); + } + ); + } else addChallenges(); + }); const connectAndPoll = () => { this.send("connect"); this.send("pollclientsandgamers"); }; // Initialize connection - this.connexionString = params.socketUrl + - "/?sid=" + this.st.user.sid + - "&tmpId=" + getRandString() + - "&page=" + encodeURIComponent(this.$route.path); + this.connexionString = + params.socketUrl + + "/?sid=" + + this.st.user.sid + + "&tmpId=" + + getRandString() + + "&page=" + + encodeURIComponent(this.$route.path); this.conn = new WebSocket(this.connexionString); this.conn.onopen = connectAndPoll; this.conn.onmessage = this.socketMessageListener; this.conn.onclose = this.socketCloseListener; }, mounted: function() { - ["peopleWrap","infoDiv","newgameDiv"].forEach(eltName => { + ["peopleWrap", "infoDiv", "newgameDiv"].forEach(eltName => { let elt = document.getElementById(eltName); elt.addEventListener("click", processModalClick); }); - document.querySelectorAll("#predefinedCadences > button").forEach( - (b) => { b.addEventListener("click", - () => { this.newchallenge.cadence = b.innerHTML; } - )} - ); + document.querySelectorAll("#predefinedCadences > button").forEach(b => { + b.addEventListener("click", () => { + this.newchallenge.cadence = b.innerHTML; + }); + }); const showCtype = localStorage.getItem("type-challenges") || "live"; const showGtype = localStorage.getItem("type-games") || "live"; - this.setDisplay('c', showCtype); - this.setDisplay('g', showGtype); + this.setDisplay("c", showCtype); + this.setDisplay("g", showGtype); }, beforeDestroy: function() { this.send("disconnect"); @@ -232,20 +236,14 @@ export default { methods: { // Helpers: send: function(code, obj) { - if (!!this.conn) - { - this.conn.send(JSON.stringify( - Object.assign( - {code: code}, - obj, - ) - )); + if (this.conn) { + this.conn.send(JSON.stringify(Object.assign({ code: code }, obj))); } }, getVname: function(vid) { const variant = this.st.variants.find(v => v.id == vid); // this.st.variants might be uninitialized (variant == null) - return (!!variant ? variant.name : ""); + return variant ? variant.name : ""; }, filterChallenges: function(type) { return this.challenges.filter(c => c.type == type); @@ -253,21 +251,24 @@ export default { filterGames: function(type) { return this.games.filter(g => g.type == type); }, - classifyObject: function(o) { //challenge or game - return (o.cadence.indexOf('d') === -1 ? "live" : "corr"); + classifyObject: function(o) { + //challenge or game + return o.cadence.indexOf("d") === -1 ? "live" : "corr"; }, setDisplay: function(letter, type, e) { this[letter + "display"] = type; - localStorage.setItem("type-" + (letter == 'c' ? "challenges" : "games"), type); - let elt = !!e + localStorage.setItem( + "type-" + (letter == "c" ? "challenges" : "games"), + type + ); + let elt = e ? e.target : document.getElementById("btn" + letter.toUpperCase() + type); elt.classList.add("active"); elt.classList.remove("somethingnew"); //in case of - if (!!elt.previousElementSibling) + if (elt.previousElementSibling) elt.previousElementSibling.classList.remove("active"); - else - elt.nextElementSibling.classList.remove("active"); + else elt.nextElementSibling.classList.remove("active"); }, isGamer: function(sid) { return this.people[sid].pages.some(p => p.indexOf("/game/") >= 0); @@ -278,21 +279,17 @@ export default { : "Observe"; }, challOrWatch: function(sid) { - if (this.people[sid].pages.some(p => p == "/")) - { + if (this.people[sid].pages.some(p => p == "/")) { // Available, in Hall this.newchallenge.to = this.people[sid].name; document.getElementById("modalPeople").checked = false; - doClick("modalNewgame"); - } - else - { + window.doClick("modalNewgame"); + } else { // In some game, maybe playing maybe not: show a random one let gids = []; this.people[sid].pages.forEach(p => { const matchGid = p.match(/[a-zA-Z0-9]+$/); - if (!!matchGid) - gids.push(matchGid[0]); + if (matchGid) gids.push(matchGid[0]); }); const gid = gids[Math.floor(Math.random() * gids.length)]; this.showGame(this.games.find(g => g.id == gid)); @@ -311,90 +308,82 @@ export default { document.getElementById("peopleBtn").classList.remove("somethingnew"); }, processChat: function(chat) { - this.send("newchat", {data:chat}); + this.send("newchat", { data: chat }); }, // Messaging center: socketMessageListener: function(msg) { - if (!this.conn) - return; + if (!this.conn) return; const data = JSON.parse(msg.data); - switch (data.code) - { - case "pollclientsandgamers": - { + switch (data.code) { + case "pollclientsandgamers": { // Since people can be both in Hall and Game, // need to track "askIdentity" requests: let identityAsked = {}; data.sockIds.forEach(s => { const page = s.page || "/"; - if (s.sid != this.st.user.sid && !identityAsked[s.sid]) - { + if (s.sid != this.st.user.sid && !identityAsked[s.sid]) { identityAsked[s.sid] = true; - this.send("askidentity", {target:s.sid, page:page}); + this.send("askidentity", { target: s.sid, page: page }); } if (!this.people[s.sid]) - this.$set(this.people, s.sid, {id:0, name:"", pages:[page]}); + this.$set(this.people, s.sid, { id: 0, name: "", pages: [page] }); else if (this.people[s.sid].pages.indexOf(page) < 0) this.people[s.sid].pages.push(page); - if (!s.page) //peer is in Hall - this.send("askchallenge", {target:s.sid}); - else //peer is in Game - this.send("askgame", {target:s.sid, page:page}); + if (!s.page) + //peer is in Hall + this.send("askchallenge", { target: s.sid }); + //peer is in Game + else this.send("askgame", { target: s.sid, page: page }); }); break; } case "connect": - case "gconnect": - { + case "gconnect": { const page = data.page || "/"; // NOTE: player could have been polled earlier, but might have logged in then // So it's a good idea to ask identity if he was anonymous. // But only ask game / challenge if currently disconnected. - if (!this.people[data.from]) - { - this.$set(this.people, data.from, {name:"", id:0, pages:[page]}); + if (!this.people[data.from]) { + this.$set(this.people, data.from, { + name: "", + id: 0, + pages: [page] + }); if (data.code == "connect") - this.send("askchallenge", {target:data.from}); - else - this.send("askgame", {target:data.from, page:page}); - } - else - { + this.send("askchallenge", { target: data.from }); + else this.send("askgame", { target: data.from, page: page }); + } else { // append page if not already in list if (this.people[data.from].pages.indexOf(page) < 0) this.people[data.from].pages.push(page); } - if (this.people[data.from].id == 0) - { + if (this.people[data.from].id == 0) { this.newConnect[data.from] = true; //for self multi-connects tests - this.send("askidentity", {target:data.from, page:page}); + this.send("askidentity", { target: data.from, page: page }); } break; } case "disconnect": - case "gdisconnect": + case "gdisconnect": { // If the user reloads the page twice very quickly (experienced with Firefox), // the first reload won't have time to connect but will trigger a "close" event anyway. // ==> Next check is required. - if (!this.people[data.from]) - return; + if (!this.people[data.from]) return; // Disconnect means no more tmpIds: - if (data.code == "disconnect") - { + if (data.code == "disconnect") { // Remove the live challenge sent by this player: ArrayFun.remove(this.challenges, c => c.from.sid == data.from); - } - else - { + } else { // Remove the matching live game if now unreachable const gid = data.page.match(/[a-zA-Z0-9]+$/)[0]; const gidx = this.games.findIndex(g => g.id == gid); - if (gidx >= 0) - { + if (gidx >= 0) { const game = this.games[gidx]; - if (game.type == "live" && - game.rids.length == 1 && game.rids[0] == data.from) - { + if ( + game.type == "live" && + game.rids.length == 1 && + game.rids[0] == data.from + ) { this.games.splice(gidx, 1); } } @@ -404,6 +393,7 @@ export default { if (this.people[data.from].pages.length == 0) this.$delete(this.people, data.from); break; + } case "killed": // I logged in elsewhere: alert(this.st.tr["New connexion detected: tab now offline"]); @@ -413,157 +403,156 @@ export default { //this.conn.close(); this.conn = null; break; - case "askidentity": - { + case "askidentity": { // Request for identification (TODO: anonymous shouldn't need to reply) const me = { // Decompose to avoid revealing email name: this.st.user.name, sid: this.st.user.sid, - id: this.st.user.id, + id: this.st.user.id }; - this.send("identity", {data:me, target:data.from}); + this.send("identity", { data: me, target: data.from }); break; } - case "identity": - { + case "identity": { const user = data.data; - if (!!user.name) //otherwise anonymous - { + if (user.name) { + //otherwise anonymous // If I multi-connect, kill current connexion if no mark (I'm older) - if (this.newConnect[user.sid] && user.id > 0 - && user.id == this.st.user.id && user.sid != this.st.user.sid) - { - if (!this.killed[this.st.user.sid]) - { - this.send("killme", {sid:this.st.user.sid}); + if ( + this.newConnect[user.sid] && + user.id > 0 && + user.id == this.st.user.id && + user.sid != this.st.user.sid + ) { + if (!this.killed[this.st.user.sid]) { + this.send("killme", { sid: this.st.user.sid }); this.killed[this.st.user.sid] = true; } } - if (user.sid != this.st.user.sid) //I already know my identity... - { - this.$set(this.people, user.sid, - { - id: user.id, - name: user.name, - pages: this.people[user.sid].pages, - }); + if (user.sid != this.st.user.sid) { + //I already know my identity... + this.$set(this.people, user.sid, { + id: user.id, + name: user.name, + pages: this.people[user.sid].pages + }); } } delete this.newConnect[user.sid]; break; } - case "askchallenge": - { + case "askchallenge": { // Send my current live challenge (if any) - const cIdx = this.challenges.findIndex(c => - c.from.sid == this.st.user.sid && c.type == "live"); - if (cIdx >= 0) - { + const cIdx = this.challenges.findIndex( + c => c.from.sid == this.st.user.sid && c.type == "live" + ); + if (cIdx >= 0) { const c = this.challenges[cIdx]; // NOTE: in principle, should only send targeted challenge to the target. // But we may not know yet the identity of the target (just name), // so cannot decide if data.from is the target or not. - const myChallenge = - { + const myChallenge = { id: c.id, from: this.st.user.sid, to: c.to, fen: c.fen, vid: c.vid, cadence: c.cadence, - added: c.added, + added: c.added }; - this.send("challenge", {data:myChallenge, target:data.from}); + this.send("challenge", { data: myChallenge, target: data.from }); } break; } case "challenge": //after "askchallenge" - case "newchallenge": - { + case "newchallenge": { // NOTE about next condition: see "askchallenge" case. const chall = data.data; - if (!chall.to || (this.people[chall.from].id > 0 && - (chall.from == this.st.user.sid || chall.to == this.st.user.name))) - { + if ( + !chall.to || + (this.people[chall.from].id > 0 && + (chall.from == this.st.user.sid || chall.to == this.st.user.name)) + ) { let newChall = Object.assign({}, chall); newChall.type = this.classifyObject(chall); newChall.added = Date.now(); let fromValues = Object.assign({}, this.people[chall.from]); delete fromValues["pages"]; //irrelevant in this context - newChall.from = Object.assign({sid:chall.from}, fromValues); + newChall.from = Object.assign({ sid: chall.from }, fromValues); newChall.vname = this.getVname(newChall.vid); this.challenges.push(newChall); - if ((newChall.type == "live" && this.cdisplay == "corr") || - (newChall.type == "corr" && this.cdisplay == "live")) - { - document.getElementById("btnC" + newChall.type).classList.add("somethingnew"); + if ( + (newChall.type == "live" && this.cdisplay == "corr") || + (newChall.type == "corr" && this.cdisplay == "live") + ) { + document + .getElementById("btnC" + newChall.type) + .classList.add("somethingnew"); } } break; } - case "refusechallenge": - { + case "refusechallenge": { const cid = data.data; ArrayFun.remove(this.challenges, c => c.id == cid); alert(this.st.tr["Challenge declined"]); break; } - case "deletechallenge": - { + case "deletechallenge": { // NOTE: the challenge may be already removed const cid = data.data; ArrayFun.remove(this.challenges, c => c.id == cid); break; } case "game": //individual request - case "newgame": - { + case "newgame": { // NOTE: it may be live or correspondance const game = data.data; let locGame = this.games.find(g => g.id == game.id); - if (!locGame) - { + if (!locGame) { let newGame = game; newGame.type = this.classifyObject(game); newGame.vname = this.getVname(game.vid); - if (!game.score) //if new game from Hall + if (!game.score) + //if new game from Hall newGame.score = "*"; newGame.rids = [game.rid]; delete newGame["rid"]; this.games.push(newGame); - if ((newGame.type == "live" && this.gdisplay == "corr") || - (newGame.type == "corr" && this.gdisplay == "live")) - { - document.getElementById("btnG" + newGame.type).classList.add("somethingnew"); + if ( + (newGame.type == "live" && this.gdisplay == "corr") || + (newGame.type == "corr" && this.gdisplay == "live") + ) { + document + .getElementById("btnG" + newGame.type) + .classList.add("somethingnew"); } - } - else - { + } else { // Append rid (if not already in list) - if (!locGame.rids.includes(game.rid)) - locGame.rids.push(game.rid); + if (!locGame.rids.includes(game.rid)) locGame.rids.push(game.rid); } break; } - case "result": - { + case "result": { let g = this.games.find(g => g.id == data.gid); - if (!!g) - g.score = data.score; + if (g) g.score = data.score; break; } - case "startgame": - { + case "startgame": { // New game just started: data contain all information const gameInfo = data.data; if (this.classifyObject(gameInfo) == "live") this.startNewGame(gameInfo); - else - { - this.infoMessage = this.st.tr["New correspondance game:"] + - " " + - "#/game/" + gameInfo.id + ""; + else { + this.infoMessage = + this.st.tr["New correspondance game:"] + + " " + + "#/game/" + + gameInfo.id + + ""; let modalBox = document.getElementById("modalInfo"); modalBox.checked = true; } @@ -577,56 +566,62 @@ export default { } }, socketCloseListener: function() { - if (!this.conn) - return; + if (!this.conn) return; this.conn = new WebSocket(this.connexionString); this.conn.addEventListener("message", this.socketMessageListener); this.conn.addEventListener("close", this.socketCloseListener); }, // Challenge lifecycle: newChallenge: async function() { + let error = ""; if (this.newchallenge.vid == "") - return alert(this.st.tr["Please select a variant"]); - if (!!this.newchallenge.to && this.newchallenge.to == this.st.user.name) - return alert(this.st.tr["Self-challenge is forbidden"]); + error = this.st.tr["Please select a variant"]; + else if (!!this.newchallenge.to && this.newchallenge.to == this.st.user.name) + error = this.st.tr["Self-challenge is forbidden"]; + if (error) { + alert(error); + return; + } const vname = this.getVname(this.newchallenge.vid); const vModule = await import("@/variants/" + vname + ".js"); window.V = vModule.VariantRules; - if (!!this.newchallenge.cadence.match(/^[0-9]+$/)) + if (this.newchallenge.cadence.match(/^[0-9]+$/)) this.newchallenge.cadence += "+0"; //assume minutes, no increment - const error = checkChallenge(this.newchallenge); - if (!!error) - return alert(error); const ctype = this.classifyObject(this.newchallenge); - if (ctype == "corr" && this.st.user.id <= 0) - return alert(this.st.tr["Please log in to play correspondance games"]); + error = checkChallenge(this.newchallenge); + if (!error && ctype == "corr" && this.st.user.id <= 0) + error = this.st.tr["Please log in to play correspondance games"]; + if (error) { + alert(error); + return; + } // NOTE: "from" information is not required here let chall = Object.assign({}, this.newchallenge); - const finishAddChallenge = (cid) => { + const finishAddChallenge = cid => { chall.id = cid || "c" + getRandString(); // Remove old challenge if any (only one at a time of a given type): - const cIdx = this.challenges.findIndex(c => - (c.from.sid == this.st.user.sid || c.from.id == this.st.user.id) && c.type == ctype); - if (cIdx >= 0) - { + const cIdx = this.challenges.findIndex( + c => + (c.from.sid == this.st.user.sid || c.from.id == this.st.user.id) && + c.type == ctype + ); + if (cIdx >= 0) { // Delete current challenge (will be replaced now) - this.send("deletechallenge", {data:this.challenges[cIdx].id}); - if (ctype == "corr") - { - ajax( - "/challenges", - "DELETE", - {id: this.challenges[cIdx].id} - ); + this.send("deletechallenge", { data: this.challenges[cIdx].id }); + if (ctype == "corr") { + ajax("/challenges", "DELETE", { id: this.challenges[cIdx].id }); } this.challenges.splice(cIdx, 1); } - this.send("newchallenge", {data:Object.assign({from:this.st.user.sid}, chall)}); + this.send("newchallenge", { + data: Object.assign({ from: this.st.user.sid }, chall) + }); // Add new challenge: - chall.from = { //decompose to avoid revealing email + chall.from = { + //decompose to avoid revealing email sid: this.st.user.sid, id: this.st.user.id, - name: this.st.user.name, + name: this.st.user.name }; chall.added = Date.now(); // NOTE: vname and type are redundant (can be deduced from cadence + vid) @@ -638,61 +633,49 @@ export default { localStorage.setItem("vid", chall.vid); document.getElementById("modalNewgame").checked = false; }; - if (ctype == "live") - { + if (ctype == "live") { // Live challenges have a random ID finishAddChallenge(null); - } - else - { + } else { // Correspondance game: send challenge to server - ajax( - "/challenges", - "POST", - { chall: chall }, - response => { finishAddChallenge(response.cid); } - ); + ajax("/challenges", "POST", { chall: chall }, response => { + finishAddChallenge(response.cid); + }); } }, clickChallenge: function(c) { - const myChallenge = (c.from.sid == this.st.user.sid //live - || (this.st.user.id > 0 && c.from.id == this.st.user.id)); //corr - if (!myChallenge) - { - if (c.type == "corr" && this.st.user.id <= 0) - return alert(this.st.tr["Please log in to accept corr challenges"]); + const myChallenge = + c.from.sid == this.st.user.sid || //live + (this.st.user.id > 0 && c.from.id == this.st.user.id); //corr + if (!myChallenge) { + if (c.type == "corr" && this.st.user.id <= 0) { + alert(this.st.tr["Please log in to accept corr challenges"]); + return; + } c.accepted = true; - if (!!c.to) //c.to == this.st.user.name (connected) - { + if (c.to) { + //c.to == this.st.user.name (connected) // TODO: if special FEN, show diagram after loading variant c.accepted = confirm("Accept challenge?"); } - if (c.accepted) - { - c.seat = { //again, avoid c.seat = st.user to not reveal email + if (c.accepted) { + c.seat = { + //again, avoid c.seat = st.user to not reveal email sid: this.st.user.sid, id: this.st.user.id, - name: this.st.user.name, + name: this.st.user.name }; this.launchGame(c); + } else { + this.send("refusechallenge", { data: c.id, target: c.from.sid }); } - else - { - this.send("refusechallenge", {data:c.id, target:c.from.sid}); + this.send("deletechallenge", { data: c.id }); + } //my challenge + else { + if (c.type == "corr") { + ajax("/challenges", "DELETE", { id: c.id }); } - this.send("deletechallenge", {data:c.id}); - } - else //my challenge - { - if (c.type == "corr") - { - ajax( - "/challenges", - "DELETE", - {id: c.id} - ); - } - this.send("deletechallenge", {data:c.id}); + this.send("deletechallenge", { data: c.id }); } // In all cases, the challenge is consumed: ArrayFun.remove(this.challenges, ch => ch.id == c.id); @@ -702,37 +685,35 @@ export default { const vModule = await import("@/variants/" + c.vname + ".js"); window.V = vModule.VariantRules; // These game informations will be shared - let gameInfo = - { + let gameInfo = { id: getRandString(), fen: c.fen || V.GenRandInitFen(), players: shuffle([c.from, c.seat]), //white then black vid: c.vid, - cadence: c.cadence, + cadence: c.cadence }; let oppsid = c.from.sid; //may not be defined if corr + offline opp - if (!oppsid) - { - oppsid = Object.keys(this.people).find(sid => - this.people[sid].id == c.from.id); + if (!oppsid) { + oppsid = Object.keys(this.people).find( + sid => this.people[sid].id == c.from.id + ); } const notifyNewgame = () => { - if (!!oppsid) //opponent is online - this.send("startgame", {data:gameInfo, target:oppsid}); + if (oppsid) + //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}); + this.send("newgame", { data: gameInfo }); }; - if (c.type == "live") - { + if (c.type == "live") { notifyNewgame(); this.startNewGame(gameInfo); - } - else //corr: game only on server - { + } //corr: game only on server + else { ajax( "/games", "POST", - {gameInfo: gameInfo, cid: c.id}, //cid useful to delete challenge + { gameInfo: gameInfo, cid: c.id }, //cid useful to delete challenge response => { gameInfo.id = response.gameId; notifyNewgame(); @@ -752,14 +733,14 @@ export default { moves: [], clocks: [-1, -1], //-1 = unstarted initime: [0, 0], //initialized later - score: "*", + score: "*" }); GameStorage.add(game); if (this.st.settings.sound >= 1) - new Audio("/sounds/newgame.mp3").play().catch(err => {}); + new Audio("/sounds/newgame.mp3").play().catch(() => {}); this.$router.push("/game/" + gameInfo.id); - }, - }, + } + } };