Fixes
[vchess.git] / client / src / views / Hall.vue
index bdcf84f..b364568 100644 (file)
@@ -18,7 +18,7 @@ main
               :selected="newchallenge.vid==v.id")
             | {{ v.name }}
       fieldset
-        label(for="timeControl") {{ st.tr["Time control"] }} *
+        label(for="timeControl") {{ st.tr["Cadence"] }} *
         div#predefinedTimeControls
           button 3+2
           button 5+3
@@ -136,20 +136,6 @@ export default {
     // Always add myself to players' list
     const my = this.st.user;
     this.$set(this.people, my.sid, {id:my.id, name:my.name});
-    // Retrieve live challenge (not older than 30 minute) if any:
-    const chall = JSON.parse(localStorage.getItem("challenge") || "false");
-    if (!!chall)
-    {
-      // NOTE: a challenge survives 3 minutes, for potential connection issues
-      if ((Date.now() - chall.added)/1000 <= 3*60)
-      {
-        chall.added = Date.now(); //update added time, for next disconnect...
-        this.challenges.push(chall);
-        localStorage.setItem("challenge", JSON.stringify(chall));
-      }
-      else
-        localStorage.removeItem("challenge");
-    }
     // Ask server for current corr games (all but mines)
     ajax(
       "/games",
@@ -163,7 +149,7 @@ export default {
         }));
       }
     );
-    // Also ask for corr challenges (open + sent to me)
+    // Also ask for corr challenges (open + sent by/to me)
     ajax(
       "/challenges",
       "GET",
@@ -171,24 +157,44 @@ export default {
       response => {
         // Gather all senders names, and then retrieve full identity:
         // (TODO [perf]: some might be online...)
-        const uids = response.challenges.map(c => { return c.uid });
-        ajax("/users",
-          "GET",
-          { ids: uids.join(",") },
-          response2 => {
-            let names = {};
-            response2.users.forEach(u => {names[u.id] = u.name});
-            this.challenges = this.challenges.concat(
-              response.challenges.map(c => {
-                // (just players names in fact)
-                const from = {name: names[c.uid], id: c.uid};
-                const type = this.classifyObject(c);
-                const vname = this.getVname(c.vid);
-                return Object.assign({}, c, {type: type, vname: vname, from: from});
-              })
-            )
-          }
-        );
+        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 (names !== {})
+        {
+          ajax("/users",
+            "GET",
+            { ids: Object.keys(names).join(",") },
+            response2 => {
+              response2.users.forEach(u => {names[u.id] = u.name});
+              addChallenges();
+            }
+          );
+        }
+        else
+          addChallenges();
       }
     );
     // 0.1] Ask server for room composition:
@@ -301,6 +307,8 @@ export default {
       switch (data.code)
       {
         case "duplicate":
+          this.st.conn.send(JSON.stringify({code:"duplicate", page:"/"}));
+          this.st.conn.send = () => {};
           alert(this.st.tr["Warning: multi-tabs not supported"]);
           break;
         // 0.2] Receive clients list (just socket IDs)
@@ -323,7 +331,6 @@ export default {
           this.st.conn.send(JSON.stringify({code:"askgames"}));
           break;
         case "askidentity":
-        {
           // Request for identification: reply if I'm not anonymous
           if (this.st.user.id > 0)
           {
@@ -337,9 +344,7 @@ export default {
               target:data.from}));
           }
           break;
-        }
         case "identity":
-        {
           this.$set(this.people, data.user.sid,
             {
               id: data.user.id,
@@ -347,7 +352,6 @@ export default {
               gamer: this.people[data.user.sid].gamer,
             });
           break;
-        }
         case "askchallenge":
         {
           // Send my current live challenge (if any)
@@ -384,7 +388,6 @@ export default {
           break;
         }
         case "challenge":
-        {
           // Receive challenge from some player (+sid)
           // NOTE about next condition: see "askchallenge" case.
           if (!data.chall.to || data.chall.to == this.st.user.name)
@@ -397,7 +400,6 @@ export default {
             this.challenges.push(newChall);
           }
           break;
-        }
         case "game":
         {
           // Receive game from some player (+sid)
@@ -422,7 +424,6 @@ export default {
           break;
         }
         case "newgame":
-        {
           // New game just started: data contain all information
           if (this.classifyObject(data.gameInfo) == "live")
             this.startNewGame(data.gameInfo);
@@ -436,24 +437,17 @@ export default {
             setTimeout(() => { modalBox.checked = false; }, 3000);
           }
           break;
-        }
         case "newchat":
           this.newChat = data.chat;
           break;
         case "refusechallenge":
-        {
           ArrayFun.remove(this.challenges, c => c.id == data.cid);
-          localStorage.removeItem("challenge");
           alert(this.st.tr["Challenge declined"]);
           break;
-        }
         case "deletechallenge":
-        {
           // NOTE: the challenge may be already removed
           ArrayFun.remove(this.challenges, c => c.id == data.cid);
-          localStorage.removeItem("challenge"); //in case of
           break;
-        }
         case "connect":
         case "gconnect":
           this.$set(this.people, data.from, {name:"", id:0, gamer:data.code[0]=='g'});
@@ -489,17 +483,18 @@ export default {
       this.newchallenge.to = this.people[sid].name;
       doClick("modalNewgame");
     },
-    challOrWatch: function(sid, e) {
-      switch (e.target.innerHTML)
+    challOrWatch: function(sid) {
+      if (!this.people[sid].gamer)
       {
-        case "Available":
-          this.tryChallenge(sid);
-          break;
-        case "Playing":
-          this.showGame(this.games.find(
-            g => g.players.some(pl => pl.sid == sid || pl.uid == this.people[sid].id)));
-          break;
-      };
+        // Available, in Hall
+        this.tryChallenge(sid);
+      }
+      else
+      {
+        // Playing, in Game
+        this.showGame(this.games.find(
+          g => g.players.some(pl => pl.sid == sid || pl.uid == this.people[sid].id)));
+      }
     },
     newChallenge: async function() {
       if (this.newchallenge.vid == "")
@@ -526,9 +521,9 @@ export default {
           {chall:chall}, !!warnDisconnected);
         if (!isSent)
           return;
-        // Remove old challenge if any (only one at a time):
+        // 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.type == ctype);
+          (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)
@@ -555,9 +550,7 @@ export default {
           name: this.st.user.name,
         };
         this.challenges.push(chall);
-        if (ctype == "live")
-          localStorage.setItem("challenge", JSON.stringify(chall));
-        // Also remember timeControl  + vid for quicker further challenges:
+        // Remember timeControl  + vid for quicker further challenges:
         localStorage.setItem("timeControl", chall.timeControl);
         localStorage.setItem("vid", chall.vid);
         document.getElementById("modalNewgame").checked = false;
@@ -618,8 +611,6 @@ export default {
             {id: c.id}
           );
         }
-        else //live
-          localStorage.removeItem("challenge");
         this.sendSomethingTo({name:c.to}, "deletechallenge", {cid:c.id});
       }
       // In all cases, the challenge is consumed: