X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fviews%2FHall.vue;h=6ecc55270faa85982bab4f771506b087b49abf92;hb=f9c36b2da005b596ad656f4b6cc4e09ef3c656f1;hp=469d46b242f4da82d1f711e16924a1260463fcf7;hpb=7ba4a5bc5b64e19a1e7f26aa232d5c50770d07ad;p=vchess.git diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue index 469d46b2..6ecc5527 100644 --- a/client/src/views/Hall.vue +++ b/client/src/views/Hall.vue @@ -55,7 +55,7 @@ main placeholder="5+0, 1h+30s, 5d ..." ) fieldset - label(for="selectRandomLevel") {{ st.tr["Randomness"] }} + label(for="selectRandomLevel") {{ st.tr["Randomness"] }} * select#selectRandomLevel(v-model="newchallenge.randomness") option(value="0") {{ st.tr["Deterministic"] }} option(value="1") {{ st.tr["Symmetric random"] }} @@ -77,7 +77,7 @@ main button(@click="newChallenge()") {{ st.tr["Send challenge"] }} input#modalPeople.modal( type="checkbox" - @click="resetChatColor()" + @click="resetSocialColor()" ) div#peopleWrap( role="dialog" @@ -93,10 +93,15 @@ main ) span {{ people[sid].name }} button.player-action( - v-if="isGamer(sid) || (st.user.id > 0 && sid!=st.user.sid)" - @click="challOrWatch(sid)" + v-if="isGamer(sid)" + @click="watchGame(sid)" ) - | {{ getActionLabel(sid) }} + | {{ st.tr["Observe"] }} + button.player-action( + v-else-if="st.user.id > 0 && sid != st.user.sid" + @click="challenge(sid)" + ) + | {{ st.tr["Challenge"] }} p.anonymous @nonymous ({{ anonymousCount }}) #chat Chat( @@ -206,7 +211,7 @@ export default { "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); }); if (!this.newchallenge.V && this.newchallenge.vid > 0) this.loadNewchallVariant(); @@ -216,7 +221,8 @@ export default { anonymousCount: function() { let count = 0; Object.values(this.people).forEach(p => { - count += !p.name ? 1 : 0; + // Do not cound people who did not send their identity yet: + count += (!p.name && p.id === 0) ? 1 : 0; }); return count; } @@ -331,7 +337,7 @@ export default { document.getElementById("cadence").focus(); }, send: function(code, obj) { - if (this.conn) { + if (!!this.conn) { this.conn.send(JSON.stringify(Object.assign({ code: code }, obj))); } }, @@ -361,36 +367,30 @@ export default { : 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"); }, isGamer: function(sid) { return this.people[sid].pages.some(p => p.indexOf("/game/") >= 0); }, - getActionLabel: function(sid) { - return this.people[sid].pages.some(p => p == "/") - ? "Challenge" - : "Observe"; + challenge: function(sid) { + // Available, in Hall (only) + this.newchallenge.to = this.people[sid].name; + document.getElementById("modalPeople").checked = false; + window.doClick("modalNewgame"); }, - challOrWatch: function(sid) { - if (this.people[sid].pages.some(p => p == "/")) { - // Available, in Hall - this.newchallenge.to = this.people[sid].name; - document.getElementById("modalPeople").checked = false; - 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]); - }); - const gid = gids[Math.floor(Math.random() * gids.length)]; - const game = this.games.find(g => g.id == gid); - if (game) this.showGame(game); - else this.$router.push("/game/" + gid); //game vs. me - } + watchGame: function(sid) { + // 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]); + }); + const gid = gids[Math.floor(Math.random() * gids.length)]; + const game = this.games.find(g => g.id == gid); + if (!!game) this.showGame(game); + else this.$router.push("/game/" + gid); //game vs. me }, showGame: function(g) { // NOTE: we are an observer, since only games I don't play are shown here @@ -400,13 +400,22 @@ export default { url += "?rid=" + g.rids[Math.floor(Math.random() * g.rids.length)]; this.$router.push(url); }, - resetChatColor: function() { + resetSocialColor: function() { // TODO: this is called twice, once on opening an once on closing document.getElementById("peopleBtn").classList.remove("somethingnew"); }, processChat: function(chat) { this.send("newchat", { data: chat }); }, + getOppsid: function(c) { + 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 + ); + } + return oppsid; + }, // Messaging center: socketMessageListener: function(msg) { if (!this.conn) return; @@ -419,17 +428,18 @@ export default { data.sockIds.forEach(s => { const page = s.page || "/"; if (s.sid != this.st.user.sid && !identityAsked[s.sid]) { - identityAsked[s.sid] = true; this.send("askidentity", { target: s.sid, page: page }); + identityAsked[s.sid] = true; } if (!this.people[s.sid]) - this.$set(this.people, s.sid, { id: 0, name: "", pages: [page] }); + // Do not set name or id: identity unknown yet + this.$set(this.people, s.sid, { 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 + // Peer is in Hall this.send("askchallenge", { target: s.sid }); - //peer is in Game + // Peer is in Game else this.send("askgame", { target: s.sid, page: page }); }); break; @@ -441,20 +451,17 @@ export default { // 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] - }); + this.$set(this.people, data.from, { pages: [page] }); if (data.code == "connect") this.send("askchallenge", { target: data.from }); else this.send("askgame", { target: data.from, page: page }); } else { - // append page if not already in list + // 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].name && this.people[data.from].id !== 0) { + // Identity not known yet this.newConnect[data.from] = true; //for self multi-connects tests this.send("askidentity", { target: data.from, page: page }); } @@ -469,7 +476,10 @@ export default { // Disconnect means no more tmpIds: if (data.code == "disconnect") { // Remove the live challenge sent by this player: - ArrayFun.remove(this.challenges, c => c.from.sid == data.from); + ArrayFun.remove( + this.challenges, + c => c.type == "live" && c.from.sid == data.from + ); } else { // Remove the matching live game if now unreachable const gid = data.page.match(/[a-zA-Z0-9]+$/)[0]; @@ -509,29 +519,24 @@ export default { } case "identity": { const user = data.data; - if (user.name) { - // If I multi-connect, kill current connexion if no mark (I'm older) + this.$set(this.people, user.sid, { + id: user.id, + name: user.name, + pages: this.people[user.sid].pages + }); + // If I multi-connect, kill current connexion if no mark (I'm older) + if (this.newConnect[user.sid]) { if ( - this.newConnect[user.sid] && user.id > 0 && user.id == this.st.user.id && - user.sid != this.st.user.sid + user.sid != this.st.user.sid && + !this.killed[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 - }); } + delete this.newConnect[user.sid]; } - delete this.newConnect[user.sid]; break; } case "askchallenge": { @@ -604,7 +609,8 @@ export default { // NOTE: it may be live or correspondance const game = data.data; // Ignore games where I play (corr games) - if (game.players.every(p => p.id != this.st.user.id)) + if (game.players.every(p => + p.sid != this.st.user.sid || p.id != this.st.user.id)) { let locGame = this.games.find(g => g.id == game.id); if (!locGame) { @@ -634,7 +640,7 @@ export default { } 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": { @@ -675,7 +681,7 @@ export default { const vModule = await import("@/variants/" + vname + ".js"); this.newchallenge.V = vModule.VariantRules; this.newchallenge.vname = vname; - if (cb) + if (!!cb) cb(); }, trySetNewchallDiag: function() { @@ -687,7 +693,7 @@ export default { window.V = this.newchallenge.V; if ( this.newchallenge.vid > 0 && - this.newchallenge.fen && + !!this.newchallenge.fen && V.IsGoodFen(this.newchallenge.fen) ) { const parsedFen = V.ParseFen(this.newchallenge.fen); @@ -698,7 +704,7 @@ export default { } }, newChallenge: async function() { - if (this.newchallenge.cadence.match(/^[0-9]+$/)) + if (!!(this.newchallenge.cadence.match(/^[0-9]+$/))) this.newchallenge.cadence += "+0"; //assume minutes, no increment const ctype = this.classifyObject(this.newchallenge); // TODO: cadence still unchecked so ctype could be wrong... @@ -707,7 +713,7 @@ export default { error = this.st.tr["Please select a variant"]; else if (ctype == "corr" && this.st.user.id <= 0) error = this.st.tr["Please log in to play correspondance games"]; - else if (this.newchallenge.to) { + else if (!!this.newchallenge.to) { if (this.newchallenge.to == this.st.user.name) error = this.st.tr["Self-challenge is forbidden"]; else if ( @@ -801,7 +807,11 @@ export default { }; this.launchGame(c); } else { - this.send("refusechallenge", { data: c.id, target: c.from.sid }); + const oppsid = this.getOppsid(c); + if (!!oppsid) + this.send("refusechallenge", { data: c.id, target: oppsid }); + if (c.type == "corr") + ajax("/challenges", "DELETE", { id: c.id }); } this.send("deletechallenge", { data: c.id }); }, @@ -817,9 +827,9 @@ export default { c.accepted = true; const vModule = await import("@/variants/" + c.vname + ".js"); window.V = vModule.VariantRules; - if (c.to) { + if (!!c.to) { // c.to == this.st.user.name (connected) - if (c.fen) { + if (!!c.fen) { const parsedFen = V.ParseFen(c.fen); c.mycolor = V.GetOppCol(parsedFen.turn); this.tchallDiag = getDiagram({ @@ -840,9 +850,8 @@ export default { } else { // My challenge - if (c.type == "corr") { + if (c.type == "corr") ajax("/challenges", "DELETE", { id: c.id }); - } this.send("deletechallenge", { data: c.id }); } // In all cases, the challenge is consumed: @@ -861,14 +870,9 @@ export default { vid: c.vid, 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 - ); - } const notifyNewgame = () => { - if (oppsid) + const oppsid = this.getOppsid(c); + 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