const Plugin = require('../plugin');
function makePluginToggle(opts = {}) {
const a = window.ED.classMaps.alignment;
const sw = window.ED.classMaps.switchItem;
const cb = window.ED.classMaps.checkbox;
const b = window.ED.classMaps.buttons;
const d = window.ED.classMaps.description;
const settingsButton = ``;
return `
${opts.title}
${opts.color ? `
` : ''}
${opts.showSettingsButton ? settingsButton : ''}
${opts.id == 'bdPlugins' ? '' : `
`}
${opts.desc ? opts.desc : '
No Description Provided
`;
}
module.exports = new Plugin({
name: 'ED Settings',
author: 'Joe 🎸#7070',
description: 'Adds an EnhancedDiscord tab in user settings.',
color: 'darkred',
load: async function() {
const parentThis = this; //Allow use of parent methods in sub functions
if (!window.ED.classMaps) {
window.ED.classMaps = {};
}
const tabsM = window.EDApi.findModule('topPill');
const divM = window.EDApi.findModule(m => m.divider && Object.keys(m).length === 1)
const contentM = window.ED.classMaps.headers = window.EDApi.findModule('defaultMarginh2');
const marginM = window.ED.classMaps.margins = window.EDApi.findModule('marginBottom8');
const div = window.ED.classMaps.divider = divM ? divM.divider : '';
const cbM = window.ED.classMaps.checkbox = window.EDApi.findModule('checkboxEnabled');
const buttM = window.ED.classMaps.buttons = window.EDApi.findModule('lookFilled');
const concentCol = window.EDApi.findModule('contentColumn');
window.ED.classMaps.switchItem = window.EDApi.findModule('switchItem');
window.ED.classMaps.alignment = window.EDApi.findModule('horizontalReverse');
window.ED.classMaps.description = window.EDApi.findModule('formText');
// use this function to trigger the loading of the settings tabs. No MutationObservers this way :)
const gss = window.EDApi.findModule('getUserSettingsSections').default.prototype;
window.EDApi.monkeyPatch(gss, 'render', function() {
const tab = document.getElementsByClassName('ed-settings');
//console.log(tab);
if (!tab || tab.length < 1) {
const parent = document.querySelector('.' + tabsM.side);
if (!parent) {
setTimeout(() => {arguments[0].thisObject.forceUpdate();}, 100);
return arguments[0].callOriginalMethod(arguments[0].methodArguments);
}
const anchor = parent.querySelectorAll(`.${tabsM.separator}`)[3];
if (!anchor)
return arguments[0].callOriginalMethod(arguments[0].methodArguments);
const header = document.createElement('div');
header.className = tabsM.header + ' ed-settings';
header.innerHTML = 'EnhancedDiscord';
anchor.parentNode.insertBefore(header, anchor.nextSibling);
const pluginsTab = document.createElement('div');
const tabClass = `${tabsM.item} ${tabsM.themed} ed-settings`;
pluginsTab.className = tabClass;
pluginsTab.innerHTML = 'Plugins';
header.parentNode.insertBefore(pluginsTab, header.nextSibling);
const settingsTab = document.createElement('div');
settingsTab.className = tabClass;
settingsTab.innerHTML = 'Settings';
pluginsTab.parentNode.insertBefore(settingsTab, pluginsTab.nextSibling);
const sep = document.createElement('div');
sep.className = tabsM.separator;
settingsTab.parentNode.insertBefore(sep, settingsTab.nextSibling);
parent.onclick = function(e) {
if (!e.target.className || e.target.className.indexOf(tabsM.item) == -1 || e.target.innerHTML === 'Change Log') return;
for (const i in tab) {
tab[i].className = (tab[i].className || '').replace(" " + tabsM.selected, '')
}
}
pluginsTab.onclick = function(e) {
const settingsPane = document.querySelector(`.${concentCol.standardSidebarView} .${concentCol.contentColumn} > div`);
const otherTab = document.querySelector('.' + tabsM.item + '.' + tabsM.selected);
if (otherTab) {
otherTab.className = otherTab.className.replace(" " + tabsM.selected, '');
}
this.className += ` ${tabsM.selected}`;
if (settingsPane) {
// ED Header
settingsPane.innerHTML = `
EnhancedDiscord Plugins
`;
// Open Plugins Folder Button
settingsPane.innerHTML += `
`;
// Divider
settingsPane.innerHTML += `
`
for (const id in window.ED.plugins) {
//if (id == 'ed_settings') continue;
settingsPane.innerHTML += makePluginToggle({id, title: window.ED.plugins[id].name, desc: window.ED.plugins[id].description, color: window.ED.plugins[id].color || 'orange', showSettingsButton: typeof window.ED.plugins[id].getSettingsPanel == 'function'});
if (!window.ED.plugins[id].settings || window.ED.plugins[id].settings.enabled !== false) {
const cb = document.getElementById(id);
if (cb && cb.className)
cb.className = cb.className.replace(cbM.valueUnchecked, cbM.valueChecked);
}
}
document.getElementById("ed-openPluginsFolder").onclick = function () {
const s = require("electron").shell.openItem(require("path").join(process.env.injDir, "plugins"))
if (s === false) console.error("[EnhancedDiscord] Unable to open external folder.")
}
}
e.stopPropagation(); // prevent from going to parent click handler
}
settingsTab.onclick = function(e) {
const settingsPane = document.querySelector(`.${concentCol.standardSidebarView} .${concentCol.contentColumn} > div`);
const otherTab = document.querySelector('.' + tabsM.item + '.' + tabsM.selected);
if (otherTab) {
otherTab.className = otherTab.className.replace(" " + tabsM.selected, '');
}
this.className += ` ${tabsM.selected}`;
if (settingsPane) {
settingsPane.innerHTML = `
EnhancedDiscord Configuration
`;
settingsPane.innerHTML += makePluginToggle({id: 'bdPlugins', title: 'BD Plugins', desc: "Allows ED to load BD plugins natively. (Reload with ctrl+r after enabling/disabling.)"});
const bl = document.getElementById('bdPlugins');
if (bl && window.ED.config.bdPlugins == true)
bl.className = bl.className.replace(cbM.valueUnchecked, cbM.valueChecked);
//console.log(st, at);
for (const id in window.ED.plugins) {
if (window.ED.plugins[id].getSettingsPanel && typeof window.ED.plugins[id].getSettingsPanel == 'function') continue;
if (!window.ED.plugins[id].config || window.ED.config[id].enabled === false || !window.ED.plugins[id].generateSettings) continue;
settingsPane.innerHTML += `
${window.ED.plugins[id].name}
`;
settingsPane.innerHTML += window.ED.plugins[id].generateSettings();
settingsPane.innerHTML += `
`;
if (window.ED.plugins[id].settingListeners) {
setTimeout(() => { // let shit render
for(const eventObject in window.ED.plugins[id].settingListeners){
const currentSettingListener = window.ED.plugins[id].settingListeners[eventObject];
//Check if plugin is using the old format
if(Array.isArray(window.ED.plugins[id].settingListeners)){
const elem = settingsPane.querySelector(currentSettingListener.el);
if (elem)
elem.addEventListener(currentSettingListener.type, currentSettingListener.eHandler);
} else {
const elem = settingsPane.querySelector(eventObject);
if (elem){
parentThis.warn(`Plugin ${window.ED.plugins[id].name} is using a deprecated plugin format (New format: https://github.com/joe27g/EnhancedDiscord/blob/beta/plugins.md#advanced-plugin-functionality). Ignore this unless you're the plugin dev`)
elem.onclick = window.ED.plugins[id].settingListeners[eventObject];
}
}
}
}, 5);
}
}
}
e.stopPropagation(); // prevent from going to parent click handler
}
document.querySelector(`.${concentCol.standardSidebarView} .${concentCol.contentColumn}`).onclick = function(e) {
const parent = e.target.parentElement;
if (e.target.className && ((parent.className.indexOf && parent.className.indexOf('ed-plugin-settings') > -1) || (e.target.className.indexOf && e.target.className.indexOf('ed-plugin-settings') > -1))) {
const box = e.target.className === buttM.contents ? parent.nextElementSibling.nextElementSibling : e.target.nextElementSibling.nextElementSibling;
if (!box || !box.id || !window.ED.plugins[box.id] || box.className.indexOf(cbM.valueChecked) == -1 || !window.ED.config.bdPlugins) return;
return require('../bd_shit').showSettingsModal(window.ED.plugins[box.id]);
}
if (e.target.className && ((parent.className.indexOf && parent.className.indexOf('ed-plugin-reload') > -1) || (e.target.className.indexOf && e.target.className.indexOf('ed-plugin-reload') > -1))) {
const button = e.target.className === buttM.contents ? e.target : e.target.firstElementChild;
const plugin = e.target.className === buttM.contents ? e.target.parentElement.nextElementSibling : e.target.nextElementSibling;
//console.log(plugin);
if (!plugin || !plugin.id || !window.ED.plugins[plugin.id] || plugin.className.indexOf(cbM.valueChecked) == -1) return;
button.innerHTML = 'Reloading...';
try {
window.ED.plugins[plugin.id].reload();
button.innerHTML = 'Reloaded!';
} catch(err) {
console.error(err);
button.innerHTML = `Failed to reload (${err.name} - see console.)`;
}
setTimeout(() => {
try { button.innerHTML = 'Reload'; } catch(err){/*do nothing*/}
}, 3000);
return;
}
if (e.target.tagName !== 'INPUT' || e.target.type !== 'checkbox' || !parent || !parent.className || !parent.id) return;
const p = window.ED.plugins[parent.id];
if (!p && parent.id !== 'bdPlugins') return;
//console.log('settings for '+p.id, p.settings);
if (parent.className.indexOf(cbM.valueChecked) > -1) {
if (p) {
if (p.settings.enabled === false) return;
p.settings.enabled = false;
window.ED.plugins[parent.id].settings = p.settings;
p.unload();
}
else {
const edc = window.ED.config;
if (!edc[parent.id]) return;
edc[parent.id] = false;
window.ED.config = edc;
}
parent.className = parent.className.replace(cbM.valueChecked, cbM.valueUnchecked);
} else {
if (p) {
if (p.settings.enabled !== false) return;
p.settings.enabled = true;
window.ED.plugins[parent.id].settings = p.settings;
p.load();
}
else {
const edc = window.ED.config;
if (edc[parent.id] === true) return;
edc[parent.id] = true;
window.ED.config = edc;
}
parent.className = parent.className.replace(cbM.valueUnchecked, cbM.valueChecked);
}
}
}
return arguments[0].callOriginalMethod(arguments[0].methodArguments);
})
},
unload: function() {
window.EDApi.findModule('getUserSettingsSections').default.prototype.render.unpatch();
}
});