Some fixes. TODO: check clocks update, and continue work on resign/abort/draw
[vchess.git] / client / src / views / Hall.vue
index e499d7e..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
       },
     };
@@ -125,6 +126,8 @@ export default {
   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",
@@ -134,17 +137,18 @@ export default {
 //        this.games = this.games.concat(response.games);
 //      }
 //    );
-    // Also ask for corr challenges (open + personal 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);
-      }
-    );
+    // 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"}));
@@ -289,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":
@@ -328,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;
@@ -394,8 +400,8 @@ export default {
         {
           this.players.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:sid}));
-          this.st.conn.send(JSON.stringify({code:"askgame", target:sid}));
+          this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.sid}));
+          this.st.conn.send(JSON.stringify({code:"askgame", target:data.sid}));
           break;
         }
         case "disconnect":
@@ -426,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 =
       {
@@ -487,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",
@@ -549,8 +559,7 @@ export default {
         }
       }
     },
-    // c.type == corr alors use id...sinon sid (figés)
-    // NOTE: only for live games ?
+    // NOTE: for live games only (corr games are launched on server)
     launchGame: async function(c) {
       // Just assign colors and pass the message
       const vname = this.getVname(c.vid);
@@ -558,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,
       };
@@ -578,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
     },
   },
 };
@@ -601,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).
+-->