const start = async () => { // if there is no chat if (document.querySelector("div[data-a-target=chat-input]") == null) { return; } const channelName = getChannelName(); if (!channelName) { return; } const emotes = {}; // fetching instances const instances = ["alright.party"]; for (const instanceUrl of instances) { let url = instanceUrl; if (!url.startsWith("https://") && !url.startsWith("http://")) { url = "https://" + url; } const data = await getTinyEmotesUserByName(url, channelName); const user = data.data; // adding emotes const emote_set = user.emote_sets.find((x) => x.id === user.active_emote_set_id); for (const emote of emote_set.emotes) { emotes[emote.code] = { miniatureurl: `${url}/static/userdata/emotes/${emote.id}/1x.${emote.ext}`, fullurl: `${url}/static/userdata/emotes/${emote.id}/3x.${emote.ext}`, uploader: emote.uploaded_by ? emote.uploaded_by.username : "Anonymous*", instance: instanceUrl, code: emote.code }; } } const observer = new MutationObserver(mutations => { for (const m of mutations) { m.addedNodes.forEach(node => { if (node.nodeType !== 1) return; const textEl = node.querySelector('[data-a-target=chat-message-text]'); if (textEl) { replaceEmotes(textEl, emotes); } }); } }); observer.observe(document.body, { childList: true, subtree: true }); }; function onPageReady(cb) { if (document.readyState === 'complete' || document.readyState === 'interactive') { cb(); } else { document.addEventListener("DOMContentLoaded", db); } } onPageReady(start);