From f22ea0cf96c2022619e7c9e5dff973720164fa98 Mon Sep 17 00:00:00 2001 From: Alan Myers Date: Thu, 28 May 2026 15:13:53 -0400 Subject: [PATCH 1/4] This could go majorly wrong --- backend/websockets/chat.js | 1 - frontend/static/yw/javascript/chat.js | 61 ++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/backend/websockets/chat.js b/backend/websockets/chat.js index 7b88b242..4f8c85aa 100644 --- a/backend/websockets/chat.js +++ b/backend/websockets/chat.js @@ -138,7 +138,6 @@ module.exports = async function(ws, data, send, broadcast, server, ctx) { serverChatResponse("The global channel is not available", location); return; } - var isMuted = false; var isTestMessage = false; var muteInfo = null; diff --git a/frontend/static/yw/javascript/chat.js b/frontend/static/yw/javascript/chat.js index c179e73a..b5ba5199 100644 --- a/frontend/static/yw/javascript/chat.js +++ b/frontend/static/yw/javascript/chat.js @@ -994,10 +994,29 @@ function buildChatElement(field, id, type, nickname, message, realUsername, op, field.scrollTop = maxScroll; } + chatGroup._duplicateData = { + count: 1, + singleMessageHtml: msgDom.innerHTML, + expanded: false, + msgDom: msgDom + }; + chatGroup.addEventListener("click", function() { + var data = this._duplicateData; + if(data && data.count > 1) { + data.expanded = !data.expanded; + updateDuplicateChatGroup(this); + } + }); + var chatRec = { id: id, date: date, field: field, - element: chatGroup + element: chatGroup, + type: type, + nickname: nickname, + realUsername: realUsername, + message: message, + dataObj: dataObj }; if(field == elm.page_chatfield) { chatRecordsPage.push(chatRec); @@ -1014,9 +1033,49 @@ function buildChatElement(field, id, type, nickname, message, realUsername, op, } } +function updateDuplicateChatGroup(chatGroup) { + var data = chatGroup._duplicateData; + if(!data) return; + if(data.count <= 1) { + chatGroup.style.cursor = "default"; + chatGroup.title = ""; + data.expanded = false; + data.msgDom.innerHTML = data.singleMessageHtml; + return; + } + chatGroup.style.cursor = "pointer"; + chatGroup.title = "Click to expand repeated messages"; + if(data.expanded) { + var repeated = []; + for(var i = 0; i < data.count; i++) { + repeated.push(data.singleMessageHtml); + } + data.msgDom.innerHTML = repeated.join("
"); + } else { + data.msgDom.innerHTML = data.singleMessageHtml + " x" + data.count; + } +} + +function isChatMessageDuplicateRecord(chatRec, message) { + if(!chatRec || !chatRec.element || !chatRec.element._duplicateData) return false; + return chatRec.id === message.id + && chatRec.type === message.type + && chatRec.nickname === message.nickname + && chatRec.realUsername === message.realUsername + && chatRec.message === message.message + && ((chatRec.dataObj && chatRec.dataObj.privateMessage) || "") === ((message.dataObj && message.dataObj.privateMessage) || ""); +} + function insertNewChatElementsIntoChatfield(chatfield, messageQueue) { + var records = chatfield == elm.page_chatfield ? chatRecordsPage : chatRecordsGlobal; for(var i = 0; i < messageQueue.length; i++) { var message = messageQueue[i]; + var lastRec = records.length ? records[records.length - 1] : null; + if(lastRec && isChatMessageDuplicateRecord(lastRec, message)) { + lastRec.element._duplicateData.count++; + updateDuplicateChatGroup(lastRec.element); + continue; + } buildChatElement(chatfield, message.id, message.type, message.nickname, message.message, message.realUsername, message.op, message.admin, message.staff, From 8ce21c13ad0232b692a356acee126d355913b591 Mon Sep 17 00:00:00 2001 From: Alan Myers Date: Thu, 28 May 2026 15:29:12 -0400 Subject: [PATCH 2/4] Chat Multiplier Number for duplicate messages. #135 --- frontend/static/yw/javascript/chat.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/static/yw/javascript/chat.js b/frontend/static/yw/javascript/chat.js index b5ba5199..497ac159 100644 --- a/frontend/static/yw/javascript/chat.js +++ b/frontend/static/yw/javascript/chat.js @@ -782,6 +782,8 @@ function addChat(chatfield, id, type, nickname, message, realUsername, op, admin } function buildChatElement(field, id, type, nickname, message, realUsername, op, admin, staff, color, date, dataObj) { + var rawNickname = nickname; + var rawMessage = message; var dateStr = ""; if(date) dateStr = convertToDate(date); var pm = dataObj.privateMessage; @@ -1013,8 +1015,9 @@ function buildChatElement(field, id, type, nickname, message, realUsername, op, field: field, element: chatGroup, type: type, - nickname: nickname, + rawNickname: rawNickname, realUsername: realUsername, + rawMessage: rawMessage, message: message, dataObj: dataObj }; @@ -1060,9 +1063,9 @@ function isChatMessageDuplicateRecord(chatRec, message) { if(!chatRec || !chatRec.element || !chatRec.element._duplicateData) return false; return chatRec.id === message.id && chatRec.type === message.type - && chatRec.nickname === message.nickname + && chatRec.rawNickname === message.nickname && chatRec.realUsername === message.realUsername - && chatRec.message === message.message + && chatRec.rawMessage === message.message && ((chatRec.dataObj && chatRec.dataObj.privateMessage) || "") === ((message.dataObj && message.dataObj.privateMessage) || ""); } From 68021add25f9ae4a87bc8d65936871e735c9017b Mon Sep 17 00:00:00 2001 From: Alan Myers Date: Thu, 28 May 2026 15:34:28 -0400 Subject: [PATCH 3/4] rebase accident From 27d9d5d95f115fa9c3f7b377d91507e0141cfa86 Mon Sep 17 00:00:00 2001 From: Alan Myers Date: Thu, 28 May 2026 17:26:09 -0400 Subject: [PATCH 4/4] Add brackets to duplicate count --- frontend/static/yw/javascript/chat.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/static/yw/javascript/chat.js b/frontend/static/yw/javascript/chat.js index 497ac159..361292f7 100644 --- a/frontend/static/yw/javascript/chat.js +++ b/frontend/static/yw/javascript/chat.js @@ -1055,7 +1055,7 @@ function updateDuplicateChatGroup(chatGroup) { } data.msgDom.innerHTML = repeated.join("
"); } else { - data.msgDom.innerHTML = data.singleMessageHtml + " x" + data.count; + data.msgDom.innerHTML = data.singleMessageHtml + " [x" + data.count + "]"; } }