Record chat history in live games as well
authorBenjamin Auder <benjamin.auder@somewhere>
Thu, 26 Mar 2020 16:28:00 +0000 (17:28 +0100)
committerBenjamin Auder <benjamin.auder@somewhere>
Thu, 26 Mar 2020 16:28:00 +0000 (17:28 +0100)
client/src/utils/gameStorage.js
client/src/views/Game.vue
client/src/views/Hall.vue

index e26e19a..6b4c711 100644 (file)
@@ -85,6 +85,8 @@ export const GameStorage = {
           if (obj.moveIdx < game.moves.length) return;
           Object.keys(obj).forEach(k => {
             if (k == "move") game.moves.push(obj[k]);
           if (obj.moveIdx < game.moves.length) return;
           Object.keys(obj).forEach(k => {
             if (k == "move") game.moves.push(obj[k]);
+            else if (k == "chat") game.chats.push(obj[k]);
+            else if (k == "delchat") game.chats = [];
             else game[k] = obj[k];
           });
           objectStore.put(game); //save updated data
             else game[k] = obj[k];
           });
           objectStore.put(game); //save updated data
index f9bc843..6ef161f 100644 (file)
@@ -408,16 +408,22 @@ export default {
       // NOTE: anonymous chats in corr games are not stored on server (TODO?)
       if (this.game.type == "corr" && this.st.user.id > 0)
         this.updateCorrGame({ chat: chat });
       // NOTE: anonymous chats in corr games are not stored on server (TODO?)
       if (this.game.type == "corr" && this.st.user.id > 0)
         this.updateCorrGame({ chat: chat });
+      else if (this.game.type == "live") {
+        chat.added = Date.now();
+        GameStorage.update(this.gameRef, { chat: chat });
+      }
     },
     clearChat: function() {
     },
     clearChat: function() {
-      // Nothing more to do if game is live (chats not recorded)
-      if (this.game.type == "corr") {
-        if (!!this.game.mycolor) {
+      if (!!this.game.mycolor) {
+        if (this.game.type == "corr") {
           ajax(
             "/chats",
             "DELETE",
             { data: { gid: this.game.id } }
           );
           ajax(
             "/chats",
             "DELETE",
             { data: { gid: this.game.id } }
           );
+        } else {
+          // Live game
+          GameStorage.update(this.gameRef, { delchat: true });
         }
         this.$set(this.game, "chats", []);
       }
         }
         this.$set(this.game, "chats", []);
       }
@@ -761,11 +767,17 @@ export default {
           }
           break;
         }
           }
           break;
         }
-        case "newchat":
-          this.$refs["chatcomp"].newChat(data.data);
+        case "newchat": {
+          let chat = data.data;
+          this.$refs["chatcomp"].newChat(chat);
+          if (this.game.type == "live") {
+            chat.added = Date.now();
+            GameStorage.update(this.gameRef, { chat: chat });
+          }
           if (!document.getElementById("modalChat").checked)
             document.getElementById("chatBtn").classList.add("somethingnew");
           break;
           if (!document.getElementById("modalChat").checked)
             document.getElementById("chatBtn").classList.add("somethingnew");
           break;
+        }
       }
     },
     updateCorrGame: function(obj, callback) {
       }
     },
     updateCorrGame: function(obj, callback) {
@@ -958,7 +970,10 @@ export default {
         return p.sid == this.st.user.sid || p.id == this.st.user.id;
       });
       const mycolor = [undefined, "w", "b"][myIdx + 1]; //undefined for observers
         return p.sid == this.st.user.sid || p.id == this.st.user.id;
       });
       const mycolor = [undefined, "w", "b"][myIdx + 1]; //undefined for observers
-      if (!game.chats) game.chats = []; //live games don't have chat history
+      // Live games before 26/03/2020 don't have chat history. TODO: remove next line
+      if (!game.chats) game.chats = [];
+      // Sort chat messages from newest to oldest
+      game.chats.sort((c1, c2) => c2.added - c1.added);
       if (gtype == "corr") {
         // NOTE: clocks in seconds
         game.moves.sort((m1, m2) => m1.idx - m2.idx); //in case of
       if (gtype == "corr") {
         // NOTE: clocks in seconds
         game.moves.sort((m1, m2) => m1.idx - m2.idx); //in case of
@@ -971,10 +986,6 @@ export default {
               (Date.now() - game.moves[L-1].played) / 1000;
           }
         }
               (Date.now() - game.moves[L-1].played) / 1000;
           }
         }
-        // Sort chat messages from newest to oldest
-        game.chats.sort((c1, c2) => {
-          return c2.added - c1.added;
-        });
         if (myIdx >= 0 && game.score == "*" && game.chats.length > 0) {
           // Did a chat message arrive after my last move?
           let dtLastMove = 0;
         if (myIdx >= 0 && game.score == "*" && game.chats.length > 0) {
           // Did a chat message arrive after my last move?
           let dtLastMove = 0;
@@ -996,6 +1007,12 @@ export default {
         game.moves = game.moves.map(m => m.squares);
       }
       if (gtype == "live") {
         game.moves = game.moves.map(m => m.squares);
       }
       if (gtype == "live") {
+        if (
+          game.chats.length > 0 &&
+          (!game.initime || game.initime < game.chats[0].added)
+        ) {
+          document.getElementById("chatBtn").classList.add("somethingnew");
+        }
         if (game.clocks[0] < 0) {
           // Game is unstarted. clock is ignored until move 2
           game.clocks = [tc.mainTime, tc.mainTime];
         if (game.clocks[0] < 0) {
           // Game is unstarted. clock is ignored until move 2
           game.clocks = [tc.mainTime, tc.mainTime];
index 5c5dc33..8cbbf20 100644 (file)
@@ -1230,6 +1230,7 @@ export default {
           // Game state (including FEN): will be updated
           moves: [],
           clocks: [-1, -1], //-1 = unstarted
           // Game state (including FEN): will be updated
           moves: [],
           clocks: [-1, -1], //-1 = unstarted
+          chats: [],
           score: "*"
         }
       );
           score: "*"
         }
       );