(function () { const BUTTON_ID = "rscord-settings-btn"; const CONTENT_CONTAINER_ID = "custom-content"; const SWITCH_CONTAINER_ID = "switch-container"; const CUSTOM_CSS_ID = "custom-css"; const CUSTOM_CSS_INPUT_ID = "custom-css-input"; const CONFIG_KEY = "rscord_config"; const DEFAULT_CONFIG = { customCss: "", revertStatusIcons: false }; const CSS_CLASSES = { tabItem: "item-3XjbnG", selected: "selected-g-kMVV", contentColumn: "contentColumn-1C7as6", settingsRegion: "sidebarRegion-1VBisG", contentRegion: "contentRegion-3HkfJJ", settingsSidebar: "standardSidebarView-E9Pc3j", title: "colorStandard-1Xxp1s size14-k_3Hy4 h1-34Txb0 title-3hptVQ defaultColor-2cKwKo defaultMarginh1-EURXsm", miniTitle: "colorStandard-1Xxp1s size14-k_3Hy4 h5-2RwDNl title-3hptVQ title-1HgbhV", hidden: "hidden-27eifz", hamburger: "btnHamburger-3GF0_5", textInput: "inputDefault-3FGxgL input-2g-os5" }; const STATUS_COLOR_MAP = { 'hsl(38, calc(var(--saturation-factor, 1) * 95.7%), 54.1%)': '#FAA61A', // Idle (yellow) 'hsl(0, calc(var(--saturation-factor, 1) * 100%), 71.4%)': '#F04747', // DND (red) 'hsl(235, calc(var(--saturation-factor, 1) * 85.6%), 64.7%)': '#7289DA', // Away (blue) 'hsl(0, calc(var(--saturation-factor, 1) * 0%), 47.5%)': '#747F8D', // Offline (gray) 'hsl(139, calc(var(--saturation-factor, 1) * 47.3%), 43.9%)': '#43B581', // Online (green) }; const IS_MOBILE = window .matchMedia("(pointer: coarse)") .matches; const TAB_CONTENT = `

RSCord Settings

Options
Custom CSS
`; function loadConfig() { try { return { ...DEFAULT_CONFIG, ...JSON.parse(localStorage_.getItem(CONFIG_KEY) || "{}") }; } catch { return { ...DEFAULT_CONFIG }; } } function saveConfig(patch) { const config = loadConfig(); const updated = { ...config, ...patch }; localStorage_.setItem(CONFIG_KEY, JSON.stringify(updated)); return updated; } async function addSwitches(container) { const config = loadConfig(); container.appendChild(createSwitch( "Push Notifications", "Sends you notifications even when you close the app", "push-notifications", await isPushRegistered(), async (checked) => { const publicKey = window.GLOBAL_ENV.VAPID_KEY; if (!publicKey) return false; try { checked ? await registerPush(publicKey) : await unregisterPush(); return true; } catch { return false; } } )); container.appendChild(createSwitch( "Revert Status Icons", "Revert the colorblind status icons added in 2019", "revert-status", config.revertStatusIcons, (checked) => saveConfig({ revertStatusIcons: checked }) )); } function revertStatusIcons() { const statusRects = document.querySelectorAll('rect[fill^="hsl"]'); for (const rect of statusRects) { const fill = rect.getAttribute("fill"); if (STATUS_COLOR_MAP[fill]) { rect.setAttribute("fill", STATUS_COLOR_MAP[fill]); } const maskRef = rect.getAttribute("mask"); if (!maskRef) continue; const maskId = maskRef.match(/#([^)]+)/)?.[1]; if (!maskId) continue; const mask = document.getElementById(maskId); if (!mask) continue; mask.querySelectorAll('[fill="black"]').forEach(el => el.remove()); } } function applyCustomCss() { const { customCss } = loadConfig(); let style = document.getElementById(CUSTOM_CSS_ID); if (!style) { style = document.createElement("style"); style.id = CUSTOM_CSS_ID; document.head.appendChild(style); } style.textContent = customCss; } function setupCssInput(textarea) { if (!textarea) return; const config = loadConfig(); textarea.value = config.customCss; const style = document.getElementById(CUSTOM_CSS_ID); if (!style) return; textarea.addEventListener("input", () => { style.textContent = textarea.value; saveConfig({ customCss: textarea.value }); }); } function addSettingsTab() { const advancedTab = document.querySelector(`.${CSS_CLASSES.tabItem}[aria-controls='advanced-tab']`); if (!advancedTab) return; if (document.getElementById(BUTTON_ID)) return; const settingsBtn = document.createElement("div"); settingsBtn.id = BUTTON_ID; settingsBtn.className = advancedTab.className; settingsBtn.role = "tab"; settingsBtn.tabIndex = -1; settingsBtn.ariaSelected = "false"; settingsBtn.textContent = "RSCord Settings"; settingsBtn.addEventListener("click", () => { const tabs = settingsBtn.parentElement.querySelectorAll('[role="tab"]'); tabs.forEach(tab => tab.classList.remove(CSS_CLASSES.selected)); tabs.forEach(tab => tab.setAttribute("aria-selected", "false")); settingsBtn.classList.add(CSS_CLASSES.selected); settingsBtn.setAttribute("aria-selected", "true"); let customContent = document.getElementById(CONTENT_CONTAINER_ID); if (!customContent) { customContent = document.createElement("div"); customContent.id = CONTENT_CONTAINER_ID; customContent.innerHTML = TAB_CONTENT; const switchContainer = customContent.querySelector(`#${SWITCH_CONTAINER_ID}`); addSwitches(switchContainer); document.querySelector(`.${CSS_CLASSES.contentColumn}`).appendChild(customContent); const cssInput = document.getElementById(CUSTOM_CSS_INPUT_ID); setupCssInput(cssInput); } const contentColumn = document.querySelector(`.${CSS_CLASSES.contentColumn}`); Array.from(contentColumn.children).forEach(child => { if (child.id !== CONTENT_CONTAINER_ID) child.style.display = "none"; }); customContent.style.display = "block"; }); advancedTab.insertAdjacentElement("afterend", settingsBtn); return true; } const observer = new MutationObserver(() => { if (document.querySelector(`.${CSS_CLASSES.settingsSidebar}`)) addSettingsTab(); if (loadConfig().revertStatusIcons) revertStatusIcons(); }); observer.observe(document.body, { childList: true, subtree: true }); applyCustomCss(); document.body.addEventListener("click", (e) => { const clickedHamburger = e.target.closest(`.${CSS_CLASSES.hamburger}`) if (clickedHamburger && IS_MOBILE) { const settingsRegion = document.querySelector(`.${CSS_CLASSES.settingsRegion}`) settingsRegion.classList.remove(CSS_CLASSES.hidden); const contentRegion = document.querySelector(`.${CSS_CLASSES.contentRegion}`) contentRegion.classList.add(CSS_CLASSES.hidden); } const clickedTab = e.target.closest('[role="tab"]'); if (!clickedTab) return; const allTabs = document.querySelectorAll('[role="tab"]'); allTabs.forEach(tab => tab.classList.remove(CSS_CLASSES.selected)); allTabs.forEach(tab => tab.setAttribute("aria-selected", "false")); clickedTab.classList.add(CSS_CLASSES.selected); clickedTab.setAttribute("aria-selected", "true"); const contentColumn = document.querySelector(`.${CSS_CLASSES.contentColumn}`); if (!contentColumn) return; if (clickedTab.id === BUTTON_ID) { Array.from(contentColumn.children).forEach(child => { if (child.id === CONTENT_CONTAINER_ID) { child.style.display = "block"; } else { child.style.display = "none"; } if (IS_MOBILE) { const settingsRegion = document.querySelector(`.${CSS_CLASSES.settingsRegion}`) settingsRegion.classList.add(CSS_CLASSES.hidden); const contentRegion = document.querySelector(`.${CSS_CLASSES.contentRegion}`) contentRegion.classList.remove(CSS_CLASSES.hidden); } }); } else { Array.from(contentColumn.children).forEach(child => { if (child.id !== CONTENT_CONTAINER_ID) child.style.display = ""; else child.style.display = "none"; }); } }); })();