From 902378e6276422d38b45f7d79282c2462f1124b1 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Tue, 13 Apr 2021 19:59:04 +0200
Subject: [PATCH] Some (experimental) fixes

---
 client/src/components/ChallengeList.vue |  2 --
 client/src/components/GameList.vue      |  4 +--
 client/src/components/UploadGame.vue    |  2 +-
 client/src/variants/Cwda.js             | 14 ++-------
 client/src/views/Game.vue               |  8 ++---
 client/src/views/Hall.vue               | 39 +++++++++++++------------
 client/src/views/MyGames.vue            | 13 +++++++--
 7 files changed, 39 insertions(+), 43 deletions(-)

diff --git a/client/src/components/ChallengeList.vue b/client/src/components/ChallengeList.vue
index 2432b272..a1c46cdc 100644
--- a/client/src/components/ChallengeList.vue
+++ b/client/src/components/ChallengeList.vue
@@ -49,8 +49,6 @@ export default {
         if (c.added < minAdded) minAdded = c.added;
         if (c.added > maxAdded) maxAdded = c.added;
         return Object.assign({ priority: priority }, c);
-        // TODO: remove patch soon
-        if (!c.options) c.options = {}
       });
       const deltaAdded = maxAdded - minAdded;
       return augmentedChalls.sort((c1, c2) => {
diff --git a/client/src/components/GameList.vue b/client/src/components/GameList.vue
index bc9e883a..a8c0dab6 100644
--- a/client/src/components/GameList.vue
+++ b/client/src/components/GameList.vue
@@ -83,8 +83,6 @@ export default {
           if (!!g.myColor) g.priority++;
           if (!!g.myTurn) g.priority++;
         }
-        // TODO: remove patch soon
-        if (!g.options) g.options = {}
       });
       const deltaCreated = maxCreated - minCreated;
       return remGames.sort((g1, g2) => {
@@ -117,6 +115,8 @@ export default {
     },
     deleteGame: function(game, e) {
       if (
+        // Import ?
+        (typeof game.id == "string" && game.id.charAt(0) == 'i') ||
         // My game ?
         game.players.some(p =>
           p.sid == this.st.user.sid || p.id == this.st.user.id
diff --git a/client/src/components/UploadGame.vue b/client/src/components/UploadGame.vue
index b57a23e7..217bc7c0 100644
--- a/client/src/components/UploadGame.vue
+++ b/client/src/components/UploadGame.vue
@@ -59,7 +59,7 @@ export default {
           case "Result":
             // Allow importing unfinished games, but mark them as
             // "unknown result" to avoid running the clocks...
-            game.result = (value != "*" ? value : "?");
+            game.score = (value != "*" ? value : "?");
             break;
           case "Cadence":
             game.cadence = value;
diff --git a/client/src/variants/Cwda.js b/client/src/variants/Cwda.js
index 9142d468..a07672a1 100644
--- a/client/src/variants/Cwda.js
+++ b/client/src/variants/Cwda.js
@@ -304,13 +304,9 @@ export class CwdaRules extends ChessRules {
   }
 
   getPotentialN_knightMoves(sq) {
-    const backward = (this.turn == 'w' ? 1 : -1);
-    const kingSteps = [
-      [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1]
-    ];
     return (
       this.getSlideNJumpMoves(sq, V.steps.$n, 1).concat(
-      this.getSlideNJumpMoves(sq, kingSteps, 1))
+      this.getSlideNJumpMoves(sq, V.steps.f, 1))
     );
   }
 
@@ -445,13 +441,9 @@ export class CwdaRules extends ChessRules {
   }
 
   isAttackedByN_knight(sq, color) {
-    const backward = (color == 'w' ? -1 : 1);
-    const kingSteps = [
-      [0, -1], [0, 1], [backward, -1], [backward, 0], [backward, 1]
-    ];
     return (
-      this.isAttackedBySlideNJump(sq, color, V.N_KNIGHT, V.steps.$n) ||
-      this.isAttackedBySlideNJump(sq, color, V.N_KNIGHT, kingSteps, 1)
+      this.isAttackedBySlideNJump(sq, color, V.N_KNIGHT, V.steps.$n, 1) ||
+      this.isAttackedBySlideNJump(sq, color, V.N_KNIGHT, V.steps.f, 1)
     );
   }
 
diff --git a/client/src/views/Game.vue b/client/src/views/Game.vue
index 0be29954..0e430fe2 100644
--- a/client/src/views/Game.vue
+++ b/client/src/views/Game.vue
@@ -1066,7 +1066,7 @@ export default {
         let gameInfo = {
           id: getRandString(), //ignored if corr
           fen: V.GenRandInitFen(this.game.options),
-          options: this.game.options,
+          options: JSON.stringify(this.game.options),
           players: [this.game.players[1], this.game.players[0]],
           vid: this.game.vid,
           cadence: this.game.cadence
@@ -1099,11 +1099,7 @@ export default {
             "/games",
             "POST",
             {
-              data: Object.assign(
-                {},
-                gameInfo,
-                { options: JSON.stringify(this.game.options) }
-              ),
+              data: { gameInfo: gameInfo },
               success: (response) => {
                 gameInfo.id = response.id;
                 notifyNewGame();
diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue
index db483e1d..9fcc2e0d 100644
--- a/client/src/views/Hall.vue
+++ b/client/src/views/Hall.vue
@@ -848,7 +848,7 @@ export default {
                 id: c.id,
                 from: this.st.user.sid,
                 to: c.to,
-                options: c.options,
+                options: JSON.stringify(c.options),
                 fen: c.fen,
                 vid: c.vid,
                 cadence: c.cadence,
@@ -907,6 +907,8 @@ export default {
             if (!game.score)
               // New game from Hall
               newGame.score = "*";
+            // TODO: remove patch on next line (options || "{}")
+            newGame.options = JSON.parse(newGame.options || "{}");
             this.games.push(newGame);
             if (
               newGame.score == '*' &&
@@ -927,9 +929,12 @@ export default {
         }
         case "startgame": {
           // New game just started, I'm involved
-          const gameInfo = data.data;
-          if (this.classifyObject(gameInfo) == "live")
+          let gameInfo = data.data;
+          if (this.classifyObject(gameInfo) == "live") {
+            // TODO: remove patch on next line (+ const gameInfo)
+            if (!gameInfo.options) gameInfo.options = "{}";
             this.startNewGame(gameInfo);
+          }
           else {
             this.infoMessage =
               this.st.tr["New correspondence game:"] + " " +
@@ -973,6 +978,7 @@ export default {
               let moreGames = res.games.map(g => {
                 this.setVname(g);
                 g.type = "corr";
+                g.options = JSON.parse(g.options);
                 return g;
               });
               this.games = this.games.concat(moreGames);
@@ -992,7 +998,8 @@ export default {
       ) {
         let newChall = Object.assign({}, chall);
         newChall.type = this.classifyObject(chall);
-        newChall.options = chall.options;
+        // TODO: remove patch on next line (options || "{}")
+        newChall.options = JSON.parse(chall.options || "{}");
         newChall.added = Date.now();
         let fromValues = Object.assign({}, this.people[chall.from]);
         delete fromValues["pages"]; //irrelevant in this context
@@ -1091,7 +1098,7 @@ export default {
       // Get/set options variables (if any) / TODO: v-model?!
       for (const check of this.newchallenge.V.Options.check || []) {
         const elt = document.getElementById(check.variable + "_opt");
-        if (elt.checked) chall.options[check.variable] = true;
+        chall.options[check.variable] = elt.checked;
       }
       for (const select of this.newchallenge.V.Options.select || []) {
         const elt = document.getElementById(select.variable + "_opt");
@@ -1168,7 +1175,10 @@ export default {
         this.send("newchallenge", {
           data: Object.assign(
             // Temporarily add sender infos to display challenge on Discord.
-            { from: this.st.user.sid, sender: this.st.user.name }, chall)
+            { from: this.st.user.sid, sender: this.st.user.name },
+            chall,
+            { options: JSON.stringify(chall.options) }
+          )
         });
         // Add new challenge:
         chall.from = {
@@ -1204,10 +1214,8 @@ export default {
           "POST",
           {
             data: {
-              chall: Object.assign(
-                {},
-                chall,
-                { options: JSON.stringify(chall.options) }
+              chall: Object.assign({},
+                chall, { options: JSON.stringify(chall.options) }
               )
             },
             success: (response) => {
@@ -1316,7 +1324,7 @@ export default {
       let gameInfo = {
         id: getRandString(),
         fen: c.fen || V.GenRandInitFen(c.options),
-        options: c.options, //for rematch
+        options: JSON.stringify(c.options), //for rematch
         players: players,
         vid: c.vid,
         cadence: c.cadence
@@ -1366,11 +1374,7 @@ export default {
           {
             // cid is useful to delete the challenge:
             data: {
-              gameInfo: Object.assign(
-                {},
-                gameInfo,
-                { options: JSON.stringify(gameInfo.options) }
-              ),
+              gameInfo: gameInfo,
               cid: c.id
             },
             success: (response) => {
@@ -1396,8 +1400,7 @@ export default {
           moves: [],
           clocks: [-1, -1], //-1 = unstarted
           chats: [],
-          score: "*",
-          options: JSON.stringify(gameInfo.options)
+          score: "*"
         }
       );
       setTimeout(
diff --git a/client/src/views/MyGames.vue b/client/src/views/MyGames.vue
index 76879bce..aef3387d 100644
--- a/client/src/views/MyGames.vue
+++ b/client/src/views/MyGames.vue
@@ -157,6 +157,7 @@ export default {
               this.corrGames.forEach(g => {
                 g.type = "corr";
                 g.score = "*";
+                g.options = JSON.parse(g.options);
               });
               this.decorate(this.corrGames);
               // Now ask completed games (partial list)
@@ -279,6 +280,8 @@ export default {
         case "notifynewgame": {
           let gameInfo = data.data;
           this.setVname(gameInfo);
+          // TODO: remove patch on next line (options || "{}")
+          gameInfo.options = JSON.parse(gameInfo.options || "{}");
           const type = (gameInfo.cadence.indexOf('d') >= 0 ? "corr": "live");
           let game = Object.assign(
             {
@@ -368,7 +371,10 @@ export default {
               if (L > 0) {
                 this.cursor["corr"] = res.games[L - 1].created;
                 let moreGames = res.games;
-                moreGames.forEach(g => g.type = "corr");
+                moreGames.forEach(g => {
+                  g.type = "corr";
+                  g.options = JSON.parse(g.options);
+                });
                 this.decorate(moreGames);
                 this.corrGames = this.corrGames.concat(moreGames);
               }
@@ -386,7 +392,8 @@ export default {
             this.cursor["live"] = localGames[L - 1].created - 1;
             localGames.forEach(g => {
               g.type = "live";
-              if (!g.options) g.options = {}; //TODO: remove patch
+              // TODO: remove patch on next line (options || "{}")
+              g.options = JSON.parse(g.options || "{}");
             });
             this.decorate(localGames);
             this.liveGames = this.liveGames.concat(localGames);
@@ -403,7 +410,7 @@ export default {
             this.cursor["import"] = importGames[L - 1].created - 1;
             importGames.forEach(g => {
               g.type = "import";
-              if (!g.options) g.options = {}; //TODO: remove patch
+              g.options = JSON.parse(g.options);
               this.setVname(g);
             });
             this.importGames = this.importGames.concat(importGames);
-- 
2.44.0