Fix online indicators between Hall and Game pages
[vchess.git] / client / src / views / Hall.vue
index 287788a..851201f 100644 (file)
@@ -117,17 +117,21 @@ export default {
   computed: {
     uniquePlayers: function() {
       // Show e.g. "@nonymous (5)", and do nothing on click on anonymous
-      let anonymous = {id:0, name:"@nonymous", count:0};
-      let playerList = [];
+      let anonymous = {name:"@nonymous", count:0};
+      let playerList = {};
       this.people.forEach(p => {
         if (p.id > 0)
-          playerList.push(p);
+        {
+          // We don't count registered users connections: either they are here or not.
+          if (!playerList[p.id])
+            playerList[p.id] = {name: p.name, count: 0};
+        }
         else
           anonymous.count++;
       });
       if (anonymous.count > 0)
-        playerList.push(anonymous);
-      return playerList;
+        playerList[0] = anonymous;
+      return Object.values(playerList);
     },
   },
   created: function() {
@@ -317,26 +321,6 @@ export default {
           }
           break;
         }
-        case "askgame":
-        {
-          // Send my current live game (if any)
-          GameStorage.getCurrent((game) => {
-            if (!!game)
-            {
-              const myGame =
-              {
-                // Minimal game informations:
-                id: game.id,
-                players: game.players.map(p => p.name),
-                vid: game.vid,
-                timeControl: game.timeControl,
-              };
-              this.st.conn.send(JSON.stringify({code:"game",
-                game:myGame, target:data.from}));
-            }
-          });
-          break;
-        }
         case "identity":
         {
           const pIdx = this.people.findIndex(p => p.sid == data.user.sid);
@@ -404,20 +388,20 @@ export default {
         }
         case "connect":
         {
-          this.people.push({name:"", id:0, sid:data.sid});
-          this.st.conn.send(JSON.stringify({code:"askidentity", target:data.sid}));
-          this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.sid}));
-          this.st.conn.send(JSON.stringify({code:"askgame", target:data.sid}));
+          this.people.push({name:"", id:0, sid:data.from});
+          this.st.conn.send(JSON.stringify({code:"askidentity", target:data.from}));
+          this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.from}));
+          this.st.conn.send(JSON.stringify({code:"askgame", target:data.from}));
           break;
         }
         case "disconnect":
         {
-          ArrayFun.remove(this.people, p => p.sid == data.sid);
+          ArrayFun.remove(this.people, p => p.sid == data.from);
           // Also remove all challenges sent by this player:
-          ArrayFun.remove(this.challenges, c => c.from.sid == data.sid);
+          ArrayFun.remove(this.challenges, c => c.from.sid == data.from);
           // And all live games where he plays and no other opponent is online
           ArrayFun.remove(this.games, g =>
-            g.type == "live" && (g.players.every(p => p.sid == data.sid
+            g.type == "live" && (g.players.every(p => p.sid == data.from
               || !this.people.some(pl => pl.sid == p.sid))), "all");
           break;
         }
@@ -578,6 +562,15 @@ export default {
           }
         );
       }
+      // Send game info to everyone except opponent (and me)
+      this.st.conn.send(JSON.stringify({code:"game",
+        game: { //minimal game info:
+          id: gameInfo.id,
+          players: gameInfo.players.map(p => p.name),
+          vid: gameInfo.vid,
+          timeControl: gameInfo.timeControl,
+        },
+        oppsid: target}));
     },
     // NOTE: for live games only (corr games start on the server)
     startNewGame: function(gameInfo) {