Attempt to robustify identity detection at loading (no more temporary anonymous)
[vchess.git] / client / src / views / Hall.vue
index 033659b..1031e49 100644 (file)
@@ -19,7 +19,10 @@ main
       .button-group#buttonsTchall
         button.acceptBtn(@click="decisionChallenge(true)") {{ st.tr["Accept challenge?"] }}
         button.refuseBtn(@click="decisionChallenge(false)") {{ st.tr["Refuse"] }}
-  input#modalNewgame.modal(type="checkbox")
+  input#modalNewgame.modal(
+    type="checkbox"
+    @change="cadenceFocusIfOpened($event)"
+  )
   div#newgameDiv(
     role="dialog"
     data-checkbox="modalNewgame"
@@ -42,14 +45,21 @@ main
         fieldset
           label(for="cadence") {{ st.tr["Cadence"] }} *
           div#predefinedCadences
-            button(type="button") 3+2
-            button(type="button") 5+3
             button(type="button") 15+5
+            button(type="button") 45+30
+            button(type="button") 3d
+            button(type="button") 7d
           input#cadence(
             type="text"
             v-model="newchallenge.cadence"
-            placeholder="5+0, 1h+30s, 7d+1d ..."
+            placeholder="5+0, 1h+30s, 5d ..."
           )
+        fieldset
+          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"] }}
+            option(value="2") {{ st.tr["Asymmetric random"] }}
         fieldset(v-if="st.user.id > 0")
           label(for="selectPlayers") {{ st.tr["Play with?"] }}
           input#selectPlayers(
@@ -67,7 +77,7 @@ main
       button(@click="newChallenge()") {{ st.tr["Send challenge"] }}
   input#modalPeople.modal(
     type="checkbox"
-    @click="resetChatColor()"
+    @click="resetSocialColor()"
   )
   div#peopleWrap(
     role="dialog"
@@ -79,7 +89,7 @@ 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(
@@ -174,6 +184,7 @@ export default {
         vid: parseInt(localStorage.getItem("vid")) || 0,
         to: "", //name of challenged player (if any)
         cadence: localStorage.getItem("cadence") || "",
+        randomness: parseInt(localStorage.getItem("randomness")) || 2,
         // VariantRules object, stored to not interfere with
         // diagrams of targetted challenges:
         V: null,
@@ -205,7 +216,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;
     }
@@ -237,7 +249,6 @@ export default {
       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] = "";
       });
@@ -316,6 +327,10 @@ export default {
   },
   methods: {
     // Helpers:
+    cadenceFocusIfOpened: function() {
+      if (event.target.checked)
+        document.getElementById("cadence").focus();
+    },
     send: function(code, obj) {
       if (this.conn) {
         this.conn.send(JSON.stringify(Object.assign({ code: code }, obj)));
@@ -386,7 +401,7 @@ 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");
     },
@@ -405,17 +420,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;
@@ -427,20 +443,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 });
           }
@@ -479,12 +492,8 @@ export default {
         }
         case "killed":
           // I logged in elsewhere:
-          alert(this.st.tr["New connexion detected: tab now offline"]);
-          // TODO: this fails. See https://github.com/websockets/ws/issues/489
-          //this.conn.removeEventListener("message", this.socketMessageListener);
-          //this.conn.removeEventListener("close", this.socketCloseListener);
-          //this.conn.close();
           this.conn = null;
+          alert(this.st.tr["New connexion detected: tab now offline"]);
           break;
         case "askidentity": {
           // Request for identification (TODO: anonymous shouldn't need to reply)
@@ -499,6 +508,11 @@ export default {
         }
         case "identity": {
           const user = data.data;
+          this.$set(this.people, user.sid, {
+            id: user.id,
+            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 (
@@ -512,14 +526,6 @@ export default {
                 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];
           break;
@@ -538,6 +544,7 @@ export default {
               id: c.id,
               from: this.st.user.sid,
               to: c.to,
+              randomness: c.randomness,
               fen: c.fen,
               vid: c.vid,
               cadence: c.cadence,
@@ -558,6 +565,7 @@ export default {
           ) {
             let newChall = Object.assign({}, chall);
             newChall.type = this.classifyObject(chall);
+            newChall.randomness = chall.randomness;
             newChall.added = Date.now();
             let fromValues = Object.assign({}, this.people[chall.from]);
             delete fromValues["pages"]; //irrelevant in this context
@@ -716,6 +724,8 @@ export default {
       }
       // NOTE: "from" information is not required here
       let chall = Object.assign({}, this.newchallenge);
+      delete chall["V"];
+      delete chall["diag"];
       const finishAddChallenge = cid => {
         chall.id = cid || "c" + getRandString();
         // Remove old challenge if any (only one at a time of a given type):
@@ -750,7 +760,15 @@ export default {
         // Remember cadence  + vid for quicker further challenges:
         localStorage.setItem("cadence", chall.cadence);
         localStorage.setItem("vid", chall.vid);
+        localStorage.setItem("randomness", chall.randomness);
         document.getElementById("modalNewgame").checked = false;
+        // Show the challenge if not on current display
+        if (
+          (ctype == "live" && this.cdisplay == "corr") ||
+          (ctype == "corr" && this.cdisplay == "live")
+        ) {
+          this.setDisplay('c', ctype);
+        }
       };
       if (ctype == "live") {
         // Live challenges have a random ID
@@ -831,7 +849,7 @@ export default {
       // These game informations will be shared
       let gameInfo = {
         id: getRandString(),
-        fen: c.fen || V.GenRandInitFen(),
+        fen: c.fen || V.GenRandInitFen(c.randomness),
         // White player index 0, black player index 1:
         players: c.mycolor
           ? (c.mycolor == "w" ? [c.seat, c.from] : [c.from, c.seat])
@@ -885,8 +903,8 @@ export default {
       GameStorage.add(game, (err) => {
         // If an error occurred, game is not added: abort
         if (!err) {
-          if (this.st.settings.sound >= 1)
-            new Audio("/sounds/newgame.mp3").play().catch(() => {});
+          if (this.st.settings.sound)
+            new Audio("/sounds/newgame.flac").play().catch(() => {});
           this.$router.push("/game/" + gameInfo.id);
         }
       });