Some fixes + draft newmove pingback logic (unfinished, not working)
[vchess.git] / client / src / views / Hall.vue
index 355010a..6ecc552 100644 (file)
@@ -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"] }}
@@ -89,14 +89,19 @@ main
         #players
           p(
             v-for="sid in Object.keys(people)"
-            v-if="people[sid].name"
+            v-if="!!people[sid].name"
           )
             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();
@@ -332,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)));
       }
     },
@@ -362,41 +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) {
-
-
-console.log(this.people[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
@@ -413,6 +407,15 @@ console.log(this.people[sid]);
     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;
@@ -473,7 +476,10 @@ console.log(this.people[sid]);
           // 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];
@@ -518,21 +524,19 @@ console.log(this.people[sid]);
             name: user.name,
             pages: this.people[user.sid].pages
           });
-          if (user.name) {
-            // If I multi-connect, kill current connexion if no mark (I'm older)
+          // 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;
-              }
             }
+            delete this.newConnect[user.sid];
           }
-          delete this.newConnect[user.sid];
           break;
         }
         case "askchallenge": {
@@ -636,7 +640,7 @@ console.log(this.people[sid]);
         }
         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": {
@@ -677,7 +681,7 @@ console.log(this.people[sid]);
       const vModule = await import("@/variants/" + vname + ".js");
       this.newchallenge.V = vModule.VariantRules;
       this.newchallenge.vname = vname;
-      if (cb)
+      if (!!cb)
         cb();
     },
     trySetNewchallDiag: function() {
@@ -689,7 +693,7 @@ console.log(this.people[sid]);
       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);
@@ -700,7 +704,7 @@ console.log(this.people[sid]);
       }
     },
     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...
@@ -709,7 +713,7 @@ console.log(this.people[sid]);
         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 (
@@ -803,7 +807,11 @@ console.log(this.people[sid]);
         };
         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 });
     },
@@ -819,9 +827,9 @@ console.log(this.people[sid]);
         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({
@@ -842,9 +850,8 @@ console.log(this.people[sid]);
       }
       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:
@@ -863,14 +870,9 @@ console.log(this.people[sid]);
         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