diff --git a/scripts/content.js b/scripts/content.js
index 8ae6867..2fa86bc 100644
--- a/scripts/content.js
+++ b/scripts/content.js
@@ -1,4 +1,5 @@
const seenMessages = new Set();
+const messageContents = new Map();
const seenDataAnnounceMessages = new Set();
let awaitingTimes = [];
let messages = [];
@@ -26,6 +27,14 @@ function displayTime(rawTime) {
return `${Math.floor(rawTime / 3600)}:${dis(Math.floor((rawTime % 3600) / 60))}:${dis(rawTime % 60)}`;
}
+function updateMessageContent(content, el, map) {
+ if (el.innerHTML != content) el.innerHTML = content;
+}
+
+function updateMessageContents() {
+ messageContents.forEach(updateMessageContent);
+}
+
function checkNewMessages() {
// Check announce messages and log their appearing times.
const announceMessageElements = document.querySelectorAll("div[data-announce-message]");
@@ -37,28 +46,33 @@ function checkNewMessages() {
}
// Check in-call messages.
- const messageElements = document.querySelectorAll("div[data-message-id] div[jscontroller]");
+ const messageElements = document.querySelectorAll("div[data-message-id]");
let newElements = false;
- for (let e of messageElements) {
- if (seenMessages.has(e)) continue;
+ for (let messageNode of messageElements) {
+ const el = messageNode.firstChild.firstChild.firstChild.firstChild;
+ if (seenMessages.has(el)) continue;
newElements = true;
- seenMessages.add(e);
+ seenMessages.add(el);
let completionTime = Math.floor((Date.now() - startTime) / 1000);
// If awaiting times are available, use them first (i.e. the messages section just got opened).
if (awaitingTimes.length) completionTime = awaitingTimes.shift();
- const messageNode = e.parentNode.parentNode.parentNode.parentNode;
const rootNode = messageNode.parentNode.parentNode;
const name = rootNode.firstChild.firstChild.innerHTML;
const dTime = displayTime(completionTime);
if (startTime > 0) {
- messages.push({completionTime: completionTime, name: name, text: e.innerHTML, displayTime: dTime});
-
- // Set timeout for rendering the completion time, required to avoid weird stuff.
- setTimeout(() => {
- e.innerHTML = `(${dTime}) ${e.innerHTML}`;
- }, 20);
+ messages.push({completionTime: completionTime, name: name, text: el.innerHTML, displayTime: dTime});
+ const messageContent = `(${dTime}) ${el.innerHTML}`;
+ messageContents.set(el, messageContent);
+
+ // Re-show all finishing times, as GMeet reset those each time a new message is written.
+ setTimeout(updateMessageContents, 30);
+ setTimeout(updateMessageContents, 60);
+ setTimeout(updateMessageContents, 90);
+ setTimeout(updateMessageContents, 120);
+ setTimeout(updateMessageContents, 150);
+ setTimeout(updateMessageContents, 180);
}
}