Fix challenge send+accept. Now debug game launch from server
[vchess.git] / client / src / views / Hall.vue
index c47e89f..2fbb6e6 100644 (file)
@@ -143,11 +143,45 @@ export default {
         "GET",
         {uid: this.st.user.id},
         response => {
-          console.log(response.challenges);
-          // TODO: post-treatment on challenges ?
-          Array.prototype.push.apply(this.challenges, response.challenges);
+          // 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});
+                })
+              )
+            }
+          );
         }
       );
+      // TODO: I don't like this code below; improvement?
+      let retryForVnames = setInterval(() => {
+        if (this.st.variants.length > 0) //variants array is loaded
+        {
+          if (this.games.length > 0 && this.games[0].vname == "")
+          {
+            // Fix games' vnames:
+            this.games.forEach(g => { g.vname = this.getVname(g.vid); });
+          }
+          if (this.challenges.length > 0 && this.challenges[0].vname == "")
+          {
+            // Fix challenges' vnames:
+            this.challenges.forEach(c => { c.vname = this.getVname(c.vid); });
+          }
+          clearInterval(retryForVnames);
+        }
+      }, 50);
     }
     // 0.1] Ask server for room composition:
     const funcPollClients = () => {
@@ -192,7 +226,7 @@ export default {
     // TODO: ...filter(...)[0].name, one-line, just remove this function
     getVname: function(vid) {
       const vIdx = this.st.variants.findIndex(v => v.id == vid);
-      return this.st.variants[vIdx].name;
+      return vIdx >= 0 ? this.st.variants[vIdx].name : "";
     },
     getSid: function(pname) {
       const pIdx = this.people.findIndex(pl => pl.name == pname);
@@ -443,7 +477,7 @@ export default {
         ajax(
           "/challenges",
           "POST",
-          chall,
+          { chall: chall },
           response => { finishAddChallenge(response.cid); }
         );
       }
@@ -465,7 +499,7 @@ export default {
         }
         if (c.accepted)
         {
-          c.seat = this.people[0]; //avoid sending email
+          c.seat = this.people[0]; //== this.st.user, avoid revealing email
           this.launchGame(c);
         }
         else
@@ -475,15 +509,17 @@ export default {
             cid: c.id, target: c.from.sid}));
         }
       }
-      else
-        localStorage.removeItem("challenge");
-      if (c.type == "corr")
+      else //my challenge
       {
-        ajax(
-          "/challenges",
-          "DELETE",
-          {id: c.id}
-        );
+        localStorage.removeItem("challenge");
+        if (c.type == "corr")
+        {
+          ajax(
+            "/challenges",
+            "DELETE",
+            {id: c.id}
+          );
+        }
       }
     },
     // NOTE: when launching game, the challenge is already deleted
@@ -499,8 +535,18 @@ export default {
         vid: c.vid,
         timeControl: c.timeControl,
       };
-      this.st.conn.send(JSON.stringify({code:"newgame",
-        gameInfo:gameInfo, target:c.from.sid, cid:c.id}));
+      let target = c.from.sid; //may not be defined if corr + offline opp
+      if (!target)
+      {
+        const opponent = this.people.find(p => p.id == c.from.id);
+        if (!!opponent)
+          target = opponent.sid
+      }
+      if (!!target) //opponent is online
+      {
+        this.st.conn.send(JSON.stringify({code:"newgame",
+          gameInfo:gameInfo, target:target, cid:c.id}));
+      }
       if (c.type == "live")
         this.startNewGame(gameInfo);
       else //corr: game only on server
@@ -508,9 +554,9 @@ export default {
         ajax(
           "/games",
           "POST",
-          {gameInfo: gameInfo}
+          {gameInfo: gameInfo, cid: c.id}, //cid useful to delete challenge
+          response => { this.$router.push("/game/" + response.gameId); }
         );
-        // TODO: redirection here
       }
     },
     // NOTE: for live games only (corr games start on the server)