From 8031ae322a4fe49efbe3c2aaae94a01446eb919b Mon Sep 17 00:00:00 2001 From: nutty Date: Tue, 24 Feb 2026 16:08:16 +1100 Subject: [PATCH] Fixed regression with Twitch Cheers --- printer-bot/contents/script.js | 35 +++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/printer-bot/contents/script.js b/printer-bot/contents/script.js index 0354948..0dc74f5 100644 --- a/printer-bot/contents/script.js +++ b/printer-bot/contents/script.js @@ -51,7 +51,40 @@ async function CustomEvent(data) { subtitleEl.innerText = `${data.user}`; const messageEl = document.createElement('div'); - messageEl.innerHTML = ConstructMessageFromParts(data.parts); + messageEl.innerHTML = data.message; + + // Render emotes + for (i in data.emotes) { + const emoteElement = ``; + const emoteName = EscapeRegExp(data.emotes[i].name); + function EscapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string + } + + let regexPattern = emoteName; + + // Check if the emote name consists only of word characters (alphanumeric and underscore) + if (/^\w+$/.test(emoteName)) { + regexPattern = `\\b${emoteName}\\b`; + } + else { + // For non-word emotes, ensure they are surrounded by non-word characters or boundaries + regexPattern = `(?<=^|[^\\w])${emoteName}(?=$|[^\\w])`; + } + + const regex = new RegExp(regexPattern, 'g'); + messageEl.innerHTML = messageEl.innerHTML.replace(regex, emoteElement); + } + + // Render cheermotes + for (i in data.cheerEmotes) { + const bits = data.cheerEmotes[i].bits; + const imageUrl = data.cheerEmotes[i].imageUrl; + const name = data.cheerEmotes[i].name; + const cheerEmoteElement = ``; + const bitsElements = `${bits}` + messageEl.innerHTML = messageEl.innerHTML.replace(new RegExp(`\\b${name}${bits}\\b`, 'i'), cheerEmoteElement + bitsElements); + } contentEl.appendChild(messageEl);