Some fixes. TODO: check clocks update, and continue work on resign/abort/draw
[vchess.git] / client / src / views / Hall.vue
index b2ab334..22aa53e 100644 (file)
@@ -79,9 +79,10 @@ import { checkChallenge } from "@/data/challengeCheck";
 import { ArrayFun } from "@/utils/array";
 import { ajax } from "@/utils/ajax";
 import { getRandString, shuffle } from "@/utils/alea";
-import { extractTime } from "@/utils/timeControl";
 import GameList from "@/components/GameList.vue";
 import ChallengeList from "@/components/ChallengeList.vue";
+import { GameStorage } from "@/utils/gameStorage";
+import { extractTime } from "@/utils/timeControl";
 export default {
   name: "my-hall",
   components: {
@@ -101,7 +102,7 @@ export default {
         fen: "",
         vid: 0,
         nbPlayers: 0,
-        to: ["", "", ""], //name of challenged players
+        to: ["", "", ""], //name(s) of challenged player(s)
         timeControl: "", //"2m+2s" ...etc
       },
     };
@@ -122,37 +123,32 @@ export default {
       return playerList;
     },
   },
-  watch: {
-    // Watch event "user infos retrieved" (through /whoami)
-    "st.user.id": function(newId) {
-      if (newId > 0) //should always be the case
-      {
-      // Ask server for current corr games (all but mines)
-  //    ajax(
-  //      "/games",
-  //      "GET",
-  //      {excluded: this.st.user.id},
-  //      response => {
-  //        this.games = this.games.concat(response.games);
-  //      }
-  //    );
-      // Also ask for corr challenges (open + sent to me)
-        ajax(
-          "/challenges",
-          "GET",
-          {uid: this.st.user.id},
-          response => {
-            console.log(response.challenges);
-            // TODO: post-treatment on challenges ?
-            this.challenges = this.challenges.concat(response.challenges);
-          }
-        );
-      }
-    },
-  },
   created: function() {
     // Always add myself to players' list
     this.players.push(this.st.user);
+    if (this.st.user.id > 0)
+    {
+    // Ask server for current corr games (all but mines)
+//    ajax(
+//      "/games",
+//      "GET",
+//      {excluded: this.st.user.id},
+//      response => {
+//        this.games = this.games.concat(response.games);
+//      }
+//    );
+    // Also ask for corr challenges (open + sent to me)
+      ajax(
+        "/challenges",
+        "GET",
+        {uid: this.st.user.id},
+        response => {
+          console.log(response.challenges);
+          // TODO: post-treatment on challenges ?
+          this.challenges = this.challenges.concat(response.challenges);
+        }
+      );
+    }
     // 0.1] Ask server for room composition:
     const socketOpenListener = () => {
       this.st.conn.send(JSON.stringify({code:"pollclients"}));
@@ -297,20 +293,21 @@ export default {
         }
         case "askgame":
         {
-          // Send my current live game (if any)
-          if (!!localStorage["gid"])
-          {
-            const myGame =
-            {
-              // Minimal game informations: (fen+clock not required)
-              id: localStorage["gid"],
-              players: JSON.parse(localStorage["players"]), //array sid+id+name
-              vname: localStorage["vname"],
-              timeControl: localStorage["timeControl"],
-            };
-            this.st.conn.send(JSON.stringify({code:"game",
-              game:myGame, target:data.from}));
-          }
+          // Send my current live games (if any)
+          // TODO: from indexedDB, through GameStorage.
+//          if (!!localStorage["gid"])
+//          {
+//            const myGame =
+//            {
+//              // Minimal game informations: (fen+clock not required)
+//              id: localStorage["gid"],
+//              players: JSON.parse(localStorage["players"]), //array sid+id+name
+//              vname: localStorage["vname"],
+//              timeControl: localStorage["timeControl"],
+//            };
+//            this.st.conn.send(JSON.stringify({code:"game",
+//              game:myGame, target:data.from}));
+//          }
           break;
         }
         case "identity":
@@ -336,6 +333,7 @@ export default {
         {
           // Receive game from some player (+sid)
           // NOTE: it may be correspondance (if newgame while we are connected)
+          // TODO: ambiguous naming "newGame" ==> rename function ?
           let newGame = data.game;
           newGame.type = this.classifyObject(data.game);
           newGame.vname = newGame.vname;
@@ -434,7 +432,7 @@ export default {
       if (!!error)
         return alert(error);
       const ctype = this.classifyObject(this.newchallenge);
-      const cto = this.newchallenge.to.slice(0, this.newchallenge.nbPlayers);
+      const cto = this.newchallenge.to.slice(0, this.newchallenge.nbPlayers - 1);
       // NOTE: "from" information is not required here
       let chall =
       {
@@ -495,6 +493,10 @@ export default {
 // *  - prepare and start new game (if challenge is full after acceptation)
 // *    --> include challenge ID (so that opponents can delete the challenge too)
     clickChallenge: function(c) {
+
+      console.log("click challenge");
+      console.log(c);
+
       if (!!c.accepted)
       {
         this.st.conn.send(JSON.stringify({code: "withdrawchallenge",
@@ -565,12 +567,14 @@ export default {
       window.V = vModule.VariantRules;
       let players = [c.from];
       Array.prototype.push.apply(players, c.seats);
-      let gameInfo =
+      // These game informations will be sent to other players
+      const gameInfo =
       {
+        gameId: getRandString(),
         fen: c.fen || V.GenRandInitFen(),
-        // Shuffle players order (white then black then other colors).
         // Players' names may be required if game start when a player is offline
-        players: shuffle(players).map(p => { return {name:p.name, sid:p.sid} }),
+        // Shuffle players order (white then black then other colors).
+        players: shuffle(players.map(p => { return {name:p.name, sid:p.sid} })),
         vid: c.vid,
         timeControl: c.timeControl,
       };
@@ -585,21 +589,30 @@ export default {
     },
     // NOTE: for live games only (corr games are launched on server)
     newGame: function(gameInfo) {
-      localStorage["gid"] = getRandString();
-      // Extract times (in [milli]seconds), set clocks, store in localStorage
+      // Extract times (in [milli]seconds), set clocks
       const tc = extractTime(gameInfo.timeControl);
-      localStorage["timeControl"] = gameInfo.timeControl;
-      localStorage["clocks"] = JSON.stringify(
-        [...Array(gameInfo.players.length)].fill(tc.mainTime));
-      localStorage["increment"] = tc.increment;
-      localStorage["started"] = JSON.stringify(
-        [...Array(gameInfo.players.length)].fill(false));
-      localStorage["mysid"] = this.st.user.sid;
-      localStorage["vname"] = this.getVname(gameInfo.vid);
-      localStorage["fenInit"] = gameInfo.fen;
-      localStorage["players"] = JSON.stringify(gameInfo.players);
+      const IPlayFirst = (gameInfo.players[0].sid == this.st.user.sid);
+      const game =
+      {
+        // Game infos: constant
+        gameId: gameInfo.gameId,
+        vname: this.getVname(gameInfo.vid),
+        fenStart: gameInfo.fen,
+        players: gameInfo.players,
+        timeControl: gameInfo.timeControl,
+        increment: tc.increment,
+        mode: "live", //function for live games only
+        // Game state: will be updated
+        fen: gameInfo.fen,
+        moves: [],
+        clocks: [...Array(gameInfo.players.length)].fill(tc.mainTime),
+        initime: (IPlayFirst ? Date.now() : undefined),
+        score: "*",
+      };
+      GameStorage.add(game);
       if (this.st.settings.sound >= 1)
         new Audio("/sounds/newgame.mp3").play().catch(err => {});
+      // TODO: redirect to game
     },
   },
 };
@@ -608,3 +621,9 @@ 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).
+-->