+
+
${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();
+ }
+});
diff --git a/files/.config/EnhancedDiscord/plugins/friend_count.js b/files/.config/EnhancedDiscord/plugins/friend_count.js
new file mode 100644
index 0000000..1e18827
--- /dev/null
+++ b/files/.config/EnhancedDiscord/plugins/friend_count.js
@@ -0,0 +1,91 @@
+const Plugin = require('../plugin');
+
+function makeToggle() {
+ 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;
+
+ return `
+
+
+
Online Friends
+
+
+
+
+
+
+
Only show the number of friends online rather than all friends.
+
`;
+}
+
+module.exports = new Plugin({
+ name: 'Friend Count',
+ author: 'Joe 🎸#7070',
+ description: "Adds the number of friends/online friends under the \"Home\" button in the top left.",
+ color: 'cornflowerblue',
+
+ config: {
+ onlineOnly: {default: false}
+ },
+
+ load: async function() {
+ const sep = window.findModule('guildSeparator'), ms = window.findModule('modeSelectable');
+
+ const gg = function(b) {
+ if (!sep) return;
+ const o = (module.exports.settings || {}).onlineOnly;
+ const num = o ? window.findModule("getOnlineFriendCount").getOnlineFriendCount() : window.findModule("getFriendIDs").getFriendIDs().length;
+
+ let friendCount = document.getElementById('ed_friend_count');
+ if (friendCount) {
+ if (num === this._num) return; // don't update if # is the same as before
+ friendCount.innerHTML = num + (o ? ' Online' : ' Friends');
+ this._num = num;
+ return;
+ }
+ let separator = document.querySelector(`.${sep.guildSeparator}`);
+ if (separator) {
+ friendCount = document.createElement('div');
+ friendCount.className = `${ms ? ms.description+' ' : ''}${sep.listItem}`;
+ friendCount.innerHTML = num + (o ? ' Online' : ' Friends');
+ friendCount.id = 'ed_friend_count';
+ try {
+ separator.parentElement.insertAdjacentElement('beforebegin', friendCount);
+ this._num = num;
+ } catch(err) {
+ this.error(err);
+ }
+ }
+ };
+ const x = window.findModule('getGuilds');
+ findModule('subscribe').subscribe('CONNECTION_OPEN', x.getGuilds);
+ window.monkeyPatch(x, 'getGuilds', {silent: true, after: gg});
+ },
+ unload: function() {
+ let m = window.findModule('getGuilds').getGuilds;
+ if (m && m.__monkeyPatched)
+ m.unpatch();
+ let friendCount = document.getElementById('ed_friend_count');
+ if (friendCount)
+ friendCount.remove();
+ },
+ generateSettings: makeToggle,
+ settingListeners: [{
+ el: '#fc_online',
+ type: 'click',
+ eHandler: function(e) {
+ const cb = window.ED.classMaps.checkbox;
+ module.exports.settings = {onlineOnly: !(module.exports.settings || {}).onlineOnly};
+ if (module.exports.settings.onlineOnly) {
+ this.classList.remove(cb.valueUnchecked.split(' ')[0]);
+ this.classList.add(cb.valueChecked.split(' ')[0]);
+ } else {
+ this.classList.remove(cb.valueChecked.split(' ')[0]);
+ this.classList.add(cb.valueUnchecked.split(' ')[0]);
+ }
+ }
+ }]
+});
diff --git a/files/.config/EnhancedDiscord/plugins/guild_count.js b/files/.config/EnhancedDiscord/plugins/guild_count.js
new file mode 100644
index 0000000..ef6104f
--- /dev/null
+++ b/files/.config/EnhancedDiscord/plugins/guild_count.js
@@ -0,0 +1,53 @@
+const Plugin = require('../plugin');
+
+let sep = {}, ms = {}, gg, sub;
+
+module.exports = new Plugin({
+ name: 'Server Count',
+ author: 'Joe 🎸#7070',
+ description: "Adds the number of servers you're currently in right above the list.",
+ color: 'indigo',
+
+ load: async function() {
+ sep = window.EDApi.findModule('guildSeparator');
+ ms = window.EDApi.findModule('modeSelectable');
+ gg = window.EDApi.findModule('getGuilds');
+ sub = window.EDApi.findModule('subscribe');
+
+ window.EDApi.monkeyPatch(gg, 'getGuilds', {after: this.refreshCount, silent: true});
+ sub.subscribe('CONNECTION_OPEN', gg.getGuilds);
+ },
+ refreshCount: function(b) {
+ if (!sep) return;
+ const num = Object.keys(b.returnValue).length;
+
+ let guildCount = document.getElementById('ed_guild_count');
+ if (guildCount) {
+ if (num === this._num) return; // don't update if # is the same as before
+ guildCount.innerHTML = num + ' Servers';
+ this._num = num;
+ return;
+ }
+ const separator = document.querySelector(`.${sep.guildSeparator}`);
+ if (separator) {
+ guildCount = document.createElement('div');
+ guildCount.className = `${ms ? ms.description+' ' : ''}${sep.listItem}`;
+ guildCount.innerHTML = num + ' Servers';
+ guildCount.id = 'ed_guild_count';
+ try {
+ separator.parentElement.insertAdjacentElement('beforebegin', guildCount);
+ this._num = num;
+ } catch(err) {
+ this.error(err);
+ }
+ }
+ return;
+ },
+ unload: function() {
+ gg.getGuilds.unpatch();
+ const guildCount = document.getElementById('ed_guild_count');
+ if (guildCount)
+ guildCount.remove();
+ sub.unsubscribe('CONNECTION_OPEN', gg.getGuilds);
+ }
+});
diff --git a/files/.config/EnhancedDiscord/plugins/hidden_channels.js b/files/.config/EnhancedDiscord/plugins/hidden_channels.js
new file mode 100644
index 0000000..9c342a0
--- /dev/null
+++ b/files/.config/EnhancedDiscord/plugins/hidden_channels.js
@@ -0,0 +1,220 @@
+const Plugin = require('../plugin');
+
+let getChannel, g_dc, g_cat, ha, disp, chanM, fm, reb, sv, cs, csp, ghp, gs, gsr, pf, sw = {}, g = {}, ai = {};
+
+// copied from Discord's minified JS
+function N(e,o,l,n){let r;r||(r="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103);const t=e&&e.defaultProps,f=arguments.length-3;if(o||0===f||(o={children:void 0}),o&&t)for(const e in t)void 0===o[e]&&(o[e]=t[e]);else o||(o=t||{});if(1===f)o.children=n;else if(f>1){const e=new Array(f);for(let o=0;o
m.group && m.item);
+ ai = window.EDApi.findModule('actionIcon');
+
+ const getUser = window.EDApi.findModule('getCurrentUser').getCurrentUser;
+ const getAllChannels = window.EDApi.findModule('getChannels').getChannels;
+ const can = window.EDApi.findModule('computePermissions').can;
+
+ g_dc = window.EDApi.findModule('getDefaultChannel');
+ window.EDApi.monkeyPatch(g_dc, 'getChannels', b => {
+ const og = b.callOriginalMethod(b.methodArguments);
+ if (!b.methodArguments[0]) return og;
+ const hidden = [], allChans = getAllChannels();
+ for (const i in allChans) {
+ if (allChans[i].guild_id === b.methodArguments[0]) {
+ if (allChans[i].type !== 4 && !can(1024, getUser(), getChannel(allChans[i].id))) {
+ hidden.push(allChans[i]);
+ }
+ }
+ }
+ og.HIDDEN = hidden;
+ return og;
+ });
+ chanM = window.EDApi.findModule(m => m.prototype && m.prototype.isManaged);
+ chanM.prototype.isHidden = function() {
+ return [0, 4, 5].includes(this.type) && !can(1024, getUser(), this);
+ }
+
+ g_cat = window.EDApi.findModule(m => m.getCategories && !m.EMOJI_NAME_RE);
+ window.EDApi.monkeyPatch(g_cat, 'getCategories', b => {
+ const og = b.callOriginalMethod(b.methodArguments);
+ const chs = g_dc.getChannels(b.methodArguments[0]);
+ chs.HIDDEN.forEach(c => {
+ const result = og[c.parent_id || "null"].filter(item => item.channel.id === c.id);
+ if (result.length) return; // already added
+ og[c.parent_id || "null"].push({channel: c, index: 0})
+ });
+ return og;
+ });
+
+ ha = window.EDApi.findModule('hasUnread').__proto__;
+ window.EDApi.monkeyPatch(ha, 'hasUnread', function(b) {
+ if (getChannel(b.methodArguments[0]) && getChannel(b.methodArguments[0]).isHidden())
+ return false; // don't show hidden channels as unread.
+ return b.callOriginalMethod(b.methodArguments);
+ });
+ window.EDApi.monkeyPatch(ha, 'hasUnreadPins', function(b) {
+ if (getChannel(b.methodArguments[0]) && getChannel(b.methodArguments[0]).isHidden())
+ return false; // don't show icon on hidden channel pins.
+ return b.callOriginalMethod(b.methodArguments);
+ });
+
+ disp.subscribe("CHANNEL_SELECT", module.exports.dispatchSubscription);
+
+ fm = window.EDApi.findModule("fetchMessages");
+ window.EDApi.monkeyPatch(fm, "fetchMessages", function(b) {
+ if (getChannel(b.methodArguments[0]) && getChannel(b.methodArguments[0]).isHidden()) return;
+ return b.callOriginalMethod(b.methodArguments);
+ });
+
+ const clk = window.EDApi.findModuleByDisplayName("Clickable")
+ //const icon = window.EDApi.findModuleByDisplayName("Icon");
+
+ reb = window.EDApi.findModule(m => m.default && m.default.prototype && m.default.prototype.renderEditButton).default.prototype;
+ /*window.EDApi.monkeyPatch(reb, "renderEditButton", function(b) {
+ return N(clk, {
+ className: ai.iconItem,
+ onClick: function() {
+ module.exports._editingGuild = null;
+ module.exports._editingChannel = b.thisObject.props.channel.id;
+ return b.thisObject.handleEditClick.apply(b.thisObject, arguments);
+ },
+ onMouseEnter: b.thisObject.props.onMouseEnter,
+ onMouseLeave: b.thisObject.props.onMouseLeave
+ }, void 0, N(icon, {
+ name: "Gear",
+ width: 16,
+ height: 16,
+ className: ai.actionIcon
+ }));
+ });*/
+
+ sv = window.EDApi.findModuleByDisplayName("SettingsView").prototype;
+ window.EDApi.monkeyPatch(sv, 'getPredicateSections', {before: b => {
+ const permSect = b.thisObject.props.sections.find(item => item.section === 'PERMISSIONS');
+ if (permSect) permSect.predicate = () => true;
+ }, silent: true});
+
+ cs = window.EDApi.findModuleByDisplayName("FluxContainer(ChannelSettings)").prototype;
+ window.EDApi.monkeyPatch(cs, 'render', b => {
+ const egg = b.callOriginalMethod(b.methodArguments);
+ egg.props.canManageRoles = true;
+ return egg;
+ });
+
+ csp = window.EDApi.findModuleByDisplayName("FluxContainer(ChannelSettingsPermissions)").prototype;
+ window.EDApi.monkeyPatch(csp, 'render', b => {
+ const egg = b.callOriginalMethod(b.methodArguments);
+ const chan = getChannel(egg.props.channel.id);
+ if (!chan || !chan.isHidden()) return egg;
+ egg.props.canSyncChannel = false;
+ egg.props.locked = true;
+ setTimeout(() => {
+ document.querySelectorAll('.'+g.group).forEach(elem => elem.style = "opacity: 0.5; pointer-events: none;");
+ });
+ return egg;
+ });
+
+ ghp = window.EDApi.findModuleByDisplayName("FluxContainer(GuildHeaderPopout)").prototype;
+ window.EDApi.monkeyPatch(ghp, 'render', b => {
+ const egg = b.callOriginalMethod(b.methodArguments);
+ egg.props.canAccessSettings = true;
+ return egg;
+ });
+
+ gs = window.EDApi.findModuleByDisplayName("FluxContainer(GuildSettings)").prototype;
+ window.EDApi.monkeyPatch(gs, 'render', b => {
+ const egg = b.callOriginalMethod(b.methodArguments);
+ module.exports._editingChannel = null;
+ module.exports._editingGuild = egg.props.guild.id;
+ egg.props.canManageRoles = true;
+ return egg;
+ });
+
+ const cancan = window.EDApi.findModuleByProps('can', 'canUser').can;
+ gsr = window.EDApi.findModuleByDisplayName("FluxContainer(GuildSettingsRoles)").prototype;
+ window.EDApi.monkeyPatch(gsr, 'render', b => {
+ const egg = b.callOriginalMethod(b.methodArguments);
+ const hasPerm = cancan(268435456, { guildId: egg.props.guild.id });
+ if (hasPerm) return;
+ setTimeout(() => {
+ document.querySelectorAll('.'+sw.switchItem).forEach(elem => elem.classList.add(sw.disabled));
+ });
+ return egg;
+ });
+
+ const getGuild = window.EDApi.findModule('getGuild').getGuild;
+ pf = window.EDApi.findModuleByDisplayName("PermissionsForm").prototype;
+ window.EDApi.monkeyPatch(pf, 'render', b => {
+ const egg = b.callOriginalMethod(b.methodArguments);
+ const guild = module.exports._editingGuild ? getGuild(module.exports._editingGuild) : null;
+ const channel = module.exports._editingChannel ? getChannel(module.exports._editingChannel) : null;
+ if (!guild && !channel) return egg;
+ const hasPerm = cancan(268435456, guild ? { guildId: guild.id } : { channelId: channel.id });
+ if (hasPerm) return;
+
+ if (!egg.props.children || !egg.props.children[1]) return egg;
+ egg.props.children[1].forEach(item => {item.disabled = true; item.props.disabled = true;});
+ return egg;
+ });
+ },
+ unload: function() {
+ g_dc.getChannels.unpatch();
+ g_cat.getCategories.unpatch();
+ ha.hasUnread.unpatch();
+ ha.hasUnreadPins.unpatch();
+ fm.fetchMessages.unpatch();
+ reb.renderEditButton.unpatch();
+
+ for (const mod of [sv, cs, csp, ghp, gs, gsr, pf])
+ if (mod && mod.render && mod.render.unpatch) mod.render.unpatch();
+
+ disp.unsubscribe("CHANNEL_SELECT", module.exports.dispatchSubscription);
+ },
+ dispatchSubscription: function (data) {
+ if (data.type !== "CHANNEL_SELECT") return;
+
+ if (getChannel(data.channelId) && getChannel(data.channelId).isHidden()) {
+ setTimeout(module.exports.attachHiddenChanNotice);
+ }
+ },
+ attachHiddenChanNotice: function () {
+ const messagesWrapper = document.querySelector(`.${window.EDApi.findModule("messages").messagesWrapper}`);
+ if (!messagesWrapper) return;
+
+ messagesWrapper.firstChild.style.display = "none"; // Remove messages shit.
+ messagesWrapper.parentElement.children[1].style.display = "none"; // Remove message box.
+ messagesWrapper.parentElement.parentElement.children[1].style.display = "none"; // Remove user list.
+
+ const toolbar = document.querySelector("."+window.EDApi.findModule(m => {
+ if (m instanceof Window) return;
+ if (m.toolbar && m.selected) return m;
+ }).toolbar);
+
+ toolbar.style.display = "none";
+
+ const hiddenChannelNotif = document.createElement("div");
+
+ // Class name modules
+ const txt = window.EDApi.findModule("h5");
+ const flx = window.EDApi.findModule("flex");
+
+ hiddenChannelNotif.className = flx.flexCenter;
+ hiddenChannelNotif.style.width = "100%";
+
+ hiddenChannelNotif.innerHTML = `
+
+
This is a hidden channel.
+ You cannot see the contents of this channel. However, you may see its name and topic.
+ `;
+
+ messagesWrapper.appendChild(hiddenChannelNotif);
+ }
+});
diff --git a/files/.config/EnhancedDiscord/plugins/quick_save.js b/files/.config/EnhancedDiscord/plugins/quick_save.js
new file mode 100644
index 0000000..d9707e7
--- /dev/null
+++ b/files/.config/EnhancedDiscord/plugins/quick_save.js
@@ -0,0 +1,39 @@
+const Plugin = require('../plugin');
+
+module.exports = new Plugin({
+ name: 'Quick Save',
+ author: 'Joe 🎸#7070',
+ description: 'Use Ctrl+S or Cmd+S to save server, channel, or account settings.',
+ color: 'salmon',
+
+ load: async function() {
+ const hcModules = window.EDApi.findAllModules('hasChanges');
+ this._listener = function(e) {
+ if ((window.navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey) && e.keyCode == 83) {
+ e.preventDefault();
+ const types = ['GUILD', 'CHANNEL', 'ACCOUNT', 'GUILD ROLES', 'CHANNEL OVERWRITES'];
+ let hasChanges = false;
+ for (const i in types) {
+ if (hcModules[i] && hcModules[i].hasChanges()) {
+ hasChanges = true;
+ //module.exports.log(`saving ${types[i]} settings`);
+ break;
+ }
+ }
+ if (!hasChanges) {
+ //module.exports.log('No setting changes detected. Aborting.');
+ return;
+ }
+ const saveButton = document.querySelector('[class*="lookFilled-"][class*="colorGreen-"]');
+ if (saveButton)
+ try { saveButton.click(); } catch(err) { module.exports.error(err); }
+ return;
+ }
+ }
+ document.addEventListener("keydown", this._listener, false);
+ },
+ unload: function() {
+ document.removeEventListener("keydown", this._listener);
+ delete this._listener;
+ }
+});
diff --git a/files/.config/EnhancedDiscord/plugins/silence.js b/files/.config/EnhancedDiscord/plugins/silence.js
new file mode 100644
index 0000000..bf1b1a9
--- /dev/null
+++ b/files/.config/EnhancedDiscord/plugins/silence.js
@@ -0,0 +1,22 @@
+const Plugin = require('../plugin');
+
+module.exports = new Plugin({
+ name: 'Shut up, Clyde',
+ author: 'Joe 🎸#7070',
+ description: "Silences Clyde saying stupid shit about Nitro, for users that don't have it.",
+ color: '#7289da',
+
+ load: async function() {
+ const gg = window.EDApi.findModule(m => m.getChannelId && m.getGuildId && !m.getPings), bs = window.EDApi.findModule('Messages').Messages;
+
+ window.EDApi.monkeyPatch(window.EDApi.findModule('sendBotMessage'), 'sendBotMessage', function (b) {
+ if (gg.getGuildId() !== null) return; // don't send Clyde messages when looking at a server
+ const message = b.methodArguments[1];
+ if (message == bs.INVALID_ANIMATED_EMOJI_BODY_UPGRADE || message == bs.INVALID_ANIMATED_EMOJI_BODY || message == bs.INVALID_EXTERNAL_EMOJI_BODY_UPGRADE || message == bs.INVALID_EXTERNAL_EMOJI_BODY) return;
+ return b.callOriginalMethod(b.methodArguments);
+ });
+ },
+ unload: function() {
+ window.EDApi.findModule('sendBotMessage').sendBotMessage.unpatch();
+ }
+});
diff --git a/files/.config/EnhancedDiscord/plugins/silent_typing.js b/files/.config/EnhancedDiscord/plugins/silent_typing.js
new file mode 100644
index 0000000..47faea6
--- /dev/null
+++ b/files/.config/EnhancedDiscord/plugins/silent_typing.js
@@ -0,0 +1,16 @@
+const Plugin = require('../plugin');
+
+module.exports = new Plugin({
+ name: 'Silent Typing',
+ author: 'Joe 🎸#7070',
+ description: `Never appear as typing in any channel.`,
+ color: 'grey',
+ disabledByDefault: true,
+
+ load: async function() {
+ window.EDApi.monkeyPatch(window.EDApi.findModule('startTyping'), 'startTyping', () => {});
+ },
+ unload: function() {
+ window.EDApi.findModule('startTyping').startTyping.unpatch();
+ }
+});
diff --git a/files/.config/EnhancedDiscord/plugins/style.css b/files/.config/EnhancedDiscord/plugins/style.css
new file mode 100644
index 0000000..3e4f5cb
--- /dev/null
+++ b/files/.config/EnhancedDiscord/plugins/style.css
@@ -0,0 +1,57 @@
+@import url(https://enhanceddiscord.com/theme.css);
+
+/* theme settings - uncomment (by removing the /*) and modify these lines in order to change things */
+:root {
+/* --bg: url(https://i.imgur.com/ybRUHPc.jpg); /* background for the entire window. Almost everything is transparent to this image. */
+/* --bg-overlay: rgba(0, 0, 0, 0.8); /* overlay for the background. Generally, this should darken the picture to make text more readable. */
+/* --accent-color: #900; /* color of buttons, misc. text, etc. */
+/* --mention-color: #f00; /* color of mention text */
+/* --mention-bg: rgba(255, 0, 0, 0.15); /* mention background color */
+/* --mention-bgh: rgba(255, 0, 0, 0.4); /* mention backgroung while hovering over it */
+/* --link-color: #faa61a; /* color of all links */
+/* --link-color-hover: #fad61a; /* color of all links while hovering over them */
+/* --tag-color: #fff; /* text color of tags (bot tags and custom) */
+/* --tag-bg: rgba(255, 0, 0, 0.3); /* background of tags (bot tags and custom) */
+/* --popup-background: #222; /* background of modals, confirmation messages etc. */
+/* --popup-highlight: #333; /* color of headers and footers of "popouts" (linked to above) */
+/* --context-menu-bg: #333; /* color of context (right-click) menus. */
+/* --unread-color: #f00; /* color of unread/selected server indicators. */
+}
+
+
+/* nitrofag badge */
+.profileBadgePremium-3kZ9Qj, .topSectionNormal-2-vo2m .profileBadgePremium-3kZ9Qj,
+.profileBadgePremium-3kZ9Qj, .topSectionPlaying-1J5E4n .profileBadgePremium-3kZ9Qj {
+ background-image: url(https://discordapp.com/assets/9c252d28ca4980d65054a0258052983b.svg);
+}
+
+/* unread indicators */
+.theme-dark .unread-2OHH1w:not(.selected-nT-gM3):before {
+ background: #282828;
+ opacity: 0.5;
+ height: 50px;
+ width: 50px;
+ left: 0px;
+ bottom: 0px;
+ top: 0px;
+ margin-top: 0;
+ border-radius: 50%;
+ border-top-right-radius: 5px;
+ border-bottom-left-radius: 5px;
+ /* box-shadow: 16px -16px 10px -14px #f00; */
+ /* background: -webkit-radial-gradient(transparent 15px, #f00 25px, transparent 40px); */
+ box-shadow: inset 0 0 12px 2px var(--unread-color);
+}
+.theme-dark .selected-nT-gM3:before {
+ background: var(--unread-color);
+}
+.theme-dark .unread-2OHH1w:hover::before {
+ border-radius: 15px;
+ border-top-right-radius: 5px;
+ border-bottom-left-radius: 5px;
+ transition: border-radius 150ms;
+}
+/* uncomment the following lines to hide gif picker */
+/*button[aria-label="Open GIF picker"] {
+ display: none;
+}*/
diff --git a/files/.config/EnhancedDiscord/plugins/style.css.bak b/files/.config/EnhancedDiscord/plugins/style.css.bak
new file mode 100644
index 0000000..3cdcf73
--- /dev/null
+++ b/files/.config/EnhancedDiscord/plugins/style.css.bak
@@ -0,0 +1,57 @@
+@import url(https://enhanceddiscord.com/theme.css);
+
+/* theme settings - uncomment (by removing the /*) and modify these lines in order to change things */
+:root {
+/* --bg: url(https://i.imgur.com/ybRUHPc.jpg); /* background for the entire window. Almost everything is transparent to this image. */
+/* --bg-overlay: rgba(0, 0, 0, 0.8); /* overlay for the background. Generally, this should darken the picture to make text more readable. */
+/* --accent-color: #900; /* color of buttons, misc. text, etc. */
+/* --mention-color: #f00; /* color of mention text */
+/* --mention-bg: rgba(255, 0, 0, 0.15); /* mention background color */
+/* --mention-bgh: rgba(255, 0, 0, 0.4); /* mention backgroung while hovering over it */
+/* --link-color: #faa61a; /* color of all links */
+/* --link-color-hover: #fad61a; /* color of all links while hovering over them */
+/* --tag-color: #fff; /* text color of tags (bot tags and custom) */
+/* --tag-bg: rgba(255, 0, 0, 0.3); /* background of tags (bot tags and custom) */
+/* --popup-background: #222; /* background of modals, confirmation messages etc. */
+/* --popup-highlight: #333; /* color of headers and footers of "popouts" (linked to above) */
+/* --context-menu-bg: #333; /* color of context (right-click) menus. */
+/* --unread-color: #f00; /* color of unread/selected server indicators. */
+}
+
+
+/* nitrofag badge */
+.profileBadgePremium-3kZ9Qj, .topSectionNormal-2-vo2m .profileBadgePremium-3kZ9Qj,
+.profileBadgePremium-3kZ9Qj, .topSectionPlaying-1J5E4n .profileBadgePremium-3kZ9Qj {
+ background-image: url(https://discordapp.com/assets/9c252d28ca4980d65054a0258052983b.svg);
+}
+
+/* unread indicators */
+.theme-dark .unread-2OHH1w:not(.selected-nT-gM3):before {
+ background: transparent;
+ opacity: 0.5;
+ height: 50px;
+ width: 50px;
+ left: 0px;
+ bottom: 0px;
+ top: 0px;
+ margin-top: 0;
+ border-radius: 50%;
+ border-top-right-radius: 5px;
+ border-bottom-left-radius: 5px;
+ /* box-shadow: 16px -16px 10px -14px #f00; */
+ /* background: -webkit-radial-gradient(transparent 15px, #f00 25px, transparent 40px); */
+ box-shadow: inset 0 0 12px 2px var(--unread-color);
+}
+.theme-dark .selected-nT-gM3:before {
+ background: var(--unread-color);
+}
+.theme-dark .unread-2OHH1w:hover::before {
+ border-radius: 15px;
+ border-top-right-radius: 5px;
+ border-bottom-left-radius: 5px;
+ transition: border-radius 150ms;
+}
+/* uncomment the following lines to hide gif picker */
+/*button[aria-label="Open GIF picker"] {
+ display: none;
+}*/
diff --git a/files/.config/EnhancedDiscord/plugins/tag_all.js b/files/.config/EnhancedDiscord/plugins/tag_all.js
new file mode 100644
index 0000000..c0a1242
--- /dev/null
+++ b/files/.config/EnhancedDiscord/plugins/tag_all.js
@@ -0,0 +1,78 @@
+const Plugin = require('../plugin');
+
+let gg = {}, gc = {}, gu = {}, cp = {}, lg = {}, gsc = {};
+
+module.exports = new Plugin({
+ name: 'TagAll',
+ author: 'Joe 🎸#7070',
+ description: `Allows you to mention roles and channels you can't normally.`,
+ color: 'yellow',
+
+ load: async function() {
+ await this.sleep(1000); // wait for hidden channels to load
+
+ gg = window.EDApi.findModule('getGuild');
+ gc = window.EDApi.findModule('getChannels');
+ gu = window.EDApi.findModule('getCurrentUser');
+ cp = window.EDApi.findModule('computePermissions');
+ lg = window.EDApi.findModule('getLastSelectedGuildId');
+ gsc = window.EDApi.findModule('getChannel');
+
+ this.lis = function(e) {
+ let text = e.target.value;
+
+ const guildID = lg.getLastSelectedGuildId();
+ const g = gg.getGuild(guildID);
+
+ if (!guildID || !g || !text) return;
+
+ // mention unmentionable roles
+ const unMen = [];
+ for (const id in g.roles)
+ if (!g.roles[id].mentionable && !g.roles[id].managed) // ignore bot roles
+ unMen.push(g.roles[id]);
+
+ const roles = unMen.map(r => r.name.toLowerCase().replace(/[-[\]/{}()*+?.\\^$|]/g, "\\$&"));
+ for (const i in roles) {
+ if (!roles[i]) continue; // empty role names
+ try {
+ text = text.replace( new RegExp('@'+roles[i]+'([^#])', 'gi'), `<@&${unMen[i].id}>$1`);
+ } catch(err) {/*do nothing*/}
+ }
+
+ const hiddenChans = [];
+ if (window.ED._hiddenChans) { // work with "hidden channels" plugin
+ for (const i in window.ED._hiddenChans) {
+ const c = gsc.getChannel(window.ED._hiddenChans[i]);
+ if (c && c.guild_id === guildID) {
+ hiddenChans.push(gsc.getChannel(window.ED._hiddenChans[i]));
+ }
+ }
+ } else {
+ const globalChans = gc.getChannels();
+ const me = gu.getCurrentUser();
+
+ const hiddenChans = [];
+ for (const id in globalChans) {
+ if (globalChans[id].guild_id == guildID && !(cp.computePermissions(me, globalChans[id]) & 1024))
+ hiddenChans.push(globalChans[id]);
+ }
+ }
+ // mention channels you can't see
+ const chans = hiddenChans.map(c => c.name ? c.name.toLowerCase().replace(/[-[\]/{}()*+?.\\^$|]/g, "\\$&") : '');
+ for (const i in chans) {
+ if (!chans[i]) continue;
+ text = text.replace( new RegExp('#'+chans[i]+'(\\s)', 'gi'), `<#${hiddenChans[i].id}>$1`);
+ }
+ if (e.target.value == text) return;
+
+ e.target.value = text;
+ };
+ document.addEventListener("input", this.lis);
+ },
+
+ unload: function() {
+ document.removeEventListener("input", this.lis);
+ this.lis = null;
+ }
+});
diff --git a/files/.config/alacritty/alacritty.yml b/files/.config/alacritty/alacritty.yml
new file mode 100644
index 0000000..76b1851
--- /dev/null
+++ b/files/.config/alacritty/alacritty.yml
@@ -0,0 +1,353 @@
+env:
+ # if not set, it supposedly check's if a alacritty entry exists and uses xterm-256color otherwise
+ # TERM: alacritty
+ TERM: xterm-256color
+
+window:
+ #dimensions:
+ # columns: 0
+ # lines: 0
+ #position:
+ # x: 0
+ # y: 0
+
+ padding:
+ x: 20
+ y: 20
+
+ #Spread additional padding evenly around the terminal content.
+ dynamic_padding: true
+
+ #title: Alacritty
+ #class:
+ #instance: Alacritty
+ #general: Alacritty
+
+ gtk_theme_variant: None
+
+scrolling:
+ history: 10000
+ multiplier: 3
+
+#selection:
+ #semantic_escape_chars: ",│`|:\"' ()[]{}<>\t"
+ # When set to `true`, selected text will be copied to the primary clipboard.
+ #save_to_clipboard: false
+
+# Allow terminal applications to change Alacritty's window title.
+dynamic_title: true
+
+cursor:
+ style: Block # ▇ Block, _ Underline, | Beam
+ unfocused_hollow: true
+ # Live config reload (changes require restart)
+live_config_reload: true
+shell:
+ program: /bin/fish
+ #args:
+ #- --login
+
+mouse:
+ double_click: { threshold: 300 }
+ triple_click: { threshold: 300 }
+
+ hide_when_typing: true
+
+ url:
+ launcher:
+ program: xdg-open
+ # args: []
+ # These are the modifiers that need to be held down for opening URLs when clicking
+ # on them. The available modifiers are documented in the key binding section.
+ #modifiers: None
+
+
+# Mouse bindings --------------------------------------------- {{{
+# - `mouse`:
+#
+# - Middle
+# - Left
+# - Right
+# - Numeric identifier such as `5`
+#
+# - `action` (see key bindings)
+#
+# And optionally:
+#
+# - `mods` (see key bindings)
+#mouse_bindings:
+# - { mouse: Middle, action: PasteSelection }
+
+# }}}
+
+# Key bindings -------------------------------------------- {{{
+#
+# Key bindings are specified as a list of objects. For example, this is the
+# default paste binding:
+#
+# `- { key: V, mods: Control|Shift, action: Paste }`
+#
+# Each key binding will specify a:
+#
+# - `key`: Identifier of the key pressed
+#
+# - A-Z
+# - F1-F24
+# - Key0-Key9
+#
+# A full list with available key codes can be found here:
+# https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants
+#
+# Instead of using the name of the keys, the `key` field also supports using
+# the scancode of the desired key. Scancodes have to be specified as a
+# decimal number. This command will allow you to display the hex scancodes
+# for certain keys:
+#
+# `showkey --scancodes`.
+#
+# Then exactly one of:
+#
+# - `chars`: Send a byte sequence to the running application
+#
+# The `chars` field writes the specified string to the terminal. This makes
+# it possible to pass escape sequences. To find escape codes for bindings
+# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside
+# of tmux. Note that applications use terminfo to map escape sequences back
+# to keys. It is therefore required to update the terminfo when changing an
+# escape sequence.
+#
+# - `action`: Execute a predefined action
+#
+# - Copy
+# - Paste
+# - PasteSelection
+# - IncreaseFontSize
+# - DecreaseFontSize
+# - ResetFontSize
+# - ScrollPageUp
+# - ScrollPageDown
+# - ScrollLineUp
+# - ScrollLineDown
+# - ScrollToTop
+# - ScrollToBottom
+# - ClearHistory
+# - Hide
+# - Minimize
+# - Quit
+# - ToggleFullscreen
+# - SpawnNewInstance
+# - ClearLogNotice
+# - ReceiveChar
+# - None
+#
+# (macOS only):
+# - ToggleSimpleFullscreen: Enters fullscreen without occupying another space
+#
+# - `command`: Fork and execute a specified command plus arguments
+#
+# The `command` field must be a map containing a `program` string and an
+# `args` array of command line parameter strings. For example:
+# `{ program: "alacritty", args: ["-e", "vttest"] }`
+#
+# And optionally:
+# - `mods`: Key modifiers to filter binding actions
+# - Command
+# - Control
+# - Option
+# - Super
+# - Shift
+# - Alt
+#
+# Multiple `mods` can be combined using `|` like this:
+# `mods: Control|Shift`.
+# Whitespace and capitalization are relevant and must match the example.
+#
+# - `mode`: Indicate a binding for only specific terminal reported modes
+#
+# This is mainly used to send applications the correct escape sequences
+# when in different modes.
+#
+# - AppCursor
+# - AppKeypad
+# - Alt
+#
+# A `~` operator can be used before a mode to apply the binding whenever
+# the mode is *not* active, e.g. `~Alt`.
+#
+# Bindings are always filled by default, but will be replaced when a new
+# binding with the same triggers is defined. To unset a default binding, it can
+# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for
+# a no-op if you do not wish to receive input characters for that binding.
+#
+# If the same trigger is assigned to multiple actions, all of them are executed
+# at once.
+#key_bindings:
+ # (Windows, Linux, and BSD only)
+ #- { key: V, mods: Control|Shift, action: Paste }
+ #- { key: C, mods: Control|Shift, action: Copy }
+ #- { key: Insert, mods: Shift, action: PasteSelection }
+ #- { key: Key0, mods: Control, action: ResetFontSize }
+ #- { key: Equals, mods: Control, action: IncreaseFontSize }
+ #- { key: Add, mods: Control, action: IncreaseFontSize }
+ #- { key: Subtract, mods: Control, action: DecreaseFontSize }
+ #- { key: Minus, mods: Control, action: DecreaseFontSize }
+
+ # (Windows only)
+ #- { key: Return, mods: Alt, action: ToggleFullscreen }
+
+ #- { key: Paste, action: Paste }
+ #- { key: Copy, action: Copy }
+ #- { key: L, mods: Control, action: ClearLogNotice }
+ #- { key: L, mods: Control, chars: "\x0c" }
+ #- { key: PageUp, mods: Shift, action: ScrollPageUp, mode: ~Alt }
+ #- { key: PageDown, mods: Shift, action: ScrollPageDown, mode: ~Alt }
+ #- { key: Home, mods: Shift, action: ScrollToTop, mode: ~Alt }
+ #- { key: End, mods: Shift, action: ScrollToBottom, mode: ~Alt }
+
+ # }}}
+
+#debug:
+ # Display the time it takes to redraw each frame.
+ #render_timer: false
+
+ # Keep the log file after quitting Alacritty.
+ #persistent_logging: false
+
+ # Log level
+ #
+ # Values for `log_level`:
+ # - None
+ # - Error
+ # - Warn
+ # - Info
+ # - Debug
+ # - Trace
+ #log_level: Warn
+
+ # Print all received window events.
+ #print_events: false
+
+# schemes --------------------------------------------------------- {{{
+
+schemes:
+ blueish: &blueish
+ colors:
+ # Default colors
+ primary:
+ background: '0x3f5163'
+ foreground: '0xe2efe6'
+
+ # Normal colors
+ normal:
+ black: '0x111111'
+ red: '0xa54242'
+ green: '0xa9b254'
+ yellow: '0xde935f'
+ blue: '0x1bcdee'
+ magenta: '0xbd88ce'
+ cyan: '0x5bc5b7'
+ white: '0xbceff7'
+
+ # Bright colors
+ bright:
+ black: '0xc5d2e6'
+ red: '0xff8484'
+ green: '0xebf39c'
+ yellow: '0xf4c76e'
+ blue: '0x97cfff'
+ magenta: '0xc3a2cd'
+ cyan: '0xa5f9ee'
+ white: '0xe7fcff'
+
+
+
+ dracula: &dracula
+ primary:
+ background: '#282a36'
+ foreground: '#f8f8f2'
+ normal:
+ black: '#000000'
+ red: '#ff5555'
+ green: '#50fa7b'
+ yellow: '#f1fa8c'
+ blue: '#caa9fa'
+ magenta: '#ff79c6'
+ cyan: '#8be9fd'
+ white: '#bfbfbf'
+ bright:
+ black: '#575b70'
+ red: '#ff6e67'
+ green: '#5af78e'
+ yellow: '#f4f99d'
+ blue: '#caa9fa'
+ magenta: '#ff92d0'
+ cyan: '#9aedfe'
+ white: '#e6e6e6'
+ gruvbox: &gruvbox
+ primary:
+ #background: '#1d2021' # hard contrast: background = '#1d2021'
+ background: '#282828' # hard contrast: background = '#1d2021'
+ foreground: '#ebdbb2' # soft contrast: background = '#32302f'
+ normal:
+ black: '#282828'
+ red: '#cc241d'
+ green: '#98971a'
+ yellow: '#d79921'
+ blue: '#458588'
+ magenta: '#b16286'
+ cyan: '#689d6a'
+ white: '#a89984'
+ bright:
+ black: '#928374'
+ red: '#fb4934'
+ green: '#b8bb26'
+ yellow: '#fabd2f'
+ blue: '#83a598'
+ magenta: '#d3869b'
+ cyan: '#8ec07c'
+ white: '#ebdbb2'
+
+ onedark: &onedark
+ primary:
+ background: '#282c34'
+ foreground: '#abb2bf'
+ normal:
+ black: '#282c34' # NOTE: Use '#131613' for the `black` color if you'd like to see black text on the background.
+ red: '#e06c75'
+ green: '#98c379'
+ yellow: '#d19a66'
+ blue: '#61afef'
+ magenta: '#c678dd'
+ cyan: '#56b6c2'
+ white: '#abb2bf'
+ bright:
+ black: '#5c6370'
+ red: '#e06c75'
+ green: '#98c379'
+ yellow: '#d19a66'
+ blue: '#61afef'
+ magenta: '#c678dd'
+ cyan: '#56b6c2'
+ white: '#ffffff'
+
+# }}}
+
+# https://github.com/alacritty/alacritty/wiki/Color-schemes
+colors: *gruvbox
+#background_opacity: 0.95
+background_opacity: 1.0
+
+font:
+ #size: 10
+ size: 12
+ normal:
+ #family: JetBrainsMono Nerd Font
+ #family: Iosevka Term
+ #family: cozette
+ family: Terminus (TTF)
+ #family: cherry
+ #family: lucy tewi2a
+ #family: Scientifica
+ offset:
+ x: 0
+ y: 0
diff --git a/files/.config/bspwm/bspwm_scripts/bringwindow b/files/.config/bspwm/bspwm_scripts/bringwindow
new file mode 100755
index 0000000..485c3eb
--- /dev/null
+++ b/files/.config/bspwm/bspwm_scripts/bringwindow
@@ -0,0 +1,25 @@
+#!/bin/bash
+case $1 in "-a") PROMPT="Goto:"; MODE="go" ;; "-R") PROMPT="Bring:"; MODE="bring" ;; esac
+
+if [ -n "$2" ]; then
+ WINDOW="$2"
+else
+ WINDOW=$(paste \
+ <(xdotool search .) \
+ <(xdotool search . get_desktop_for_window %@ 2> /dev/null) \
+ <(xdotool search . getwindowname %@) |\
+ awk '{FS="\t"; if($2 != -1) printf "%10d [%d] %s\n",$1,$2+1,$3}' |\
+ vmenu --no-refocus -p $PROMPT |\
+ sed 's/^ *//g' |\
+ cut -d ' ' -f 1)
+fi
+
+if [ -n "$WINDOW" ]; then
+ if [ bring = $MODE ]; then
+ if DESK=$(xdotool get_desktop 2> /dev/null); then
+ xdotool set_desktop_for_window "$WINDOW" $DESK
+ sleep 0.005 # wait for wm to notice
+ fi
+ fi
+ xdotool windowmap "$WINDOW" windowactivate "$WINDOW" windowfocus "$WINDOW" windowraise "$WINDOW"
+fi
diff --git a/files/.config/bspwm/bspwm_scripts/bsp_scratchpad.sh b/files/.config/bspwm/bspwm_scripts/bsp_scratchpad.sh
new file mode 100755
index 0000000..dbb0d04
--- /dev/null
+++ b/files/.config/bspwm/bspwm_scripts/bsp_scratchpad.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+if [ -z "$1" ]; then
+ echo "Usage: $0 "
+ exit 1
+fi
+
+pids=$(xdotool search --class "${1}")
+for pid in $pids; do
+ echo "Toggle $pid"
+ bspc node "$pid" --flag hidden -f
+done
diff --git a/files/.config/bspwm/bspwm_scripts/drawer b/files/.config/bspwm/bspwm_scripts/drawer
new file mode 100755
index 0000000..6b43025
--- /dev/null
+++ b/files/.config/bspwm/bspwm_scripts/drawer
@@ -0,0 +1,107 @@
+#!/bin/bash
+
+# Config
+# ======
+
+# Where to look for wid files:
+TMPDIR="$XDG_RUNTIME_DIR/drawers.wids/"
+
+# Find and show/hide the window if it exists
+# ==========================================
+
+NAME=$1
+
+if [[ -e $TMPDIR$NAME ]]; then
+ read -r WINDOW < "$TMPDIR$NAME"
+
+ # Window exists? Show/hide it and we're done.
+ if xdotool getwindowname "$WINDOW" &> /dev/null; then
+ if xdotool search --onlyvisible . | grep -q "$WINDOW"; then
+ xdotool windowminimize "$WINDOW"
+ else
+ ~/.config/bspwm/bspwm_scripts/bringwindow -R "$WINDOW"
+ fi
+ exit
+ fi
+fi
+
+if [[ $# -lt 5 ]]; then
+ echo "Not enough args to launch a new $NAME."
+ exit 1
+fi
+
+# No window to show/hide, better create it. Do setup for that.
+# ============================================================
+
+# no xinerama for now
+CFG=($(xdotool getdisplaygeometry))
+SCR_WIDTH=${CFG[0]}
+SCR_HEIGHT=${CFG[1]}
+SCR_LEFT=0 #${CFG[2]}
+SCR_TOP=0 #${CFG[3]}
+
+SIDE=$2
+WIDTH=$3
+HEIGHT=$4
+
+shift 4
+
+# Handle fractions of screen size for width and height
+# ====================================================
+
+if [[ $WIDTH == *% ]]; then
+ WIDTH=${WIDTH:0:-1} # chomp '%'
+ WIDTH=$(( (WIDTH*10*SCR_WIDTH)/1000 ))
+fi
+
+if [[ $HEIGHT == *% ]]; then
+ HEIGHT=${HEIGHT:0:-1} # chomp '%'
+ HEIGHT=$(( (HEIGHT*10*SCR_HEIGHT)/1000 ))
+fi
+
+# Figure out where to put the window
+# ==================================
+
+TOP_ADJ=$(( (SCR_HEIGHT-HEIGHT)/2 ))
+LEFT_ADJ=$(( (SCR_WIDTH-WIDTH)/2 ))
+
+case $SIDE in
+ "left")
+ LEFT=$SCR_LEFT
+ TOP=$(( SCR_TOP + TOP_ADJ ))
+ ;;
+ "right")
+ LEFT=$(( SCR_WIDTH - WIDTH ))
+ TOP=$(( SCR_TOP + TOP_ADJ ))
+ ;;
+ "bottom")
+ LEFT=$(( SCR_LEFT + LEFT_ADJ ))
+ TOP=$(( SCR_HEIGHT - HEIGHT ))
+ ;;
+ "top")
+ LEFT=$(( SCR_LEFT + LEFT_ADJ ))
+ TOP=$SCR_TOP
+esac
+
+# Create the window
+# =================
+
+$@ &
+# await new window:
+countWins() {
+ xdotool search --onlyvisible . 2> /dev/null | wc -l
+}
+
+WIN_CNT="$(countWins)"
+while [[ $(countWins) = "$WIN_CNT" ]]; do sleep 0.1; done
+sleep 0.25
+
+# new window should now be active, make it our window:
+WINDOW="$(xdotool getactivewindow)"
+xdotool set_window --role "drawer" $WINDOW
+mkdir -p "$TMPDIR"
+echo "$WINDOW" > "$TMPDIR$NAME"
+
+border_width="$(xgetres awesome border_width)"
+which awesome-client &> /dev/null && echo "client.focus.floating = true; client.focus.border_width=$border_width" | awesome-client
+xdotool windowmove $WINDOW $LEFT $TOP windowsize $WINDOW $WIDTH $HEIGHT windowfocus $WINDOW windowraise $WINDOW
diff --git a/files/.config/bspwm/bspwm_scripts/execute_menu.sh b/files/.config/bspwm/bspwm_scripts/execute_menu.sh
new file mode 100644
index 0000000..3eb5b27
--- /dev/null
+++ b/files/.config/bspwm/bspwm_scripts/execute_menu.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+options="screenshot\nscreengif"
+selected="$(echo -e "$options" | rofi -dmenu -i -theme ~/scripts/rofi-scripts/default_theme.rasi)"
+case "$selected" in
+ screenshot)
+ ~/scripts/screenshot.sh
+ ;;
+ screengif)
+ notify-send gif "press M-S-C-g to end gif"
+ ~/scripts/screengif.sh
+ ;;
+esac
+
diff --git a/files/.config/bspwm/bspwm_scripts/run_once.sh b/files/.config/bspwm/bspwm_scripts/run_once.sh
new file mode 100755
index 0000000..95dfb7b
--- /dev/null
+++ b/files/.config/bspwm/bspwm_scripts/run_once.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+pgrep "$@" > /dev/null || ("$@" &)
diff --git a/files/.config/bspwm/bspwm_scripts/xgetres b/files/.config/bspwm/bspwm_scripts/xgetres
new file mode 100755
index 0000000..354fca8
--- /dev/null
+++ b/files/.config/bspwm/bspwm_scripts/xgetres
@@ -0,0 +1,2 @@
+#!/bin/dash
+appres "$1" | grep "$2" | cut -f 2-
diff --git a/files/.config/bspwm/bspwmrc b/files/.config/bspwm/bspwmrc
new file mode 100755
index 0000000..6e1a6e9
--- /dev/null
+++ b/files/.config/bspwm/bspwmrc
@@ -0,0 +1,34 @@
+#! /bin/sh
+
+sxhkd &
+
+killall -q picom && picom --config ~/.config/picom.conf --experimental-backends --no-fading-openclose &
+killall -q pasystray && pasystray &
+killall -q nm-applet && nm-applet &
+killall -q clipmenud && clipmenud &
+
+xset r rate 300 50 &
+/home/leon/.config/polybar/launch.sh &
+feh --bg-fill /home/leon/Bilder/wallpapers/mountains_with_clounds.jpg &
+
+bspc monitor -d 1 2 3 4 5 6 7 8 9 10
+
+bspc config border_width 2
+bspc config window_gap 14
+
+bspc config focus_follows_pointer true
+
+bspc config split_ratio 0.50
+bspc config borderless_monocle false
+bspc config gapless_monocle false
+bspc config automatic_scheme alternate
+
+bspc rule -a mplayer2 state=floating
+bspc rule -a Kupfer.py focus=on
+bspc rule -a Screenkey manage=off
+bspc rule -a feh state=floating
+bspc rule -a Sxiv state=floating
+
+#bspc rule -a kitty_scratchpad sticky=on state=floating hidden=on
+#kitty --class kitty_scratchpad &
+
diff --git a/files/.config/coc/extensions/db.json b/files/.config/coc/extensions/db.json
new file mode 100644
index 0000000..c61316e
--- /dev/null
+++ b/files/.config/coc/extensions/db.json
@@ -0,0 +1,3 @@
+{
+ "lastUpdate": 1584601643868
+}
\ No newline at end of file
diff --git a/files/.config/coc/extensions/package.json b/files/.config/coc/extensions/package.json
new file mode 100644
index 0000000..feb69ef
--- /dev/null
+++ b/files/.config/coc/extensions/package.json
@@ -0,0 +1 @@
+{"dependencies":{}}
\ No newline at end of file
diff --git a/files/.config/coc/memos.json b/files/.config/coc/memos.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/files/.config/coc/memos.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/files/.config/configstore/update-notifier-npm.json b/files/.config/configstore/update-notifier-npm.json
new file mode 100644
index 0000000..b2a6374
--- /dev/null
+++ b/files/.config/configstore/update-notifier-npm.json
@@ -0,0 +1,4 @@
+{
+ "optOut": false,
+ "lastUpdateCheck": 1592658266558
+}
\ No newline at end of file
diff --git a/files/.config/fish/conf.d/omf.fish b/files/.config/fish/conf.d/omf.fish
new file mode 100644
index 0000000..3e0f6d6
--- /dev/null
+++ b/files/.config/fish/conf.d/omf.fish
@@ -0,0 +1,7 @@
+# Path to Oh My Fish install.
+set -q XDG_DATA_HOME
+ and set -gx OMF_PATH "$XDG_DATA_HOME/omf"
+ or set -gx OMF_PATH "$HOME/.local/share/omf"
+
+# Load Oh My Fish configuration.
+source $OMF_PATH/init.fish
diff --git a/files/.config/fish/config.fish b/files/.config/fish/config.fish
new file mode 100644
index 0000000..3f31229
--- /dev/null
+++ b/files/.config/fish/config.fish
@@ -0,0 +1,77 @@
+fish_vi_key_bindings
+# fish_default_key_bindings
+
+# disable truecolor for dvtm
+# set -e fish_term24bit
+#source /home/leon/.config/fish/gruvbox-colors.fish
+
+#set -U FZF_TMUX 1
+set -U FZF_DEFAULT_COMMANDS "--filepath-word --cycle"
+set -U FZF_PREVIEW_FILE_CMD "head -n 10 | bat --color=always --decorations=never"
+set -U fish_greeting
+#function fish_greeting
+#end
+
+
+alias ls=lsd
+alias tcolors="env TERM=xterm-256color tcolors"
+abbr --add --global vim nvim
+abbr --add --global tsh trash
+#abbr --add --global clear "clear && ls"
+abbr --add --global cxmonad "nvim /home/leon/.xmonad/lib/Config.hs"
+
+
+#if status is-interactive
+#and not set -q TMUX
+ #exec tmux
+#end
+
+abbr --add --global gaa "git add --all"
+abbr --add --global gc "git commit -m "
+abbr --add --global gp "git push"
+abbr --add --global gs "git status"
+
+
+[ (hostname) = "garnix" ] && alias rm='echo "rm is disabled. Please use trash instead."; false'
+
+function run_stuff
+ set -l commandline (commandline -b)
+ pipr --out-file /tmp/pipr_out --default "$commandline"
+ set -l result (cat /tmp/pipr_out)
+ commandline -r $result
+ commandline -f repaint
+end
+
+function c
+ set -l result (/home/leon/scripts/conf)
+ commandline -r "$result"
+ commandline -f execute
+end
+
+
+bind \ca run_stuff
+
+
+function replace_with_yay
+ set -l cmd (commandline -b)
+ switch $cmd
+ case "*pacman*"
+ set edited (echo $cmd | sed 's/sudo //g' | sed 's/pacman/yay/g')
+ case "yay*"
+ set edited (echo $cmd | sed 's/yay/sudo pacman/g')
+ end
+ commandline -r "$edited"
+ commandline -f repaint
+end
+
+bind \cy replace_with_yay
+
+# fff file manager cd on exit
+function f
+ fff $argv
+ set -q XDG_CACHE_HOME; or set XDG_CACHE_HOME $HOME/.cache
+ cd (cat $XDG_CACHE_HOME/fff/.fff_d)
+end
+set -x EDITOR "nvim"
+set -x FFF_TRASH_CMD "trash" # make fff's trash function use trash-cli
+
diff --git a/files/.config/fish/fish_variables b/files/.config/fish/fish_variables
new file mode 100644
index 0000000..feb6015
--- /dev/null
+++ b/files/.config/fish/fish_variables
@@ -0,0 +1,50 @@
+# This file contains fish universal variable definitions.
+# VERSION: 3.0
+SETUVAR FZF_DEFAULT_COMMANDS:\x2d\x2dfilepath\x2dword\x20\x2d\x2dcycle
+SETUVAR FZF_DEFAULT_OPTS:\x2d\x2dheight\x2040\x25
+SETUVAR FZF_ENABLE_OPEN_PREVIEW:1
+SETUVAR FZF_LEGACY_KEYBINDINGS:0
+SETUVAR FZF_PREVIEW_DIR_CMD:ls
+SETUVAR FZF_PREVIEW_FILE_CMD:head\x20\x2dn\x2010\x20\x7c\x20bat\x20\x2d\x2dcolor\x3dalways\x20\x2d\x2ddecorations\x3dnever
+SETUVAR FZF_TMUX:1
+SETUVAR FZF_TMUX_HEIGHT:40\x25
+SETUVAR SXHKD_SHELL:sh
+SETUVAR __fish_initialized:3100
+SETUVAR dangerous_colors:000000\x1e083743\x1e445659\x1efdf6e3\x1eb58900\x1ecb4b16\x1edc121f\x1eaf005f\x1e6c71c4\x1e268bd2\x1e2aa198\x1e859900
+SETUVAR dangerous_cursors:\x5c033\x5d12\x3b\x23268bd2\x5c007\x1e\x5c033\x5d12\x3b\x23b58900\x5c007\x1e\x5c033\x5d12\x3b\x23af005f\x5c007\x1e\x5c033\x5d12\x3b\x236c71c4\x5c007
+SETUVAR dangerous_day:000000\x1e333333\x1e666666\x1effffff\x1effff00\x1eff6600\x1eff0000\x1eff0033\x1e3300ff\x1e00aaff\x1e00ffff\x1e00ff00
+SETUVAR dangerous_night:000000\x1e083743\x1e445659\x1efdf6e3\x1eb58900\x1ecb4b16\x1edc121f\x1eaf005f\x1e6c71c4\x1e268bd2\x1e2aa198\x1e859900
+SETUVAR dangerous_nocmdhist:c\x1ed\x1ell\x1els\x1em\x1es
+SETUVAR dangerous_pwdstyle:short\x1elong\x1enone
+SETUVAR dangerous_sessions_active:\x1d
+SETUVAR dangerous_sessions_active_pid:\x1d
+SETUVAR fish_color_autosuggestion:555
+SETUVAR fish_color_cancel:normal
+SETUVAR fish_color_command:0087d7
+SETUVAR fish_color_comment:990000
+SETUVAR fish_color_cwd:008000
+SETUVAR fish_color_cwd_root:800000
+SETUVAR fish_color_end:009900
+SETUVAR fish_color_error:ff0000
+SETUVAR fish_color_escape:00a6b2
+SETUVAR fish_color_history_current:normal
+SETUVAR fish_color_host:normal
+SETUVAR fish_color_host_remote:yellow
+SETUVAR fish_color_match:normal
+SETUVAR fish_color_normal:normal
+SETUVAR fish_color_operator:00a6b2
+SETUVAR fish_color_param:0087af
+SETUVAR fish_color_quote:999900
+SETUVAR fish_color_redirection:00afff
+SETUVAR fish_color_search_match:ffff00
+SETUVAR fish_color_selection:c0c0c0
+SETUVAR fish_color_status:red
+SETUVAR fish_color_user:00ff00
+SETUVAR fish_color_valid_path:normal
+SETUVAR fish_greeting:\x1d
+SETUVAR fish_key_bindings:fish_vi_key_bindings
+SETUVAR fish_pager_color_completion:normal
+SETUVAR fish_pager_color_description:B3A06D\x1eyellow
+SETUVAR fish_pager_color_prefix:white\x1e\x2d\x2dbold\x1e\x2d\x2dunderline
+SETUVAR fish_pager_color_progress:brwhite\x1e\x2d\x2dbackground\x3dcyan
+SETUVAR fish_user_paths:/home/leon/\x2efzf/bin
diff --git a/files/.config/fish/functions/fish_prompt.fish b/files/.config/fish/functions/fish_prompt.fish
new file mode 120000
index 0000000..aba2104
--- /dev/null
+++ b/files/.config/fish/functions/fish_prompt.fish
@@ -0,0 +1 @@
+/home/leon/.local/share/omf/themes/lambda_better/fish_prompt.fish
\ No newline at end of file
diff --git a/files/.config/fish/functions/fish_user_key_bindings.fish b/files/.config/fish/functions/fish_user_key_bindings.fish
new file mode 100644
index 0000000..3698914
--- /dev/null
+++ b/files/.config/fish/functions/fish_user_key_bindings.fish
@@ -0,0 +1,2 @@
+function fish_user_key_bindings
+end
diff --git a/files/.config/fish/functions/lambda_fish_prompt b/files/.config/fish/functions/lambda_fish_prompt
new file mode 120000
index 0000000..f48d83d
--- /dev/null
+++ b/files/.config/fish/functions/lambda_fish_prompt
@@ -0,0 +1 @@
+/home/leon/.local/share/omf/themes/lambda/fish_prompt.fish
\ No newline at end of file
diff --git a/files/.config/fish/functions/my_fish_prompt.fish b/files/.config/fish/functions/my_fish_prompt.fish
new file mode 100644
index 0000000..71d4e87
--- /dev/null
+++ b/files/.config/fish/functions/my_fish_prompt.fish
@@ -0,0 +1,67 @@
+
+
+function fish_prompt
+ # Cache exit status
+ set -l last_status $status
+
+ set -l normal (set_color normal)
+ set -l white (set_color FFFFFF)
+ set -l turquoise (set_color 5fdfff)
+ set -l orange (set_color df5f00)
+ set -l hotpink (set_color df005f)
+ set -l blue (set_color blue)
+ set -l limegreen (set_color 87ff00)
+ set -l purple (set_color af5fff)
+
+
+ # Configure __fish_git_prompt
+ set -g __fish_git_prompt_char_stateseparator ' '
+ set -g __fish_git_prompt_color 5fdfff
+ set -g __fish_git_prompt_color_flags df5f00
+ set -g __fish_git_prompt_color_prefix white
+ set -g __fish_git_prompt_color_suffix white
+ set -g __fish_git_prompt_showdirtystate true
+ set -g __fish_git_prompt_showuntrackedfiles true
+ set -g __fish_git_prompt_showstashstate true
+ set -g __fish_git_prompt_show_informative_status true
+
+ set -l current_user (whoami)
+ set -l vi_mode (__fish_vi_mode_prompt_real)
+ set -l git_prompt (__fish_git_prompt " (%s)")
+ #(pwd|sed "s=$HOME=~=")
+
+ set -g fish_prompt_pwd_dir_length 1
+
+ echo -n $white'╭─'$vi_mode
+ echo -n $white'─'$hotpink$current_user$white' in '$limegreen(prompt_pwd)
+ echo -n $turquoise$git_prompt
+ if test $last_status -gt 0
+ echo -n ' '$hotpink$last_status
+ end
+ echo
+
+ echo -n $white'╰─λ '
+ echo -n $normal
+end
+
+function __fish_vi_mode_prompt_real
+ set -l turquoise (set_color 5fdfff)
+ set -l orange (set_color df5f00)
+ switch $fish_bind_mode
+ case insert
+ echo -n "─"
+ case default
+ echo -n $turquoise'N'
+ case visual
+ echo -n $orange'V'
+ case replace_one
+ echo -n $turquoise'R'
+ end
+end
+
+
+# needed so fish doesn't draw it by itself
+function fish_mode_prompt
+end
+
+# ⌁
diff --git a/files/.config/fish/gruvbox-colors.fish b/files/.config/fish/gruvbox-colors.fish
new file mode 100644
index 0000000..227185a
--- /dev/null
+++ b/files/.config/fish/gruvbox-colors.fish
@@ -0,0 +1,27 @@
+
+set -l orange '#fe8019'
+set -l aqua '#8ec07c'
+set -l blue '#83a598'
+set -l limegreen '#b8bb26'
+set -l purple '#d3869b'
+set -l aqua '#8ec07c'
+set -l gwhite '#ebdbb2'
+set -l gray2 '#665c54'
+set -l purple '#d3869b'
+set -l gray '#a89984'
+set -l yellow '#fabd2f'
+
+#set -U fish_color_command $blue
+#set -U fish_color_normal $gwhite
+#set -U fish_color_quote $aqua
+#set -U fish_color_redirection $orange
+#set -U fish_color_param $aqua
+#set -U fish_color_comment $gray
+#set -U fish_color_match $yellow
+#set -U fish_color_search_match $aqua
+#set -U fish_color_autosuggestion $gray2
+#set -U fish_color_cancel $aqua
+#set fish_color_selection
+#set fish_color_end
+#set fish_color_error
+#set fish_color_operator
diff --git a/files/.config/gtk-3.0/bookmarks b/files/.config/gtk-3.0/bookmarks
new file mode 100644
index 0000000..1c010f8
--- /dev/null
+++ b/files/.config/gtk-3.0/bookmarks
@@ -0,0 +1,2 @@
+file:///home/leon/coding/projects
+file:///home/leon/studium/Studium
diff --git a/files/.config/gtk-3.0/colors.css b/files/.config/gtk-3.0/colors.css
new file mode 100644
index 0000000..de6a2a1
--- /dev/null
+++ b/files/.config/gtk-3.0/colors.css
@@ -0,0 +1,77 @@
+@define-color theme_fg_color #eff0f1;
+@define-color theme_bg_color #31363b;
+@define-color theme_text_color #eff0f1;
+@define-color theme_base_color #232629;
+@define-color theme_view_hover_decoration_color #3daee9;
+@define-color theme_hovering_selected_bg_color #3daee9;
+@define-color theme_selected_bg_color #3daee9;
+@define-color theme_selected_fg_color #eff0f1;
+@define-color theme_view_active_decoration_color #3daee9;
+@define-color theme_button_background_normal #31363b;
+@define-color theme_button_decoration_hover #3daee9;
+@define-color theme_button_decoration_focus #3daee9;
+@define-color theme_button_foreground_normal #eff0f1;
+@define-color theme_button_foreground_active #eff0f1;
+@define-color borders #606468;
+@define-color warning_color #f67400;
+@define-color success_color #27ae60;
+@define-color error_color #da4453;
+@define-color theme_unfocused_fg_color #eff0f1;
+@define-color theme_unfocused_text_color #eff0f1;
+@define-color theme_unfocused_bg_color #31363b;
+@define-color theme_unfocused_base_color #232629;
+@define-color theme_unfocused_selected_bg_color_alt #224e65;
+@define-color theme_unfocused_selected_bg_color #224e65;
+@define-color theme_unfocused_selected_fg_color #eff0f1;
+@define-color theme_button_background_backdrop #31363b;
+@define-color theme_button_decoration_hover_backdrop #3daee9;
+@define-color theme_button_decoration_focus_backdrop #3daee9;
+@define-color theme_button_foreground_backdrop #eff0f1;
+@define-color theme_button_foreground_active_backdrop #eff0f1;
+@define-color unfocused_borders #606468;
+@define-color warning_color_backdrop #f67400;
+@define-color success_color_backdrop #27ae60;
+@define-color error_color_backdrop #da4453;
+@define-color insensitive_fg_color #6e7175;
+@define-color insensitive_base_fg_color #65686a;
+@define-color insensitive_bg_color #2e3338;
+@define-color insensitive_base_color #212427;
+@define-color insensitive_selected_bg_color #2e3338;
+@define-color insensitive_selected_fg_color #6e7175;
+@define-color theme_button_background_insensitive #2e3338;
+@define-color theme_button_decoration_hover_insensitive #325b72;
+@define-color theme_button_decoration_focus_insensitive #325b72;
+@define-color theme_button_foreground_insensitive #6e7175;
+@define-color theme_button_foreground_active_insensitive #6e7175;
+@define-color insensitive_borders #3e4347;
+@define-color warning_color_insensitive #683e19;
+@define-color success_color_insensitive #225139;
+@define-color error_color_insensitive #5e2e35;
+@define-color insensitive_unfocused_fg_color #6e7175;
+@define-color theme_unfocused_view_text_color #65686a;
+@define-color insensitive_unfocused_bg_color #2e3338;
+@define-color theme_unfocused_view_bg_color #212427;
+@define-color insensitive_unfocused_selected_bg_color #2e3338;
+@define-color insensitive_unfocused_selected_fg_color #6e7175;
+@define-color theme_button_background_backdrop_insensitive #2e3338;
+@define-color theme_button_decoration_hover_backdrop_insensitive #325b72;
+@define-color theme_button_decoration_focus_backdrop_insensitive #325b72;
+@define-color theme_button_foreground_backdrop_insensitive #6e7175;
+@define-color theme_button_foreground_active_backdrop_insensitive #6e7175;
+@define-color unfocused_insensitive_borders #3e4347;
+@define-color warning_color_insensitive_backdrop #683e19;
+@define-color success_color_insensitive_backdrop #225139;
+@define-color error_color_insensitive_backdrop #5e2e35;
+@define-color link_color #2980b9;
+@define-color link_visited_color #7f8c8d;
+@define-color tooltip_text #eff0f1;
+@define-color tooltip_background #31363b;
+@define-color tooltip_border #606468;
+@define-color content_view_bg #232629;
+@define-color theme_titlebar_background rgb(49,54,59);
+@define-color theme_titlebar_foreground rgb(239,240,241);
+@define-color theme_titlebar_background_light #31363b;
+@define-color theme_titlebar_foreground_backdrop rgb(127,140,141);
+@define-color theme_titlebar_background_backdrop rgb(49,54,59);
+@define-color theme_titlebar_foreground_insensitive rgb(127,140,141);
+@define-color theme_titlebar_foreground_insensitive_backdrop rgb(127,140,141);
diff --git a/files/.config/gtk-3.0/gtk.css b/files/.config/gtk-3.0/gtk.css
new file mode 100644
index 0000000..efca548
--- /dev/null
+++ b/files/.config/gtk-3.0/gtk.css
@@ -0,0 +1,8 @@
+.termite {
+ padding: 15px;
+}
+vte-terminal {
+ padding: 10px;
+}
+
+@import 'colors.css';
diff --git a/files/.config/gtk-3.0/settings.ini b/files/.config/gtk-3.0/settings.ini
new file mode 100644
index 0000000..f03f1ac
--- /dev/null
+++ b/files/.config/gtk-3.0/settings.ini
@@ -0,0 +1,25 @@
+[Settings]
+gtk-button-images=1
+gtk-cursor-theme-name=capitaine-cursors-light
+gtk-cursor-theme-size=0
+gtk-enable-event-sounds=0
+gtk-enable-input-feedback-sounds=0
+gtk-font-name=Sans 9
+gtk-icon-theme-name=Arc-X-D
+gtk-menu-images=1
+;gtk-theme-name=Adwaita-dark
+gtk-theme-name=phocus
+gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
+gtk-toolbar-style=GTK_TOOLBAR_ICONS
+gtk-xft-antialias=1
+gtk-xft-hinting=1
+gtk-xft-hintstyle=hintslight
+gtk-xft-rgba=rgb
+gtk-application-prefer-dark-theme=true
+gtk-decoration-layout=:
+
+;gtk-font-name = DejaVu Sans 1 121
+;gtk-font-name = cozette 10
+gtk-font-name = xos4 Terminus Regular 12
+;gtk-font-name = Terminus 12
+;gtk-font-name = cozette 10
diff --git a/files/.config/htop/htoprc b/files/.config/htop/htoprc
new file mode 100644
index 0000000..93c9e4f
--- /dev/null
+++ b/files/.config/htop/htoprc
@@ -0,0 +1,26 @@
+# Beware! This file is rewritten by htop when settings are changed in the interface.
+# The parser is also very primitive, and not human-friendly.
+fields=0 48 17 18 38 39 40 2 46 47 49 1
+sort_key=47
+sort_direction=1
+hide_threads=1
+hide_kernel_threads=1
+hide_userland_threads=1
+shadow_other_users=0
+show_thread_names=0
+show_program_path=1
+highlight_base_name=0
+highlight_megabytes=1
+highlight_threads=1
+tree_view=0
+header_margin=1
+detailed_cpu_time=0
+cpu_count_from_zero=0
+update_process_names=0
+account_guest_in_cpu_meter=0
+color_scheme=0
+delay=15
+left_meters=AllCPUs Memory Swap
+left_meter_modes=1 1 1
+right_meters=Tasks LoadAverage Uptime
+right_meter_modes=2 2 2
diff --git a/files/.config/kitty/gruvbox.conf b/files/.config/kitty/gruvbox.conf
new file mode 120000
index 0000000..13ddd37
--- /dev/null
+++ b/files/.config/kitty/gruvbox.conf
@@ -0,0 +1 @@
+/home/leon/.config/kitty/kitty-themes/themes/gruvbox_dark.conf
\ No newline at end of file
diff --git a/files/.config/kitty/kitty.conf b/files/.config/kitty/kitty.conf
new file mode 100644
index 0000000..face496
--- /dev/null
+++ b/files/.config/kitty/kitty.conf
@@ -0,0 +1,68 @@
+include ./gruvbox.conf
+#include ./onedark.conf
+
+#shell tmux
+#background_opacity 0.95
+background_opacity 1
+
+#font_family VictorMono Nerd Font Semibold
+#font_family DejaVuSansMono Nerd
+font_family Iosevka Nerd Font
+#font_family JetbrainsMono Nerd Font
+
+bold_font auto
+italic_font auto
+bold_italic_font auto
+#font_family monospace
+font_size 13
+
+enable_audio_bell no
+
+draw_minimal_borders yes
+window_padding_width 0
+window_margin_width 10
+tab_bar_style powerline
+hide_window_decorations yes
+placement_strategy top-left
+
+
+clipboard_control write-clipboard write-primary read-primary read-clipboard
+dynamic_background_opacity yes
+allow_remote_control yes
+sync_to_monitor yes
+
+active_tab_background #6272a4
+active_tab_foreground #f8f8f2
+inactive_tab_background #44475a
+inactive_tab_foreground #f8f8f2
+
+# Keymaps {{{
+
+
+# Windows
+map kitty_mod+enter new_window_with_cwd
+map ctrl+shift+left neighboring_window left
+map ctrl+shift+down neighboring_window down
+map ctrl+shift+right neighboring_window right
+map ctrl+shift+up neighboring_window up
+
+# tabs
+#map kitty_mod+t new_tab
+map kitty_mod+n new_tab_with_cwd
+map ctrl+shift+l next_tab
+map ctrl+shift+h previous_tab
+
+# new os window
+map kitty_mod+backspace new_os_window_with_cwd
+
+
+# Other
+map ctrl+shift+plus change_font_size all +2.0
+map ctrl+shift+alt+h show_scrollback
+
+# --type=overlay
+# --stdin-source=@screen_scrollback
+# https://sw.kovidgoyal.net/kitty/launch.html
+map ctrl+shift+space launch --stdin-source=@screen --stdin-add-formatting --type=window /home/leon/scripts/autocompleteWords.sh @active-kitty-window-id
+
+# }}}
diff --git a/files/.config/kitty/onedark.conf b/files/.config/kitty/onedark.conf
new file mode 100644
index 0000000..b43a423
--- /dev/null
+++ b/files/.config/kitty/onedark.conf
@@ -0,0 +1,21 @@
+background #282c34
+foreground #c4c8c5
+cursor #d0d0d0
+selection_background #444444
+selection_foreground #161718
+color0 #000000
+color1 #fc5ef0
+color2 #86c38a
+color3 #ffd6b1
+color4 #85befd
+color5 #b9b5fc
+color6 #85befd
+color7 #dfdfdf
+color8 #808080
+color9 #fc5ef0
+color10 #94f936
+color11 #f5ffa7
+color12 #95cbfe
+color13 #b9b5fc
+color14 #85befd
+color15 #dfdfdf
diff --git a/files/.config/menus/applications-merged/user-chrome-apps.menu b/files/.config/menus/applications-merged/user-chrome-apps.menu
new file mode 100644
index 0000000..1ed1af4
--- /dev/null
+++ b/files/.config/menus/applications-merged/user-chrome-apps.menu
@@ -0,0 +1,19 @@
+
+
+
diff --git a/files/.config/menus/applications-merged/xdg-desktop-menu-dummy.menu b/files/.config/menus/applications-merged/xdg-desktop-menu-dummy.menu
new file mode 100644
index 0000000..e69de29
diff --git a/files/.config/nitrogen/bg-saved.cfg b/files/.config/nitrogen/bg-saved.cfg
new file mode 100644
index 0000000..88943f7
--- /dev/null
+++ b/files/.config/nitrogen/bg-saved.cfg
@@ -0,0 +1,14 @@
+[:0.0]
+file=/home/leon/Bilder/wallpapers/wallhaven-ox2gr9.jpg
+mode=5
+bgcolor=#000000
+
+[xin_0]
+file=/home/leon/Bilder/wallpapers/green_leaves.jpg
+mode=5
+bgcolor=#000000
+
+[xin_1]
+file=/home/leon/Bilder/wallpapers/green_leaves.jpg
+mode=5
+bgcolor=#000000
diff --git a/files/.config/nitrogen/nitrogen.cfg b/files/.config/nitrogen/nitrogen.cfg
new file mode 100644
index 0000000..72c30c0
--- /dev/null
+++ b/files/.config/nitrogen/nitrogen.cfg
@@ -0,0 +1,12 @@
+[geometry]
+posx=20
+posy=50
+sizex=1297
+sizey=696
+
+[nitrogen]
+view=icon
+recurse=true
+sort=alpha
+icon_caps=false
+dirs=/home/leon/Bilder/wallpapers;
diff --git a/files/.config/picom.conf b/files/.config/picom.conf
new file mode 100644
index 0000000..e35f79b
--- /dev/null
+++ b/files/.config/picom.conf
@@ -0,0 +1,178 @@
+# Thank you code_nomad: http://9m.no/ꪯ鵞
+# and Arch Wiki contributors: https://wiki.archlinux.org/index.php/Compton
+
+# Backend --------------------- {{{
+
+# Backend to use: "xrender" or "glx".
+# GLX backend is typically much faster but depends on a sane driver.
+backend = "glx";
+
+glx-no-stencil = true;
+glx-copy-from-front = false;
+
+# }}}
+
+# Shadows -------------------------------- {{{
+shadow = true;
+#shadow-radius = 20;
+#shadow-offset-x = -20;
+#shadow-offset-y = -20;
+
+#hadow-radius = 3;
+#shadow-offset-x = 3;
+#shadow-offset-y = 3;
+#shadow-opacity = 0.6;
+shadow-radius = 18;
+shadow-offset-x = -14;
+shadow-offset-y = -10;
+shadow-opacity = 1.0;
+# shadow-red = 0.0;
+# shadow-green = 0.0;
+# shadow-blue = 0.0;
+
+shadow-exclude = [
+ "! name~=''",
+ #"!focused && ! class_g ?='xfce4-notifyd'",
+ #"name *= 'polybar'",
+ "name = 'Notification'",
+ "name = 'Plank'",
+ "name = 'Docky'",
+ "name = 'Kupfer'",
+ #"name = 'xfce4-notifyd'",
+ "name *= 'VLC'",
+ "name *= 'compton'",
+ "name *= 'picom'",
+ "class_g = 'Conky'",
+ "class_g = 'Kupfer'",
+ "class_g = 'Synapse'",
+ "class_g ?= 'Notify-osd'",
+ "class_g ?= 'Cairo-dock'",
+ #"class_g ?= 'Xfce4-notifyd'",
+ "class_g ?= 'Xfce4-power-manager'",
+ "_GTK_FRAME_EXTENTS@:c",
+ "_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'"
+];
+# Avoid drawing shadow on all shaped windows (see also: --detect-rounded-corners)
+shadow-ignore-shaped = false;
+
+# }}}
+# Opacity and blur ------------------------------------- {{{
+
+inactive-opacity = 1;
+active-opacity = 1;
+frame-opacity = 1;
+#inactive-opacity-override = true;
+
+# Dim inactive windows. (0.0 - 1.0)
+inactive-dim = 1;
+# Do not let dimness adjust based on window opacity.
+#inactive-dim-fixed = true;
+# Blur background of transparent windows. Bad performance with X Render backend. GLX backend is preferred.
+
+blur-background = false;
+#blur-method = "dual_kawase";
+#blur-method = "kernel";
+blur-strength = 20; # max 20
+blur-size = 20;
+# Blur background of opaque windows with transparent frames as well.
+ blur-background-frame = false;
+# Do not let blur radius adjust based on window opacity.
+blur-background-fixed = false;
+blur-background-exclude = [
+ #"window_type = 'dock'",
+ "window_type = 'desktop'",
+
+ "! name~=''",
+ "name *= 'slop'",
+ "name = 'Notification'",
+ "name = 'xfce4-notifyd'",
+ "name *= 'compton'",
+ "name *= 'picom'",
+ "class_g ?= 'Xfce4-notifyd'",
+ "class_g ?= 'Xfce4-power-manager'",
+ "_GTK_FRAME_EXTENTS@:c",
+ "_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'"
+
+];
+
+# }}}
+# Fading ---------------------------------- {{{
+
+# Fade windows during opacity changes.
+fading = false;
+# The time between steps in a fade in milliseconds. (default 10).
+fade-delta = 4;
+# Opacity change between steps while fading in. (default 0.028).
+fade-in-step = 0.03;
+# Opacity change between steps while fading out. (default 0.03).
+fade-out-step = 0.03;
+# Fade windows in/out when opening/closing
+no-fading-openclose = false;
+
+# Specify a list of conditions of windows that should not be faded.
+fade-exclude = [ ];
+
+# }}}
+# Other ---------------------------------- {{{
+
+# Try to detect WM windows and mark them as active.
+mark-wmwin-focused = true;
+# Mark all non-WM but override-redirect windows active (e.g. menus).
+mark-ovredir-focused = true;
+# Use EWMH _NET_WM_ACTIVE_WINDOW to determine which window is focused instead of using FocusIn/Out events.
+# Usually more reliable but depends on a EWMH-compliant WM.
+use-ewmh-active-win = true;
+# Detect rounded corners and treat them as rectangular when --shadow-ignore-shaped is on.
+detect-rounded-corners = true;
+
+# Detect _NET_WM_OPACITY on client windows, useful for window managers not passing _NET_WM_OPACITY of client windows to frame windows.
+# This prevents opacity being ignored for some apps.
+# For example without this enabled my xfce4-notifyd is 100% opacity no matter what.
+detect-client-opacity = true;
+
+vsync = true;
+# Enable DBE painting mode, intended to use with VSync to (hopefully) eliminate tearing. Reported to have no effect, though.
+dbe = false;
+
+# Unredirect all windows if a full-screen opaque window is detected, to maximize performance for full-screen windows, like games.
+# Known to cause flickering when redirecting/unredirecting windows.
+unredir-if-possible = false;
+
+# Specify a list of conditions of windows that should always be considered focused.
+focus-exclude = [ ];
+
+# Use WM_TRANSIENT_FOR to group windows, and consider windows in the same group focused at the same time.
+detect-transient = true;
+# Use WM_CLIENT_LEADER to group windows, and consider windows in the same group focused at the same time.
+# WM_TRANSIENT_FOR has higher priority if --detect-transient is enabled, too.
+detect-client-leader = true;
+
+# }}}
+# Window type settings ---------------------------------- {{{
+
+wintypes:
+{
+ menu = {
+ opacity = 1;
+ shadow = true;
+ fade = true;
+ full-shadow = true;
+ };
+
+ dropdown_menu = {
+ opacity = 1;
+ shadow = true;
+ fade = true;
+ full-shadow = true;
+ };
+ tooltip = {
+ fade = true;
+ shadow = true;
+ opacity = 1.00;
+ focus = true;
+ };
+};
+
+xrender-sync-fence = true;
+
+# }}}
diff --git a/files/.config/polybar/bak-config.ini b/files/.config/polybar/bak-config.ini
new file mode 100644
index 0000000..caadf13
--- /dev/null
+++ b/files/.config/polybar/bak-config.ini
@@ -0,0 +1,237 @@
+
+;==========================================================
+;
+;
+; ██████╗ ██████╗ ██╗ ██╗ ██╗██████╗ █████╗ ██████╗
+; ██╔══██╗██╔═══██╗██║ ╚██╗ ██╔╝██╔══██╗██╔══██╗██╔══██╗
+; ██████╔╝██║ ██║██║ ╚████╔╝ ██████╔╝███████║██████╔╝
+; ██╔═══╝ ██║ ██║██║ ╚██╔╝ ██╔══██╗██╔══██║██╔══██╗
+; ██║ ╚██████╔╝███████╗██║ ██████╔╝██║ ██║██║ ██║
+; ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝
+;
+; ; To learn more about how to configure Polybar
+; go to https://github.com/polybar/polybar
+;
+; The README contains a lot of information
+;
+;==========================================================
+
+;; Colors ------------------------------------------- {{{
+
+[colors]
+;background = ${xrdb:color0:#222}
+;background = #bb282828
+;background = #88282828
+background = #00282828
+;background = #222
+background-alt = #444
+;foreground = ${xrdb:color7:#222}
+foreground = #dfdfdf
+foreground-alt = #888
+primary = #ffb52a
+secondary = #e60053
+alert = #bd2c40
+
+;; }}}
+
+;; Bar config ----------------------------------------- {{{
+
+[bar/main]
+width = 100%
+height = 25
+radius = 0.0
+enable-ipc = true
+padding = 0
+;; center centered modules on screen, not between other modules
+fixed-center = true
+
+separator = "%{F#aaa}|%{F-}"
+separator-padding = 1
+
+background = ${colors.background}
+foreground = ${colors.foreground}
+
+line-size = 3
+line-color = #f00
+
+border-size = 0
+border-color = #00000000
+
+padding-left = 0
+padding-right = 2
+
+module-margin-left = 1
+module-margin-right = 2
+
+font-0 = fixed:pixelsize=10;1
+;font-1 = unifont:fontformat=truetype:size=8:antialias=false;0
+;font-2 = siji:pixelsize=10;1
+;font-7 = NotoEmoji:size=7;
+;font-7 = "JetBrainsMono Nerd Font:size=7"
+;font-0 = "JetBrainsMono Nerd Font:fontformat=truetype:size=10;2"
+;font-0 = "Iosevka Nerd Font:size=10;1"
+;font-1 = "NotoEmoji:scale=10;1"
+font-1 = "Symbola:size=10;1"
+font-2 = FontAwesome5Free:style=Solid:size=8;0
+;font-1 = "FontAwesome:fontformat=truetype:size=12;1"
+
+
+modules-left = xmonad
+modules-center = timerDisplay spotify mpd gitlab-pipeline player-mpv-tail
+modules-right = pulseaudio-control updates-arch network-traffic pulseaudio filesystem memory cpu date
+
+tray-position = right
+tray-padding = 2
+tray-maxsize = 16
+tray-background = ${colors.background}
+;tray-background = #0063ff
+
+cursor-click = pointer
+cursor-scroll = ns-resize
+
+;; }}}
+
+;; MODULES ----------------------------------------------- {{{
+
+; show's currently focussed window, already contained in xmonad module
+[module/xwindow]
+type = internal/xwindow
+label = %title:0:30:...%
+
+[module/filesystem]
+type = internal/fs
+interval = 25
+
+mount-0 = /
+format-mounted =
+;format-mounted-prefix = "disk: "
+;format-mounted-prefix-foreground = ${colors.foreground-alt}
+format-mounted-prefix = "%{F#0fca42} %{F-} "
+;format-mounted-prefix = " "
+;format-mounted-underline = #0fca42
+;label-mounted = %{F#0a81f5}%mountpoint%%{F-}: %percentage_used%%
+label-mounted = %percentage_used%%
+label-unmounted = %mountpoint% not mounted
+label-unmounted-foreground = ${colors.foreground-alt}
+
+
+[module/mpd]
+type = internal/mpd
+format-online =
+
+icon-prev =
+icon-stop =
+icon-play =
+icon-pause =
+icon-next =
+
+label-song-maxlen = 25
+label-song-ellipsis = true
+
+
+[module/cpu]
+type = internal/cpu
+interval = 2
+;format-prefix = "cpu: "
+;format-prefix-foreground = ${colors.foreground-alt}
+format-prefix = "%{F#f9a000} %{F-} "
+;format-prefix = " "
+#format-underline = #f9a000
+label = %percentage:2%%
+
+[module/memory]
+type = internal/memory
+interval = 2
+;format-prefix = "mem: "
+;format-prefix-foreground = ${colors.foreground-alt}
+format-prefix = "%{F#0a6cf5} %{F-} "
+;format-prefix = " "
+#format-underline = #0a6cf5
+label = %percentage_used%%
+
+[module/date]
+type = internal/date
+interval = 5
+date = %a %d-%m-%y
+date-alt = %d-%m-%Y
+time = %H:%M
+time-alt = %H:%M:%S
+
+format-prefix = "%{F#fbff8c} %{F-}"
+;format-prefix = " "
+;format-prefix-foreground = ${colors.foreground-alt}
+;#format-underline = #4bffdc
+#format-underline = #fbff8c
+label = %time% | %date%
+
+[module/xmonad]
+type = custom/script
+exec = xmonad-log
+tail = true
+
+
+[module/timerDisplay]
+type = custom/script
+exec = "[ -f ~/scripts/remainingTime.txt ] && head -n 1 scripts/remainingTime.txt"
+interval = 1
+
+
+;[module/gitlab-pipeline]
+;type = custom/script
+;exec = ~/scripts/fetch-running-pipelines.sh
+;interval = 10
+
+[module/info-pingrtt]
+type = custom/script
+exec = ~/.config/polybar/polybar-scripts/info-pingrtt.sh
+interval = 10
+
+
+[module/player-mpv-tail]
+type = custom/script
+exec = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -t 42 -c '#abb2bf'
+tail = true
+click-left = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p pause
+click-middle = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p playlist-pos -1
+click-right = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p playlist-pos +1
+scroll-up = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p time-pos -10
+scroll-down = ~/.config/polybar/polybar-scripts/player-mpv-tail.py -p time-pos +10
+
+
+[module/network-traffic]
+; configure interval, etc in script
+type = custom/script
+exec = ~/.config/polybar/polybar-scripts/network-traffic.sh
+tail = true
+
+
+[module/spotify]
+type = custom/script
+interval = 1
+format = "