(function(){ /* --- Impersonate.js --- */ if(window.__US_BUILDER_IMPERSONATE_JS__){return;}window.__US_BUILDER_IMPERSONATE_JS__=true; (function () { if (window.__IMPERSONATE__) return; window.__IMPERSONATE__ = true; function apply() { const UserContextMenu = document.getElementsByClassName('d_flex flex-d_column p_var(--gap-md)_0 ov_hidden bdr_var(--borderRadius-xs) bg_var(--md-sys-color-surface-container) c_var(--md-sys-color-on-surface) fill_var(--md-sys-color-on-surface) bx-sh_0_0_3px_var(--md-sys-color-shadow) us_none UserContextMenu').item(0) if(UserContextMenu){ const impersonateButton = document.createElement('div') impersonateButton.id='impersonate' impersonateButton.className = 'd_flex gap_var(--gap-md) ai_center p_var(--gap-md)_var(--gap-lg) [&:hover]:bg_color-mix(in_srgb,_var(--md-sys-color-on-surface)_8%,_transparent) [&_span]:flex-g_1 [&_span]:mt_1px cursor_pointer tt_capitalize' impersonateButton.innerText = 'Impersonate' impersonateButton.innerHTML = ` Impersonate ` const svg = document.createElement('svg') svg.innerHTML = ` ` const path = document.createElement('path') path.d='M10.25 13a1.25 1.25 0 1 1-2.5 0 1.25 1.25 0 0 1 2.5 0M15 11.75a1.25 1.25 0 1 0 0 2.5 1.25 1.25 0 0 0 0-2.5m7 .25c0 5.52-4.48 10-10 10S2 17.52 2 12 6.48 2 12 2s10 4.48 10 10M10.66 4.12C12.06 6.44 14.6 8 17.5 8c.46 0 .91-.05 1.34-.12C17.44 5.56 14.9 4 12 4c-.46 0-.91.05-1.34.12M4.42 9.47a8.05 8.05 0 0 0 3.66-4.44 8.05 8.05 0 0 0-3.66 4.44M20 12c0-.78-.12-1.53-.33-2.24-.7.15-1.42.24-2.17.24a10 10 0 0 1-7.76-3.69A10.02 10.02 0 0 1 4 11.86c.01.04 0 .09 0 .14 0 4.41 3.59 8 8 8s8-3.59 8-8' const span = document.createElement('span') span.className = 'lh_1.25rem fs_0.875rem ls_0.015625rem fw_400' svg.appendChild(path) impersonateButton.appendChild(svg) impersonateButton.appendChild(span) if(!document.getElementById('impersonate')){ UserContextMenu.appendChild(impersonateButton) } impersonateButton.addEventListener('click',async ()=>{ if(impersonateButton.parentElement.parentElement.parentElement.parentElement.children[0].children[0].children[0].children[0].children[0].innerText){ let originalavatar = impersonateButton.parentElement.parentElement.parentElement.parentElement.children[0].children[0].children[0].children[0].children[0].children[1].children[0].children[0].children[0].children[0].children[0].src let avatar = impersonateButton.parentElement.parentElement.parentElement.parentElement.children[0].children[0].children[0].children[0].children[0].children[1].children[0].children[0].children[0].children[0].children[0].src+'/original' let displayname = impersonateButton.parentElement.parentElement.parentElement.parentElement.children[0].children[0].children[0].children[0].children[0].innerText const res = await fetch(avatar) if(res.ok){ avatar = res.url }else{ avatar = originalavatar } if(displayname.includes('\n')){ displayname = displayname.substring(0,displayname.indexOf('\n')) } if(displayname.includes('#')){ displayname = displayname.substring(0,displayname.indexOf('#')) } const masquerade = {name:displayname,avatar:avatar,enabled:false} const masqueradeList= JSON.parse(localStorage.getItem('avia_masq_list'))||[]; const currentMasquerade = masqueradeList.find(m=>m.enabled) currentMasquerade.enabled=false masqueradeList.splice(masqueradeList.indexOf(currentMasquerade),1) masqueradeList.push(currentMasquerade) const test = masqueradeList.find(m=>m.name==masquerade.name) if(!test){ masquerade.enabled=true; masqueradeList.push(masquerade) }else{ masqueradeList.splice(masqueradeList.indexOf(test),1) test.enabled=true masqueradeList.push(test) } localStorage.setItem('avia_masq_list',JSON.stringify(masqueradeList)) }else{ window.alert('Impersonating via the right click context menu doesn\'t work!') } }); } } const observer = new MutationObserver(() => { apply(); }); function init() { apply(); observer.observe(document.documentElement, { childList: true, subtree: true, }); } if (document.body) { init(); } else { requestAnimationFrame(init); } })(); /* --- masquerade.js --- */ if(window.__US_BUILDER_MASQUERADE_JS__){return;}window.__US_BUILDER_MASQUERADE_JS__=true; (function () { if (window.__AVIA_MASQ_PANEL__) return; window.__AVIA_MASQ_PANEL__ = true; const STORAGE_ENABLED = "avia_masq_enabled"; const STORAGE_LIST = "avia_masq_list"; let ENABLED = localStorage.getItem(STORAGE_ENABLED) !== "false"; let MASQ_LIST = JSON.parse(localStorage.getItem(STORAGE_LIST) || "[]"); const originalFetch = window.fetch.bind(window); window.fetch = async function (resource, config = {}) { try { const url = resource?.toString?.() || ""; if ( ENABLED && config.method === "POST" && url.includes("/channels/") && url.includes("/messages") && config.body && typeof config.body === "string" && MASQ_LIST.length ) { const parsed = JSON.parse(config.body); if (parsed && typeof parsed.content === "string") { MASQ_LIST = JSON.parse(localStorage.getItem(STORAGE_LIST) || "[]"); const activeMasq = MASQ_LIST.find(m => m.enabled); if (activeMasq) { parsed.masquerade = { name: activeMasq.name, avatar: activeMasq.avatar }; config = { ...config, body: JSON.stringify(parsed) }; } } } } catch (e) { console.warn("Masq panel fetch error", e); } return originalFetch(resource, config); }; function toggleMasqPanel() { let panel = document.getElementById("avia-masq-panel"); if (panel) { panel.style.display = panel.style.display === "none" ? "flex" : "none"; return; } panel = document.createElement("div"); panel.id = "avia-masq-panel"; Object.assign(panel.style, { position: "fixed", bottom: "40px", right: "40px", width: "380px", height: "500px", background: "#1e1e1e", color: "#fff", borderRadius: "20px", boxShadow: "0 12px 35px rgba(0,0,0,0.45)", zIndex: 999999, display: "flex", flexDirection: "column", overflow: "hidden", border: "1px solid rgba(255,255,255,0.08)" }); const header = document.createElement("div"); header.textContent = "Masquerade"; Object.assign(header.style, { padding: "18px", fontWeight: "600", fontSize: "16px", background: "rgba(255,255,255,0.04)", borderBottom: "1px solid rgba(255,255,255,0.08)", cursor: "move", position: "relative", textAlign: "center", userSelect: "none" }); let isDragging = false, offsetX = 0, offsetY = 0; header.addEventListener("mousedown", e => { isDragging = true; const rect = panel.getBoundingClientRect(); offsetX = e.clientX - rect.left; offsetY = e.clientY - rect.top; panel.style.bottom = "auto"; panel.style.right = "auto"; panel.style.left = rect.left + "px"; panel.style.top = rect.top + "px"; document.body.style.userSelect = "none"; }); document.addEventListener("mousemove", e => { if (!isDragging) return; panel.style.left = e.clientX - offsetX + "px"; panel.style.top = e.clientY - offsetY + "px"; }); document.addEventListener("mouseup", () => { isDragging = false; document.body.style.userSelect = ""; }); const toggleBtn = document.createElement("div"); Object.assign(toggleBtn.style, { position: "absolute", left: "18px", top: "16px", cursor: "pointer", fontSize: "12px", padding: "4px 8px", borderRadius: "8px" }); function updateToggleUI() { toggleBtn.textContent = ENABLED ? "ON" : "OFF"; toggleBtn.style.background = ENABLED ? "rgba(0,200,0,0.25)" : "rgba(200,0,0,0.25)"; } updateToggleUI(); toggleBtn.onclick = () => { ENABLED = !ENABLED; localStorage.setItem(STORAGE_ENABLED, ENABLED); updateToggleUI(); }; header.appendChild(toggleBtn); const close = document.createElement("div"); close.textContent = "✕"; Object.assign(close.style, { position: "absolute", right: "18px", top: "16px", cursor: "pointer" }); close.onclick = () => panel.style.display = "none"; header.appendChild(close); const container = document.createElement("div"); Object.assign(container.style, { flex: "1", overflowY: "auto", padding: "18px" }); const disclaimer = document.createElement("div"); disclaimer.textContent = "⚠️ Masquerade only works in servers/groups with permission. Currently does not work in DMs. There has been a fix made, but it's not live yet."; Object.assign(disclaimer.style, { fontSize: "12px", marginBottom: "12px", color: "#ffcc00" }); container.appendChild(disclaimer); const nameInput = document.createElement("input"); nameInput.placeholder = "Masq Name"; Object.assign(nameInput.style, { width: "100%", marginBottom: "6px", padding: "6px", borderRadius: "6px", border: "none" }); const avatarInput = document.createElement("input"); avatarInput.placeholder = "Avatar URL"; Object.assign(avatarInput.style, { width: "100%", marginBottom: "6px", padding: "6px", borderRadius: "6px", border: "none" }); const addBtn = document.createElement("button"); addBtn.textContent = "Add Masquerade"; Object.assign(addBtn.style, { width: "100%", padding: "6px", borderRadius: "6px", marginBottom: "12px", cursor: "pointer" }); addBtn.onclick = () => { const name = nameInput.value.trim(); const avatar = avatarInput.value.trim(); if (!name || !avatar) return; const anyActive = MASQ_LIST.some(m => m.enabled); MASQ_LIST.push({ name, avatar, enabled: !anyActive }); localStorage.setItem(STORAGE_LIST, JSON.stringify(MASQ_LIST)); renderMasqList(); nameInput.value = ""; avatarInput.value = ""; }; container.appendChild(nameInput); container.appendChild(avatarInput); container.appendChild(addBtn); const listWrapper = document.createElement("div"); container.appendChild(listWrapper); function renderMasqList() { listWrapper.innerHTML = ""; MASQ_LIST = JSON.parse(localStorage.getItem(STORAGE_LIST) || "[]"); MASQ_LIST.forEach((m, i) => { const row = document.createElement("div"); Object.assign(row.style, { display: "flex", alignItems: "center", marginBottom: "6px" }); const btn = document.createElement("button"); btn.style.flex = "1"; btn.style.padding = "6px"; btn.style.borderRadius = "6px"; btn.style.border = "none"; btn.style.cursor = "pointer"; btn.style.display = "flex"; btn.style.alignItems = "center"; btn.style.gap = "8px"; btn.style.position = "relative"; btn.style.background = "rgba(255,255,255,0.08)"; const img = document.createElement("img"); img.src = m.avatar; img.style.width = "24px"; img.style.height = "24px"; img.style.borderRadius = "50%"; img.style.objectFit = "cover"; const nameSpan = document.createElement("span"); nameSpan.textContent = m.name; nameSpan.style.flex = "1"; btn.appendChild(img); btn.appendChild(nameSpan); const check = document.createElement("span"); check.textContent = "✔"; Object.assign(check.style, { position: "absolute", right: "6px", top: "6px", fontSize: "12px", color: m.enabled ? "#0f0" : "transparent", fontWeight: "bold" }); btn.appendChild(check); btn.onclick = () => { MASQ_LIST.forEach((x, idx) => x.enabled = idx === i); localStorage.setItem(STORAGE_LIST, JSON.stringify(MASQ_LIST)); renderMasqList(); }; const delBtn = document.createElement("button"); delBtn.textContent = "✕"; Object.assign(delBtn.style, { marginLeft: "6px", cursor: "pointer" }); delBtn.onclick = () => { MASQ_LIST.splice(i, 1); localStorage.setItem(STORAGE_LIST, JSON.stringify(MASQ_LIST)); renderMasqList(); }; row.appendChild(btn); row.appendChild(delBtn); listWrapper.appendChild(row); }); } renderMasqList(); const refreshButton = document.createElement('div') refreshButton.textContent='↺' Object.assign(refreshButton.style,{ position:'absolute', right:'36px', top:'16px', cursor:'pointer' }); refreshButton.onclick = ()=>{ renderMasqList() } header.appendChild(refreshButton) panel.appendChild(header); panel.appendChild(container); document.body.appendChild(panel); } function injectSettingsButton() { if (document.getElementById("avia-masq-btn")) return; const gifSpan = [...document.querySelectorAll("span.material-symbols-outlined")] .find(s => s.textContent.trim() === "gif"); if (!gifSpan) return; const wrapper = gifSpan.closest("div.flex-sh_0"); if (!wrapper) return; const clone = wrapper.cloneNode(true); clone.id = "avia-masq-btn"; const btn = clone.querySelector("button"); btn.onclick = toggleMasqPanel; const spanIcon = clone.querySelector("span.material-symbols-outlined"); spanIcon.textContent = "domino_mask"; spanIcon.style.fontVariationSettings = "'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24"; spanIcon.style.color = "#e3e3e3"; wrapper.parentElement.insertBefore(clone, wrapper.nextSibling); } new MutationObserver(injectSettingsButton) .observe(document.body, { childList: true, subtree: true }); injectSettingsButton(); })(); })();