Fix polling bug. Still multiple challenge sending issue
[vchess.git] / client / src / views / Hall.vue
index d0cfdd1..6e536ec 100644 (file)
@@ -146,10 +146,16 @@ export default {
       );
     }
     // 0.1] Ask server for room composition:
-    const socketOpenListener = () => {
+    const funcPollClients = () => {
       this.st.conn.send(JSON.stringify({code:"pollclients"}));
     };
-    this.st.conn.onopen = socketOpenListener;
+    if (!!this.st.conn && this.st.conn.readyState == 1) //1 == OPEN state
+      funcPollClients();
+    else //socket not ready yet (initial loading)
+    {
+      const socketOpenListener = funcPollClients;
+      this.st.conn.onopen = socketOpenListener;
+    }
     // TODO: is this required here?
     this.oldOnmessage = this.st.conn.onmessage || Function.prototype;
     this.st.conn.onmessage = this.socketMessageListener;
@@ -176,15 +182,12 @@ export default {
     showGame: function(g) {
       // NOTE: we are an observer, since only games I don't play are shown here
       // ==> Moves sent by connected remote player(s) if live game
-      
-// TODO: this doesn't work: choose a SID at random
-      // --> do we have players' names ?
-
-      let url = "/" + g.id;
+      let url = "/game/" + g.id;
       if (g.type == "live")
       {
-        const sids = g.players.map(p => p.sid).join(",");
-        url += "?sids=" + sids;
+        const remotes = g.players.filter(p => this.people.some(pl => pl.sid == p.sid));
+        const rIdx = (remotes.length == 1 ? 0 : Math.floor(Math.random()*2));
+        url += "?rid=" + remotes[rIdx].sid;
       }
       this.$router.push(url);
     },
@@ -277,6 +280,10 @@ export default {
               vid: c.vid,
               timeControl: c.timeControl
             };
+
+            // TODO: understand multiple (increasing) "send challenge" events.... (when potential opponent navigate Hall --> variants --> Hall)
+console.log("send challenge to " + data.from);
+
             this.st.conn.send(JSON.stringify({code:"challenge",
               chall:myChallenge, target:data.from}));
           }
@@ -311,6 +318,9 @@ export default {
         }
         case "challenge":
         {
+
+console.log(data.chall);
+
           // Receive challenge from some player (+sid)
           let newChall = data.chall;
           newChall.type = this.classifyObject(data.chall);
@@ -325,11 +335,14 @@ export default {
         {
           // Receive game from some player (+sid)
           // NOTE: it may be correspondance (if newgame while we are connected)
-          let newGame = data.game;
-          newGame.type = this.classifyObject(data.game);
-          newGame.rid = data.from;
-          newGame.score = "*";
-          this.games.push(newGame);
+          if (!this.games.some(g => g.id == data.game.id)) //ignore duplicates
+          {
+            let newGame = data.game;
+            newGame.type = this.classifyObject(data.game);
+            newGame.rid = data.from;
+            newGame.score = "*";
+            this.games.push(newGame);
+          }
           break;
         }
         case "newgame":
@@ -542,9 +555,3 @@ export default {
 <style lang="sass">
 // TODO
 </style>
-
-<!--
-// TODO:
-// Remove duplicates if several players of one game send their game info (Hall)
-// When click on it, assign a random rid among online players (max. 4).
--->