- function _addSettingsLink() {
- const existingNav = document.querySelector('nav.center.margin-1');
-
- if (existingNav) {
- const newNav = document.createElement('nav');
- newNav.classList.add('center', 'margin-1');
- newNav.id = 'userscript-navigation';
-
- const newLink = document.createElement('a');
- newLink.href = '/help/userscripts/';
- newLink.textContent = 'Userscript Preferences';
-
- newNav.appendChild(newLink);
-
- existingNav.after(newNav);
- } else {
- console.error('Existing navigation element not found.');
- }
- }
-
- function _createLabel(labelText) {
- const labelContainer = document.createElement('div');
- labelContainer.classList.add('data', 'left');
-
- const label = document.createElement('span');
- label.textContent = labelText;
- labelContainer.appendChild(label);
- return labelContainer;
- }
-
- function _createInput(input) {
- const inputContainer = document.createElement('div');
- inputContainer.classList.add('data', 'flex-column', 'right');
- inputContainer.appendChild(input);
- return inputContainer;
- }
-
- function _addCallback(callbackFunction) {
- document.getElementById('userscript-update').addEventListener('click', callbackFunction);
- }
-
- async function _addCategoryHeader(categoryName) {
- if (!window.location.href.includes('/help/userscripts/')) return;
- await _checkSettingsSetup();
- const settings = document.querySelector('.market_grid.profile.prefs.margin-auto');
- const footer = document.querySelector('#userscript-preferences>.market_grid.profile.prefs.margin-auto>.footer.small-gap');
- if (!settings) {
- console.error('Settings not found.');
- return;
- }
-
- const headers = Array.from(settings.querySelectorAll('.header'));
- let header = headers.find(header => header.textContent.trim() === categoryName);
-
- if (!header) {
- header = document.createElement('div');
- header.classList.add('header');
- header.innerHTML = `<strong>${categoryName}</strong>`;
-
- const insertionPoint = headers.find(existingHeader => existingHeader.textContent.trim().localeCompare(categoryName) > 0);
-
- if (insertionPoint) {
- insertionPoint.insertAdjacentElement('beforebegin', header);
- } else {
- footer.insertAdjacentElement('beforebegin', header);
- }
- }
-
- return header;
- }
-
- async function addTextInput(categoryName, settingName, labelText, currentSetting = undefined, callbackFunction = undefined) {
- if (!window.location.href.includes('/help/userscripts/')) throw Error('Attempted to add setting outside of settings page.'); const header = await _addCategoryHeader(categoryName);
-
- if (currentSetting === undefined) {
- currentSetting = await GM.getValue(settingName, '');
- }
-
- const textInput = document.createElement('input');
- textInput.type = 'text';
- textInput.name = settingName;
- textInput.value = currentSetting;
-
- const label = _createLabel(labelText);
- header.insertAdjacentElement('afterend', label);
-
- const inputElement = _createInput(textInput);
- label.insertAdjacentElement('afterend', inputElement);
-
- if (callbackFunction) {
- _addCallback(() => callbackFunction(settingName, textInput.value));
- } else {
- _addCallback(async () => await GM.setValue(settingName, checkbox.checked));
- }
- }
-
- async function addNumberInput(categoryName, settingName, labelText, min = 0, max = 100, step = 1, currentSetting = undefined, callbackFunction = undefined) {
- if (!window.location.href.includes('/help/userscripts/')) throw Error('Attempted to add setting outside of settings page.'); const header = await _addCategoryHeader(categoryName);
- if (currentSetting === undefined) {
- currentSetting = await GM.getValue(settingName, min);
- }
-
- const numberInput = document.createElement('input');
- numberInput.type = 'number';
- numberInput.name = settingName;
- numberInput.value = currentSetting;
- numberInput.min = min;
- numberInput.max = max;
- numberInput.step = step;
-
- const label = _createLabel(labelText);
- header.insertAdjacentElement('afterend', label);
-
- const inputElement = _createInput(numberInput);
- label.insertAdjacentElement('afterend', inputElement);
-
- if (callbackFunction) {
- _addCallback(() => callbackFunction(settingName, numberInput.value));
- } else {
- _addCallback(async () => await GM.setValue(settingName, checkbox.checked));
- }
- }
-
- async function addCheckboxInput(categoryName, settingName, labelText, currentSetting = undefined, callbackFunction = undefined) {
- if (!window.location.href.includes('/help/userscripts/')) throw Error('Attempted to add setting outside of settings page.'); const header = await _addCategoryHeader(categoryName);
- if (currentSetting === undefined) {
- currentSetting = await GM.getValue(settingName, false);
- }
-
- const checkbox = document.createElement('input');
- checkbox.type = 'checkbox';
- checkbox.name = settingName;
- checkbox.checked = currentSetting;
-
- const label = _createLabel(labelText);
- header.insertAdjacentElement('afterend', label);
-
- const inputElement = _createInput(checkbox);
- label.insertAdjacentElement('afterend', inputElement);
-
- if (callbackFunction) {
- _addCallback(() => callbackFunction(settingName, checkbox.checked));
- } else {
- _addCallback(async () => await GM.setValue(settingName, checkbox.checked));
- }
- }
-
- async function addDropdown(categoryName, settingName, labelText, options, currentSetting = undefined, callbackFunction = undefined) {
- if (!window.location.href.includes('/help/userscripts/')) throw Error('Attempted to add setting outside of settings page.');
- const header = await _addCategoryHeader(categoryName);
- if (currentSetting === undefined) {
- currentSetting = await GM.getValue(settingName, options[0].value);
- }
-
- const select = document.createElement('select');
- select.name = settingName;
- select.classList.add('form-control');
-
- options.forEach(option => {
- const optionElement = document.createElement('option');
- optionElement.value = option.value;
- optionElement.textContent = option.text;
- if (option.value === currentSetting) {
- optionElement.selected = true;
- }
- select.appendChild(optionElement);
- });
-
- const label = _createLabel(labelText);
- header.insertAdjacentElement('afterend', label);
-
- const inputElement = _createInput(select);
- label.insertAdjacentElement('afterend', inputElement);
-
- if (callbackFunction) {
- _addCallback(() => callbackFunction(settingName, select.value));
- } else {
- _addCallback(async () => await GM.setValue(settingName, checkbox.checked));
- }
- }
-
- function _replaceBannerImage() {
- const bannerImage = document.getElementById('top-header-image');
- if (bannerImage) {
- bannerImage.src = 'https://grundoscafe.b-cdn.net/misc/banners/userinfo.gif';
- } else {
- console.error('Banner image not found.');
- }
- }
-
- function _setupShareSettings() {
- const urlPattern = /\/help\/(?:profile|siteprefs|sidebar|randomevents)\/|\/discord\//;
- const settings = window.location.href.includes('/help/userscripts/');
- const help = urlPattern.test(window.location.href) && !settings;
- if (help) {
- _addSettingsLink();
- } else if (settings) {
- _replaceBannerImage();
- const element = document.querySelector('main');
- if (element) {
- element.id = 'userscript-preferences';
- element.innerHTML = `
- <h1>Userscript Preferences</h1>
- <nav class="center margin-1">
- <a href="/help/profile/">Edit Profile</a> |
- <a href="/help/siteprefs/">Site Preferences</a> |
- <a href="/help/sidebar/">Edit Sidebar</a> |
- <a href="/discord/">Discord</a> |
- <a href="/help/randomevents/">Random Event Log</a>
- </nav>
- <nav class="center margin-1" id="userscript-navigation"><a href="/help/userscripts/">Userscript Preferences</a></nav>
- <p>Here you can adjust settings for participating userscripts.</p>
- <div class="market_grid profile prefs margin-auto">
- <div class="footer small-gap">
- <input class="form-control half-width" type="submit" value="Update Preferences" id="userscript-update">
- </div>
- </div>
- `;
- }
- }
- }
-
- async function _checkSettingsSetup() {
- return new Promise((resolve, reject) => {
- const interval = setInterval(() => {
- if (document.getElementById('userscript-preferences') !== null) {
- clearInterval(interval);
- clearTimeout(timeout);
- resolve(true);
- }
- }, 50);
-
- const timeout = setTimeout(() => {
- clearInterval(interval);
- reject(new Error('Timeout: userscript-preferences element not found within 10 seconds'));
- }, 10000);
- });
- }
-
- if (!document.getElementById('userscript-navigation')) {
- console.log("settings running");
- _setupShareSettings();
- }