diff options
42 files changed, 243 insertions, 5144 deletions
diff --git a/.cache/wal/chromium/Cached Theme.pak b/.cache/wal/chromium/Cached Theme.pak Binary files differindex 1f8d6ae..abe434b 100644 --- a/.cache/wal/chromium/Cached Theme.pak +++ b/.cache/wal/chromium/Cached Theme.pak diff --git a/.cache/wal/chromium/bg.png b/.cache/wal/chromium/bg.png Binary files differindex bdfefb1..5995ddc 100644 --- a/.cache/wal/chromium/bg.png +++ b/.cache/wal/chromium/bg.png diff --git a/.cache/wal/chromium/manifest.json b/.cache/wal/chromium/manifest.json index 642d068..63441e0 100644 --- a/.cache/wal/chromium/manifest.json +++ b/.cache/wal/chromium/manifest.json @@ -8,9 +8,9 @@ }, "colors": { "bookmark_text": [ - 239, - 239, - 239 + 252, + 249, + 247 ], "frame": [ 255, @@ -18,44 +18,44 @@ 255 ], "ntp_background": [ - 5, - 5, - 5 + 18, + 18, + 18 ], "ntp_text": [ - 5, - 5, - 5 + 18, + 18, + 18 ], "tab_background_text": [ - 167, - 167, - 167 + 223, + 158, + 126 ], "tab_background_text_inactive": [ - 167, - 167, - 167 + 223, + 158, + 126 ], "tab_background_text_incognito": [ - 167, - 167, - 167 + 223, + 158, + 126 ], "tab_background_text_incognito_inactive": [ - 167, - 167, - 167 + 223, + 158, + 126 ], "tab_text": [ - 239, - 239, - 239 + 252, + 249, + 247 ], "toolbar": [ - 6, - 6, - 6 + 23, + 23, + 24 ], "button_background": [ 255, @@ -65,9 +65,9 @@ }, "tints": { "buttons": [ - 0.5049019607843137, - 19.767441860465127, - 67.45098039215686 + 0.5461538461538459, + 29.279279279279276, + 87.05882352941177 ], "frame_inactive": [ -1, diff --git a/.cache/wal/colors.json b/.cache/wal/colors.json index 5b0ba5d..3b3d168 100644 --- a/.cache/wal/colors.json +++ b/.cache/wal/colors.json @@ -3,26 +3,26 @@ "alpha": "100", "special": { - "background": "#050505", - "foreground": "#f0f0f0", - "cursor": "#f0f0f0" + "background": "#262427", + "foreground": "#f9ece8", + "cursor": "#f9ece8" }, "colors": { - "color0": "#050505", - "color1": "#ac8a8c", - "color2": "#8aac8b", - "color3": "#aca98a", - "color4": "#8f8aac", - "color5": "#ac8aac", - "color6": "#8aabac", - "color7": "#e7e7e7", - "color8": "#676767", - "color9": "#ac8a8c", - "color10": "#8aac8b", - "color11": "#aca98a", - "color12": "#8f8aac", - "color13": "#ac8aac", - "color14": "#8aabac", - "color15": "#f0f0f0" + "color0": "#262427", + "color1": "#DE9DAC", + "color2": "#9DDEAF", + "color3": "#DEDD9D", + "color4": "#9DACDE", + "color5": "#AF9DDE", + "color6": "#9DCCDE", + "color7": "#f4e0d8", + "color8": "#393b3b", + "color9": "#F7AFC0", + "color10": "#AFF7C3", + "color11": "#F7F6AF", + "color12": "#AFC0F7", + "color13": "#C3AFF7", + "color14": "#AFE3F7", + "color15": "#f9ece8" } } diff --git a/.config/BetterDiscord/plugins/BDFDB.config.json b/.config/BetterDiscord/plugins/BDFDB.config.json deleted file mode 100644 index 3458f38..0000000 --- a/.config/BetterDiscord/plugins/BDFDB.config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "settings": { - "showSupportBadges": true, - "showToasts": true - }, - "welcomeScreen": { - "seen": false - } -}
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/BadgesEverywhere.config.json b/.config/BetterDiscord/plugins/BadgesEverywhere.config.json deleted file mode 100644 index 404c91c..0000000 --- a/.config/BetterDiscord/plugins/BadgesEverywhere.config.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "badges": { - "1": true, - "2": true, - "4": true, - "8": true, - "64": true, - "128": true, - "256": true, - "512": true, - "16384": true, - "131072": true, - "262144": true, - "524288": true - }, - "changelog": { - "currentversion": "1.5.5" - }, - "indicators": { - "CURRENT_GUILD_BOOST": true - }, - "settings": { - "showInChat": true, - "showInMemberList": true, - "showInPopout": true, - "showNitroDate": true, - "useColoredVersion": true - } -}
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/BetterSearchPage.config.json b/.config/BetterDiscord/plugins/BetterSearchPage.config.json deleted file mode 100644 index 856dabf..0000000 --- a/.config/BetterDiscord/plugins/BetterSearchPage.config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "settings": { - "addFirstLast": true, - "addJumpTo": true, - "cloneToTheTop": true - } -}
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/BetterSearchPage.plugin.js b/.config/BetterDiscord/plugins/BetterSearchPage.plugin.js deleted file mode 100644 index e63763f..0000000 --- a/.config/BetterDiscord/plugins/BetterSearchPage.plugin.js +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @name BetterSearchPage - * @authorId 278543574059057154 - * @invite Jx3TjNS - * @donate https://www.paypal.me/MircoWittrien - * @patreon https://www.patreon.com/MircoWittrien - * @website https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/BetterSearchPage - * @source https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/BetterSearchPage/BetterSearchPage.plugin.js - */ - -module.exports = (_ => { - const config = { - "info": { - "name": "BetterSearchPage", - "author": "DevilBro", - "version": "1.1.6", - "description": "Add some extra controls to the search results page" - } - }; - return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { - getName () {return config.info.name;} - getAuthor () {return config.info.author;} - getVersion () {return config.info.version;} - getDescription () {return config.info.description;} - - load() { - if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue:[]}); - if (!window.BDFDB_Global.downloadModal) { - window.BDFDB_Global.downloadModal = true; - BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click "Download Now" to install it.`, { - confirmText: "Download Now", - cancelText: "Cancel", - onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, - onConfirm: _ => { - delete window.BDFDB_Global.downloadModal; - require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (e, r, b) => { - if (!e && b && b.indexOf(`* @name BDFDB`) > -1) require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), b, _ => {}); - else BdApi.alert("Error", "Could not download BDFDB library plugin, try again some time later."); - }); - } - }); - } - if (!window.BDFDB_Global.pluginQueue.includes(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name); - } - start() {this.load();} - stop() {} - } : (([Plugin, BDFDB]) => { - var settings = {}; - - return class BetterSearchPage extends Plugin { - onLoad() { - this.defaults = { - settings: { - addFirstLast: {value:true, description:"Add a first and last page button"}, - addJumpTo: {value:true, description:"Add a jump to input field (press enter to jump)"}, - cloneToTheTop: {value:true, description:"Clone the controls to the top of the results page"} - } - }; - - this.patchedModules = { - after: { - SearchResultsInner: "default" - } - }; - - } - - onStart() { - this.forceUpdateAll(); - } - - onStop() { - this.forceUpdateAll(); - } - - getSettingsPanel (collapseStates = {}) { - let settingsPanel, settingsItems = []; - - for (let key in settings) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { - type: "Switch", - plugin: this, - keys: ["settings", key], - label: this.defaults.settings[key].description, - value: settings[key] - })); - - return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, settingsItems); - } - - onSettingsClosed (e) { - if (this.SettingsUpdated) { - delete this.SettingsUpdated; - this.forceUpdateAll(); - } - } - - forceUpdateAll () { - settings = BDFDB.DataUtils.get(this, "settings"); - - BDFDB.PatchUtils.forceAllUpdates(this); - } - - processSearchResultsInner (e) { - if (e.instance.props.search) { - let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name:"SearchPagination"}); - if (index > -1) { - let currentPage = parseInt(Math.floor(e.instance.props.search.offset / BDFDB.DiscordConstants.SEARCH_PAGE_SIZE)) + 1; - let maxPage = e.instance.props.search.totalResults > 5000 ? parseInt(Math.ceil(5000 / BDFDB.DiscordConstants.SEARCH_PAGE_SIZE)) : parseInt(Math.ceil(e.instance.props.search.totalResults / BDFDB.DiscordConstants.SEARCH_PAGE_SIZE)); - let doJump = page => { - page = page < 1 ? 1 : (page > maxPage ? maxPage : page); - if (page < currentPage) BDFDB.LibraryModules.SearchPageUtils.searchPreviousPage(e.instance.props.searchId, (currentPage - page) * BDFDB.DiscordConstants.SEARCH_PAGE_SIZE); - else if (page > currentPage) BDFDB.LibraryModules.SearchPageUtils.searchNextPage(e.instance.props.searchId, (page - currentPage) * BDFDB.DiscordConstants.SEARCH_PAGE_SIZE); - }; - let pagination = children[index].type(children[index].props); - if (!pagination) return; - - if (currentPage >= maxPage) { - pagination.props.children[2].props.className = BDFDB.DOMUtils.formatClassName(pagination.props.children[2].props.className, BDFDB.disCN.searchresultspaginationdisabled); - pagination.props.children[2].props.onClick = _ => {}; - } - pagination.props.children[0] = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - text: "Previous", - children: pagination.props.children[0] - }); - pagination.props.children[2] = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - text: currentPage >= maxPage ? "Max Page is 200" : "Next", - tooltipConfig: {color: currentPage >= maxPage && BDFDB.LibraryComponents.TooltipContainer.Colors.RED}, - children: pagination.props.children[2] - }); - if (settings.addFirstLast) { - pagination.props.children.unshift(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - text: BDFDB.LanguageUtils.LibraryStrings.first, - "aria-label": BDFDB.LanguageUtils.LibraryStrings.first, - onClick: _ => {if (currentPage != 1) doJump(1);}, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Clickable, { - className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.searchresultspaginationbutton, currentPage == 1 && BDFDB.disCN.searchresultspaginationdisabled), - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, { - className: BDFDB.disCN.searchresultspaginationicon, - name: BDFDB.LibraryComponents.SvgIcon.Names.LEFT_DOUBLE_CARET - }) - }) - })); - pagination.props.children.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - text: currentPage >= maxPage ? "Max Page is 200" : BDFDB.LanguageUtils.LibraryStrings.last, - tooltipConfig: {color: currentPage >= maxPage && BDFDB.LibraryComponents.TooltipContainer.Colors.RED}, - "aria-label": BDFDB.LanguageUtils.LibraryStrings.last, - onClick: _ => {if (currentPage != maxPage) doJump(maxPage);}, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Clickable, { - className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.searchresultspaginationbutton, currentPage >= maxPage && BDFDB.disCN.searchresultspaginationdisabled), - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, { - className: BDFDB.disCN.searchresultspaginationicon, - name: BDFDB.LibraryComponents.SvgIcon.Names.RIGHT_DOUBLE_CARET - }) - }) - })); - } - if (settings.addJumpTo) { - pagination.props.children.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - key: "BSP-pagination-jumpinput", - type: "number", - size: BDFDB.LibraryComponents.TextInput.Sizes.MINI, - value: currentPage, - min: 1, - max: maxPage, - onKeyDown: (event, instance) => {if (event.which == 13) doJump(instance.props.value);} - })); - pagination.props.children.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - text: BDFDB.LanguageUtils.LanguageStrings.JUMP, - "aria-label": BDFDB.LanguageUtils.LanguageStrings.JUMP, - onClick: (event, instance) => { - let jumpInput = BDFDB.ReactUtils.findOwner(instance._reactInternalFiber.return, {key:"BSP-pagination-jumpinput"}); - if (jumpInput) doJump(jumpInput.props.value); - }, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Clickable, { - className: BDFDB.disCN.searchresultspaginationbutton, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, { - className: BDFDB.disCN.searchresultspaginationicon, - style: {transform: "rotate(90deg"}, - name: BDFDB.LibraryComponents.SvgIcon.Names.RIGHT_CARET - }) - }) - })); - } - children[index] = pagination; - if (settings.cloneToTheTop) children.unshift(pagination); - } - } - } - }; - })(window.BDFDB_Global.PluginUtils.buildPlugin(config)); -})();
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/EditChannels.config.json b/.config/BetterDiscord/plugins/EditChannels.config.json deleted file mode 100644 index 9ae19ab..0000000 --- a/.config/BetterDiscord/plugins/EditChannels.config.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "changeLog": { - "version": "4.1.8" - }, - "changelog": { - "currentversion": "4.1.5" - }, - "channels": { - "716039712799719489": { - "color": [ - 233, - 30, - 99, - 1 - ], - "inheritColor": false, - "name": null - }, - "716039712799719490": { - "color": [ - 233, - 30, - 99, - 1 - ], - "inheritColor": false, - "name": null - }, - "716708258123087873": { - "color": [ - 233, - 30, - 99 - ], - "inheritColor": false, - "name": null - }, - "716739284089962577": { - "color": [ - 233, - 30, - 99, - 1 - ], - "inheritColor": false, - "name": null - }, - "719892211000672296": { - "color": [ - 233, - 30, - 99, - 1 - ], - "inheritColor": false, - "name": null - }, - "722724726425911316": { - "color": [ - 233, - 30, - 99, - 1 - ], - "inheritColor": false, - "name": null - }, - "722732084342423592": { - "color": [ - 233, - 30, - 99, - 1 - ], - "inheritColor": false, - "name": null - }, - "715240118952263691": { - "color": null, - "inheritColor": false, - "name": "announcements" - } - }, - "settings": { - "changeChannelIcon": true, - "changeInAuditLog": true, - "changeInAutoComplete": true, - "changeInChannelHeader": true, - "changeInChannelList": true, - "changeInChatTextarea": true, - "changeInInviteLog": true, - "changeInMentions": true, - "changeInQuickSwitcher": true, - "changeInRecentMentions": true - } -}
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/EditChannels.plugin.js b/.config/BetterDiscord/plugins/EditChannels.plugin.js deleted file mode 100644 index 2f7a518..0000000 --- a/.config/BetterDiscord/plugins/EditChannels.plugin.js +++ /dev/null @@ -1,781 +0,0 @@ -/** - * @name EditChannels - * @authorId 278543574059057154 - * @invite Jx3TjNS - * @donate https://www.paypal.me/MircoWittrien - * @patreon https://www.patreon.com/MircoWittrien - * @website https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/EditChannels - * @source https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/EditChannels/EditChannels.plugin.js - */ - -module.exports = (_ => { - const config = { - "info": { - "name": "EditChannels", - "author": "DevilBro", - "version": "4.1.8", - "description": "Allow you to rename and recolor channelnames" - }, - "changeLog": { - "fixed": { - "Works again": "Yas" - } - } - }; - return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { - getName () {return config.info.name;} - getAuthor () {return config.info.author;} - getVersion () {return config.info.version;} - getDescription () {return config.info.description;} - - load() { - if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue:[]}); - if (!window.BDFDB_Global.downloadModal) { - window.BDFDB_Global.downloadModal = true; - BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click "Download Now" to install it.`, { - confirmText: "Download Now", - cancelText: "Cancel", - onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, - onConfirm: _ => { - delete window.BDFDB_Global.downloadModal; - require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (e, r, b) => { - if (!e && b && b.indexOf(`* @name BDFDB`) > -1) require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), b, _ => {}); - else BdApi.alert("Error", "Could not download BDFDB library plugin, try again some time later."); - }); - } - }); - } - if (!window.BDFDB_Global.pluginQueue.includes(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name); - } - start() {this.load();} - stop() {} - } : (([Plugin, BDFDB]) => { - var changedChannels = {}, settings = {}; - - return class EditChannels extends Plugin { - onLoad() { - this.defaults = { - settings: { - changeChannelIcon: {value:true, inner:false, description:"Change color of Channel Icon"}, - changeInChatTextarea: {value:true, inner:true, description:"Chat Textarea"}, - changeInMentions: {value:true, inner:true, description:"Mentions"}, - changeInChannelList: {value:true, inner:true, description:"Channel List"}, - changeInChannelHeader: {value:true, inner:true, description:"Channel Header"}, - changeInRecentMentions: {value:true, inner:true, description:"Recent Mentions Popout"}, - changeInAutoComplete: {value:true, inner:true, description:"Autocomplete Menu"}, - changeInAuditLog: {value:true, inner:true, description:"Audit Log"}, - changeInInviteLog: {value:true, inner:true, description:"Invite Log"}, - changeInQuickSwitcher: {value:true, inner:true, description:"Quick Switcher"} - } - }; - - this.patchedModules = { - before: { - ChannelEditorContainer: "render", - ChannelAutoComplete: "render", - AutocompleteChannelResult: "render", - AuditLog: "render", - SettingsInvites: "render", - HeaderBarContainer: "render", - ChannelCategoryItem: "default", - ChannelItem: "default", - QuickSwitchChannelResult: "render", - MessageContent: "type" - }, - after: { - AutocompleteChannelResult: "render", - AuditLog: "render", - HeaderBarContainer: "render", - ChannelCategoryItem: "default", - ChannelItem: "default", - QuickSwitchChannelResult: "render", - RecentsChannelHeader: "default" - } - }; - - this.css = ` - ${BDFDB.dotCN.messagespopoutchannelname}:hover > span[style*="color"], - ${BDFDB.dotCN.recentmentionschannelname}:hover > span[style*="color"] { - text-decoration: underline; - } - `; - } - - onStart() { - let observer = new MutationObserver(_ => {this.changeAppTitle();}); - BDFDB.ObserverUtils.connect(this, document.head.querySelector("title"), {name:"appTitleObserver",instance:observer}, {childList:true}); - - if (BDFDB.LibraryModules.AutocompleteOptions && BDFDB.LibraryModules.AutocompleteOptions.AUTOCOMPLETE_OPTIONS) BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.AutocompleteOptions.AUTOCOMPLETE_OPTIONS.CHANNELS, "queryResults", {after: e => { - let channelArray = []; - for (let id in changedChannels) if (changedChannels[id] && changedChannels[id].name) { - let channel = BDFDB.LibraryModules.ChannelStore.getChannel(id); - let category = channel && channel.parent_id && BDFDB.LibraryModules.ChannelStore.getChannel(channel.parent_id); - let catData = category && changedChannels[category.id] || {}; - if (BDFDB.ChannelUtils.isTextChannel(channel) && channel.guild_id == e.methodArguments[0].guild_id) channelArray.push(Object.assign({ - lowerCaseName: changedChannels[id].name.toLowerCase(), - lowerCaseCatName: catData && catData.name && catData.name.toLowerCase(), - channel, - category, - catData - }, changedChannels[id])); - } - channelArray = BDFDB.ArrayUtils.keySort(channelArray.filter(n => e.returnValue.channels.every(channel => channel.id != n.channel.id) && (n.lowerCaseName.indexOf(e.methodArguments[1]) != -1 || (n.lowerCaseCatName && n.lowerCaseCatName.indexOf(e.methodArguments[1]) != -1))), "lowerCaseName"); - e.returnValue.channels = [].concat(e.returnValue.channels, channelArray.map(n => n.channel)).slice(0, BDFDB.DiscordConstants.MAX_AUTOCOMPLETE_RESULTS); - }}); - - this.forceUpdateAll(); - } - - onStop() { - this.forceUpdateAll(); - } - - getSettingsPanel (collapseStates = {}) { - let settingsPanel, settingsItems = []; - - for (let key in settings) if (!this.defaults.settings[key].inner) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { - type: "Switch", - plugin: this, - keys: ["settings", key], - label: this.defaults.settings[key].description, - value: settings[key] - })); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsPanelInner, { - title: "Change Channels in:", - first: settingsItems.length == 0, - children: Object.keys(settings).map(key => this.defaults.settings[key].inner && BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { - type: "Switch", - plugin: this, - keys: ["settings", key], - label: this.defaults.settings[key].description, - value: settings[key] - })) - })); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { - type: "Button", - color: BDFDB.LibraryComponents.Button.Colors.RED, - label: "Reset all Channels", - onClick: _ => { - BDFDB.ModalUtils.confirm(this, "Are you sure you want to reset all channels?", _ => { - BDFDB.DataUtils.remove(this, "channels"); - this.forceUpdateAll(); - }); - }, - children: BDFDB.LanguageUtils.LanguageStrings.RESET - })); - - return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, settingsItems); - } - - onSettingsClosed () { - if (this.SettingsUpdated) { - delete this.SettingsUpdated; - this.forceUpdateAll(); - } - } - - forceUpdateAll (instant = false) { - changedChannels = BDFDB.DataUtils.load(this, "channels"); - settings = BDFDB.DataUtils.get(this, "settings"); - - this.changeAppTitle(); - BDFDB.PatchUtils.forceAllUpdates(this); - BDFDB.ChannelUtils.rerenderAll(instant); - BDFDB.ReactUtils.forceUpdate(BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.app), {name:"Channel", unlimited:true})); - } - - onChannelContextMenu (e) { - if (e.instance.props.channel) { - let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "devmode-copy-id", group: true}); - children.splice(index > -1 ? index : children.length, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { - children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.context_localchannelsettings_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "settings-submenu"), - children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { - children: [ - BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.submenu_channelsettings_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "settings-change"), - action: _ => { - this.openChannelSettingsModal(e.instance.props.channel); - } - }), - BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.submenu_resetsettings_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "settings-reset"), - disabled: !changedChannels[e.instance.props.channel.id], - action: _ => { - BDFDB.DataUtils.remove(this, "channels", e.instance.props.channel.id); - this.forceUpdateAll(true); - } - }) - ] - }) - }) - })); - } - } - - processChannelEditorContainer (e) { - if (!e.instance.props.disabled && e.instance.props.channel && BDFDB.ChannelUtils.isTextChannel(e.instance.props.channel) && e.instance.props.type == BDFDB.DiscordConstants.TextareaTypes.NORMAL && settings.changeInChatTextarea) { - let data = changedChannels[e.instance.props.channel.id]; - e.instance.props.placeholder = BDFDB.LanguageUtils.LanguageStringsFormat("TEXTAREA_PLACEHOLDER", `#${data && data.name || e.instance.props.channel.name}`); - } - } - - processAutocompleteChannelResult (e) { - if (e.instance.props.channel && settings.changeInAutoComplete) { - if (!e.returnvalue) { - e.instance.props.channel = this.getChannelData(e.instance.props.channel.id); - if (e.instance.props.category) e.instance.props.category = this.getChannelData(e.instance.props.category.id); - } - else { - let channelName = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.marginleft4]]}); - if (channelName) this.changeChannelColor(channelName, e.instance.props.channel.id); - let channelIcon = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.autocompleteicon]]}); - if (channelIcon) this.changeChannelIconColor(channelIcon, e.instance.props.channel.id, {alpha: 0.6}); - if (e.instance.props.category) { - let categoryName = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.autocompletedescription]]}); - if (categoryName) this.changeChannelColor(categoryName, e.instance.props.category.id); - } - } - } - } - - processAuditLog (e) { - let channel = BDFDB.ObjectUtils.get(e.instance, "props.log.options.channel"); - if (channel && settings.changeInAuditLog) { - if (!e.returnvalue) e.instance.props.log.options.channel = this.getChannelData(channel.id); - else { - let channelName = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["children", [["#" + channel.name]]]]}); - if (channelName) this.changeChannelColor(channelName, channel.id); - } - } - } - - processSettingsInvites (e) { - if (BDFDB.ObjectUtils.is(e.instance.props.invites) && settings.changeInInviteLog) { - e.instance.props.invites = Object.assign({}, e.instance.props.invites); - for (let id in e.instance.props.invites) e.instance.props.invites[id] = new BDFDB.DiscordObjects.Invite(Object.assign({}, e.instance.props.invites[id], {channel: this.getChannelData(e.instance.props.invites[id].channel.id)})); - } - } - - processHeaderBarContainer (e) { - let channel = BDFDB.LibraryModules.ChannelStore.getChannel(e.instance.props.channelId); - if (channel && BDFDB.ChannelUtils.isTextChannel(channel) && settings.changeInChannelHeader) { - if (!e.returnvalue) { - let channelName = BDFDB.ReactUtils.findChild(e.instance, {name: "Title"}); - if (channelName) { - channelName.props.children = this.getChannelData(channel.id).name; - this.changeChannelColor(channelName, channel.id); - } - } - else { - let [children, index] = BDFDB.ReactUtils.findParent(e.instance, {name: "Icon"}); - if (index > -1) { - let icon = BDFDB.ReactUtils.createElement(children[index].props.icon, { - className: BDFDB.disCN.channelheadericon - }); - this.changeChannelIconColor(icon, channel.id, {alpha: 0.6}); - children[index] = BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCN.channelheadericonwrapper, - children: icon - }) - } - } - } - } - - processChannelCategoryItem (e) { - if (e.instance.props.channel && settings.changeInChannelList) { - if (!e.returnvalue) e.instance.props.channel = this.getChannelData(e.instance.props.channel.id); - else { - let onMouseEnter = e.returnvalue.props.onMouseEnter || ( _ => {}); - e.returnvalue.props.onMouseEnter = event => { - onMouseEnter(event); - e.instance.setState({hovered: true}); - }; - let onMouseLeave = e.returnvalue.props.onMouseLeave || ( _ => {}); - e.returnvalue.props.onMouseLeave = event => { - onMouseLeave(event); - e.instance.setState({hovered: false}); - }; - let modify = BDFDB.ObjectUtils.extract(Object.assign({}, e.instance.props, e.instance.state), "muted", "locked", "selected", "unread", "connected", "hovered"); - let categoryName = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.categoryname]]}); - if (categoryName) this.changeChannelColor(categoryName, e.instance.props.channel.id, modify); - let categoryIcon = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.categoryicon]]}); - if (categoryIcon) this.changeChannelIconColor(categoryIcon, e.instance.props.channel.id, Object.assign({alpha: 0.6}, modify)); - } - } - } - - processChannelItem (e) { - if (e.instance.props.channel && settings.changeInChannelList) { - if (!e.returnvalue) e.instance.props.channel = this.getChannelData(e.instance.props.channel.id); - else { - let onMouseEnter = e.returnvalue.props.onMouseEnter || ( _ => {}); - e.returnvalue.props.onMouseEnter = event => { - onMouseEnter(event); - e.instance.setState({hovered: true}); - }; - let onMouseLeave = e.returnvalue.props.onMouseLeave || ( _ => {}); - e.returnvalue.props.onMouseLeave = event => { - onMouseLeave(event); - e.instance.setState({hovered: false}); - }; - let modify = BDFDB.ObjectUtils.extract(Object.assign({}, e.instance.props, e.instance.state), "muted", "locked", "selected", "unread", "connected", "hovered"); - let channelName = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.channelname]]}); - if (channelName) this.changeChannelColor(channelName, e.instance.props.channel.id, modify); - let channelIcon = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.channelicon]]}); - if (channelIcon) this.changeChannelIconColor(channelIcon, e.instance.props.channel.id, Object.assign({alpha: 0.6}, modify)); - } - } - } - - processQuickSwitchChannelResult (e) { - if (e.instance.props.channel && settings.changeInQuickSwitcher) { - if (!e.returnvalue) { - e.instance.props.channel = this.getChannelData(e.instance.props.channel.id); - if (e.instance.props.category) e.instance.props.category = this.getChannelData(e.instance.props.category.id); - } - else { - let modify = BDFDB.ObjectUtils.extract(e.instance.props, "focused", "unread", "mentions"); - let channelName = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.quickswitchresultmatch]]}); - if (channelName) this.changeChannelColor(channelName, e.instance.props.channel.id, modify); - let channelIcon = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.quickswitchresulticon]]}); - if (channelIcon) this.changeChannelIconColor(channelIcon, e.instance.props.channel.id, Object.assign({alpha: 0.6}, modify)); - if (e.instance.props.category) { - let categoryName = BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", BDFDB.disCN.quickswitchresultnote]]}); - if (categoryName) this.changeChannelColor(categoryName, e.instance.props.category.id); - } - } - } - } - - processRecentsChannelHeader (e) { - if (settings.changeInRecentMentions && BDFDB.ArrayUtils.is(e.returnvalue.props.children)) { - for (let child of e.returnvalue.props.children) if (child && child.props && child.props.channel && child.type.displayName == "ChannelName") { - child.props.channel = this.getChannelData(child.props.channel.id); - let oldType = child.type; - child.type = (...args) => { - let instance = oldType(...args); - let channelName = BDFDB.ReactUtils.findChild(instance, {props:[["className", BDFDB.disCN.recentmentionschannelname]]}); - if (channelName) this.changeChannelColor(channelName, child.props.channel.id); - return instance; - }; - child.type.displayName = oldType.displayName; - } - } - } - - processMessageContent (e) { - if (BDFDB.ArrayUtils.is(e.instance.props.content) && settings.changeInMentions) for (let ele of e.instance.props.content) { - if (BDFDB.ReactUtils.isValidElement(ele) && ele.type && ele.type.displayName == "Tooltip" && typeof ele.props.children == "function") { - let children = ele.props.children({}); - if (children && children.type.displayName == "Mention" && children.props.children && typeof children.props.children[0] == "string" && children.props.children[0][0] == "#") { - let channelName = children.props.children[0].slice(1); - let guildId = BDFDB.LibraryModules.LastGuildStore.getGuildId(); - let channels = guildId && (BDFDB.LibraryModules.GuildChannelStore.getChannels(guildId)[0] || BDFDB.LibraryModules.GuildChannelStore.getChannels(guildId).SELECTABLE); - if (Array.isArray(channels)) for (let channelObj of channels) { - if (channelName == channelObj.channel.name) { - let category = BDFDB.LibraryModules.ChannelStore.getChannel(channelObj.channel.parent_id); - if (!category || category && ele.props.text == category.name) { - if (category) { - let categoryData = changedChannels[category.id]; - if (categoryData && categoryData.name) ele.props.text = categoryData.name; - } - let name = (changedChannels[channelObj.channel.id] || {}).name; - let color = this.getChannelDataColor(channelObj.channel.id); - if (name || color) { - let renderChildren = ele.props.children; - ele.props.children = (...args) => { - let renderedChildren = renderChildren(...args); - if (name) renderedChildren.props.children[0] = "#" + name; - if (color) { - let color1_0 = BDFDB.ColorUtils.convert(BDFDB.ObjectUtils.is(color) ? color[0] : color, "RGBA"); - let color0_1 = BDFDB.ColorUtils.setAlpha(color1_0, 0.1, "RGBA"); - let color0_7 = BDFDB.ColorUtils.setAlpha(color1_0, 0.7, "RGBA"); - renderedChildren.props.style = Object.assign({}, renderedChildren.props.style, { - background: color0_1, - color: color1_0 - }); - let onMouseEnter = renderedChildren.props.onMouseEnter || ( _ => {}); - renderedChildren.props.onMouseEnter = event => { - onMouseEnter(event); - event.target.style.setProperty("background", color0_7, "important"); - event.target.style.setProperty("color", "#FFFFFF", "important"); - }; - let onMouseLeave = renderedChildren.props.onMouseLeave || ( _ => {}); - renderedChildren.props.onMouseLeave = event => { - onMouseLeave(event); - event.target.style.setProperty("background", color0_1, "important"); - event.target.style.setProperty("color", color1_0, "important"); - }; - } - return renderedChildren; - } - } - break; - } - } - } - } - } - } - } - - changeAppTitle () { - let channel = BDFDB.LibraryModules.ChannelStore.getChannel(BDFDB.LibraryModules.LastChannelStore.getChannelId()); - let title = document.head.querySelector("title"); - if (title && BDFDB.ChannelUtils.isTextChannel(channel)) BDFDB.DOMUtils.setText(title, "@" + this.getChannelData(channel.id, settings.changeAppTitle).name); - } - - changeChannelColor (child, channelId, modify) { - if (BDFDB.ReactUtils.isValidElement(child)) { - let color = this.getChannelDataColor(channelId); - if (color) { - color = modify ? this.chooseColor(color, modify) : BDFDB.ColorUtils.convert(color, "RGBA"); - let childProp = child.props.children ? "children" : "text"; - let fontGradient = BDFDB.ObjectUtils.is(color); - if (fontGradient) child.props[childProp] = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextGradientElement, { - gradient: BDFDB.ColorUtils.createGradient(color), - children: child.props[childProp] - }); - else child.props[childProp] = BDFDB.ReactUtils.createElement("span", { - style: {color: color}, - children: child.props[childProp] - }); - } - } - } - - changeChannelIconColor (child, channelId, modify) { - let color = this.getChannelDataColor(channelId); - if (color && settings.changeChannelIcon) { - color = modify ? this.chooseColor(BDFDB.ObjectUtils.is(color) ? color[0] : color, modify) : BDFDB.ColorUtils.convert(BDFDB.ObjectUtils.is(color) ? color[0] : color, "RGBA"); - child.props.color = color || "currentColor"; - if (color) child.props.foreground = null; - } - } - - chooseColor (color, config) { - if (color) { - if (BDFDB.ObjectUtils.is(config)) { - if (config.mentions || config.focused || config.hovered || config.selected || config.unread || config.connected) color = BDFDB.ColorUtils.change(color, 0.5); - else if (config.muted || config.locked) color = BDFDB.ColorUtils.change(color, -0.5); - } - return BDFDB.ColorUtils.convert(color, "RGBA"); - } - return null; - } - - getChannelDataColor (channelId) { - let channel = BDFDB.LibraryModules.ChannelStore.getChannel(channelId); - if (!channel) return null; - let channelData = changedChannels[channel.id]; - if (channelData && channelData.color) return channelData.color; - let category = channel.parent_id && BDFDB.LibraryModules.ChannelStore.getChannel(channel.parent_id); - if (category) { - let categoryData = changedChannels[category.id]; - if (categoryData && categoryData.inheritColor && categoryData.color) return categoryData.color; - } - return null; - } - - getChannelData (channelId, change = true) { - let channel = BDFDB.LibraryModules.ChannelStore.getChannel(channelId); - if (!channel) return new BDFDB.DiscordObjects.Channel({}); - let data = change && changedChannels[channel.id]; - if (data) { - let nativeObject = new BDFDB.DiscordObjects.Channel(channel); - nativeObject.name = data.name || nativeObject.name; - return nativeObject; - } - return new BDFDB.DiscordObjects.Channel(channel); - } - - openChannelSettingsModal (channel) { - let data = changedChannels[channel.id] || {}; - - BDFDB.ModalUtils.open(this, { - size: "MEDIUM", - header: this.labels.modal_header_text, - subheader: channel.name, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: this.labels.modal_channelname_text, - className: BDFDB.disCN.marginbottom20 + " input-channelname", - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - value: data.name, - placeholder: channel.name, - autoFocus: true - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormDivider, { - className: BDFDB.disCN.dividerdefault - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: this.labels.modal_colorpicker1_text, - className: BDFDB.disCN.marginbottom20, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { - color: data.color, - number: 1 - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { - type: "Switch", - className: "input-inheritcolor", - margin: 20, - label: this.labels.modal_inheritcolor_text, - tag: BDFDB.LibraryComponents.FormComponents.FormTitle.Tags.H5, - value: channel.type == 4 && data.inheritColor, - disabled: channel.type != 4 - }) - ], - buttons: [{ - contents: BDFDB.LanguageUtils.LanguageStrings.SAVE, - color: "BRAND", - close: true, - click: modal => { - let oldData = Object.assign({}, data); - - data.name = modal.querySelector(".input-channelname " + BDFDB.dotCN.input).value.trim() || null; - - data.color = BDFDB.ColorUtils.getSwatchColor(modal, 1); - if (data.color != null && !BDFDB.ObjectUtils.is(data.color)) { - if (data.color[0] < 30 && data.color[1] < 30 && data.color[2] < 30) data.color = BDFDB.ColorUtils.change(data.color, 30); - else if (data.color[0] > 225 && data.color[1] > 225 && data.color[2] > 225) data.color = BDFDB.ColorUtils.change(data.color, -30); - } - - data.inheritColor = modal.querySelector(".input-inheritcolor " + BDFDB.dotCN.switchinner).checked; - - let changed = false; - if (Object.keys(data).every(key => data[key] == null || data[key] == false) && (changed = true)) BDFDB.DataUtils.remove(this, "channels", channel.id); - else if (!BDFDB.equals(oldData, data) && (changed = true)) BDFDB.DataUtils.save(data, this, "channels", channel.id); - if (changed) this.forceUpdateAll(true); - } - }] - }); - } - - setLabelsByLanguage () { - switch (BDFDB.LanguageUtils.getLanguage().id) { - case "hr": //croatian - return { - context_localchannelsettings_text: "Postavke lokalnih kanala", - submenu_channelsettings_text: "Promijeni postavke", - submenu_resetsettings_text: "Vraćanje kanala", - modal_header_text: "Postavke lokalnih kanala", - modal_channelname_text: "Naziv lokalnog kanala", - modal_colorpicker1_text: "Boja lokalnog kanala", - modal_inheritcolor_text: "Naslijedi boju u potkanale" - }; - case "da": //danish - return { - context_localchannelsettings_text: "Lokal kanalindstillinger", - submenu_channelsettings_text: "Skift indstillinger", - submenu_resetsettings_text: "Nulstil kanal", - modal_header_text: "Lokal kanalindstillinger", - modal_channelname_text: "Lokalt kanalnavn", - modal_colorpicker1_text: "Lokal kanalfarve", - modal_inheritcolor_text: "Arve farve til subkanaler" - }; - case "de": //german - return { - context_localchannelsettings_text: "Lokale Kanaleinstellungen", - submenu_channelsettings_text: "Einstellungen ändern", - submenu_resetsettings_text: "Kanal zurücksetzen", - modal_header_text: "Lokale Kanaleinstellungen", - modal_channelname_text: "Lokaler Kanalname", - modal_colorpicker1_text: "Lokale Kanalfarbe", - modal_inheritcolor_text: "Farbe an Unterkanäle vererben" - }; - case "es": //spanish - return { - context_localchannelsettings_text: "Ajustes local de canal", - submenu_channelsettings_text: "Cambiar ajustes", - submenu_resetsettings_text: "Restablecer canal", - modal_header_text: "Ajustes local de canal", - modal_channelname_text: "Nombre local del canal", - modal_colorpicker1_text: "Color local del canal", - modal_inheritcolor_text: "Heredar color a sub-canales" - }; - case "fr": //french - return { - context_localchannelsettings_text: "Paramètres locale du salon", - submenu_channelsettings_text: "Modifier les paramètres", - submenu_resetsettings_text: "Réinitialiser le salon", - modal_header_text: "Paramètres locale du salon", - modal_channelname_text: "Nom local du salon", - modal_colorpicker1_text: "Couleur locale du salon", - modal_inheritcolor_text: "Hériter de la couleur sur les sous-salons" - }; - case "it": //italian - return { - context_localchannelsettings_text: "Impostazioni locale canale", - submenu_channelsettings_text: "Cambia impostazioni", - submenu_resetsettings_text: "Ripristina canale", - modal_header_text: "Impostazioni locale canale", - modal_channelname_text: "Nome locale canale", - modal_colorpicker1_text: "Colore locale canale", - modal_inheritcolor_text: "Eredita colore per sub-canali" - }; - case "nl": //dutch - return { - context_localchannelsettings_text: "Lokale kanaalinstellingen", - submenu_channelsettings_text: "Verandere instellingen", - submenu_resetsettings_text: "Reset kanaal", - modal_header_text: "Lokale kanaalinstellingen", - modal_channelname_text: "Lokale kanaalnaam", - modal_colorpicker1_text: "Lokale kanaalkleur", - modal_inheritcolor_text: "Overerving van kleuren naar subkanalen" - }; - case "no": //norwegian - return { - context_localchannelsettings_text: "Lokal kanalinnstillinger", - submenu_channelsettings_text: "Endre innstillinger", - submenu_resetsettings_text: "Tilbakestill kanal", - modal_header_text: "Lokal kanalinnstillinger", - modal_channelname_text: "Lokalt kanalnavn", - modal_colorpicker1_text: "Lokal kanalfarge", - modal_inheritcolor_text: "Arve farge til underkanaler" - }; - case "pl": //polish - return { - context_localchannelsettings_text: "Lokalne ustawienia kanału", - submenu_channelsettings_text: "Zmień ustawienia", - submenu_resetsettings_text: "Resetuj ustawienia", - modal_header_text: "Lokalne ustawienia kanału", - modal_channelname_text: "Lokalna nazwa kanału", - modal_colorpicker1_text: "Lokalny kolor kanału", - modal_inheritcolor_text: "Dziedzicz kolor do podkanałów" - }; - case "pt-BR": //portuguese (brazil) - return { - context_localchannelsettings_text: "Configurações local do canal", - submenu_channelsettings_text: "Mudar configurações", - submenu_resetsettings_text: "Redefinir canal", - modal_header_text: "Configurações local do canal", - modal_channelname_text: "Nome local do canal", - modal_colorpicker1_text: "Cor local do canal", - modal_inheritcolor_text: "Herdar cor aos sub-canais" - }; - case "fi": //finnish - return { - context_localchannelsettings_text: "Paikallinen kanavan asetukset", - submenu_channelsettings_text: "Vaihda asetuksia", - submenu_resetsettings_text: "Nollaa kanava", - modal_header_text: "Paikallinen kanavan asetukset", - modal_channelname_text: "Paikallinen kanavanimi", - modal_colorpicker1_text: "Paikallinen kanavanväri", - modal_inheritcolor_text: "Hävitä väri alikanaville" - }; - case "sv": //swedish - return { - context_localchannelsettings_text: "Lokal kanalinställningar", - submenu_channelsettings_text: "Ändra inställningar", - submenu_resetsettings_text: "Återställ kanal", - modal_header_text: "Lokal kanalinställningar", - modal_channelname_text: "Lokalt kanalnamn", - modal_colorpicker1_text: "Lokal kanalfärg", - modal_inheritcolor_text: "Inherit färg till subkanaler" - }; - case "tr": //turkish - return { - context_localchannelsettings_text: "Yerel Kanal Ayarları", - submenu_channelsettings_text: "Ayarları Değiştir", - submenu_resetsettings_text: "Kanal Sıfırla", - modal_header_text: "Yerel Kanal Ayarları", - modal_channelname_text: "Yerel Kanal Adı", - modal_colorpicker1_text: "Yerel Kanal Rengi", - modal_inheritcolor_text: "Renkleri alt kanallara miras alma" - }; - case "cs": //czech - return { - context_localchannelsettings_text: "Místní nastavení kanálu", - submenu_channelsettings_text: "Změnit nastavení", - submenu_resetsettings_text: "Obnovit kanál", - modal_header_text: "Místní nastavení kanálu", - modal_channelname_text: "Místní název kanálu", - modal_colorpicker1_text: "Místní barvy kanálu", - modal_inheritcolor_text: "Zdědit barvu na subkanály" - }; - case "bg": //bulgarian - return { - context_localchannelsettings_text: "Настройки за локални канали", - submenu_channelsettings_text: "Промяна на настройките", - submenu_resetsettings_text: "Възстановяване на канал", - modal_header_text: "Настройки за локални канали", - modal_channelname_text: "Локално име на канал", - modal_colorpicker1_text: "Локален цветен канал", - modal_inheritcolor_text: "Наследи цвета до подканали" - }; - case "ru": //russian - return { - context_localchannelsettings_text: "Настройки локального канала", - submenu_channelsettings_text: "Изменить настройки", - submenu_resetsettings_text: "Сбросить канал", - modal_header_text: "Настройки локального канала", - modal_channelname_text: "Имя локального канала", - modal_colorpicker1_text: "Цвет локального канала", - modal_inheritcolor_text: "Наследовать цвет на подканалы" - }; - case "uk": //ukrainian - return { - context_localchannelsettings_text: "Налаштування локального каналу", - submenu_channelsettings_text: "Змінити налаштування", - submenu_resetsettings_text: "Скидання каналу", - modal_header_text: "Налаштування локального каналу", - modal_channelname_text: "Локальне ім'я каналу", - modal_colorpicker1_text: "Колір місцевого каналу", - modal_inheritcolor_text: "Успадковують колір до підканалів" - }; - case "ja": //japanese - return { - context_localchannelsettings_text: "ローカルチャネル設定", - submenu_channelsettings_text: "設定を変更する", - submenu_resetsettings_text: "チャネルをリセットする", - modal_header_text: "ローカルチャネル設定", - modal_channelname_text: "ローカルチャネル名", - modal_colorpicker1_text: "ローカルチャネルの色", - modal_inheritcolor_text: "サブチャンネルに色を継承" - }; - case "zh-TW": //chinese (traditional) - return { - context_localchannelsettings_text: "本地頻道設置", - submenu_channelsettings_text: "更改設置", - submenu_resetsettings_text: "重置通道", - modal_header_text: "本地頻道設置", - modal_channelname_text: "本地頻道名稱", - modal_colorpicker1_text: "本地頻道顏色", - modal_inheritcolor_text: "繼承子通道的顏色" - }; - case "ko": //korean - return { - context_localchannelsettings_text: "로컬 채널 설정", - submenu_channelsettings_text: "설정 변경", - submenu_resetsettings_text: "채널 재설정", - modal_header_text: "로컬 채널 설정", - modal_channelname_text: "로컬 채널 이름", - modal_colorpicker1_text: "지역 채널 색깔", - modal_inheritcolor_text: "하위 채널에 색상 상속" - }; - default: //default: english - return { - context_localchannelsettings_text: "Local Channelsettings", - submenu_channelsettings_text: "Change Settings", - submenu_resetsettings_text: "Reset Channel", - modal_header_text: "Local Channelsettings", - modal_channelname_text: "Local Channelname", - modal_colorpicker1_text: "Local Channelcolor", - modal_inheritcolor_text: "Inherit color to Sub-Channels" - }; - } - } - }; - })(window.BDFDB_Global.PluginUtils.buildPlugin(config)); -})();
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/EditServers.config.json b/.config/BetterDiscord/plugins/EditServers.config.json deleted file mode 100644 index bf342bb..0000000 --- a/.config/BetterDiscord/plugins/EditServers.config.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "changeLog": { - "version": "2.2.5" - }, - "changelog": { - "currentversion": "2.2.3" - }, - "servers": { - "624859996949315584": { - "banner": "https://media.discordapp.net/attachments/624865812888420352/715196061400039474/8PiLwbX.png", - "color1": null, - "color2": null, - "color3": null, - "color4": null, - "ignoreCustomName": false, - "name": "Gerrit", - "removeBanner": false, - "removeIcon": false, - "shortName": null, - "url": null - }, - "716039712799719486": { - "banner": null, - "color1": [ - 233, - 30, - 99, - 1 - ], - "color2": [ - 233, - 30, - 99, - 1 - ], - "color3": [ - 233, - 30, - 99, - 1 - ], - "color4": [ - 44, - 44, - 44, - 1 - ], - "ignoreCustomName": false, - "name": null, - "removeBanner": false, - "removeIcon": false, - "shortName": null, - "url": null - } - }, - "settings": { - "addOriginalTooltip": true, - "changeInChat": true, - "changeInGuildHeader": true, - "changeInGuildInvites": true, - "changeInGuildList": true, - "changeInMutualGuilds": true, - "changeInQuickSwitcher": true, - "changeInRecentMentions": true - } -}
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/EditServers.plugin.js b/.config/BetterDiscord/plugins/EditServers.plugin.js deleted file mode 100644 index 5484066..0000000 --- a/.config/BetterDiscord/plugins/EditServers.plugin.js +++ /dev/null @@ -1,1106 +0,0 @@ -/** - * @name EditServers - * @authorId 278543574059057154 - * @invite Jx3TjNS - * @donate https://www.paypal.me/MircoWittrien - * @patreon https://www.patreon.com/MircoWittrien - * @website https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/EditServers - * @source https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/EditServers/EditServers.plugin.js - */ - -module.exports = (_ => { - const config = { - "info": { - "name": "EditServers", - "author": "DevilBro", - "version": "2.2.5", - "description": "Allow you to change the icon, name and color of servers" - }, - "changeLog": { - "improved": { - "Welcome Message": "Now also changes the server name in the welcome message" - } - } - }; - - return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { - getName () {return config.info.name;} - getAuthor () {return config.info.author;} - getVersion () {return config.info.version;} - getDescription () {return config.info.description;} - - load() { - if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue:[]}); - if (!window.BDFDB_Global.downloadModal) { - window.BDFDB_Global.downloadModal = true; - BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click "Download Now" to install it.`, { - confirmText: "Download Now", - cancelText: "Cancel", - onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, - onConfirm: _ => { - delete window.BDFDB_Global.downloadModal; - require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (e, r, b) => { - if (!e && b && b.indexOf(`* @name BDFDB`) > -1) require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), b, _ => {}); - else BdApi.alert("Error", "Could not download BDFDB library plugin, try again some time later."); - }); - } - }); - } - if (!window.BDFDB_Global.pluginQueue.includes(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name); - } - start() {this.load();} - stop() {} - } : (([Plugin, BDFDB]) => { - var changedGuilds = {}, settings = {}; - - return class EditServers extends Plugin { - onLoad() { - this.defaults = { - settings: { - addOriginalTooltip: {value:true, inner:false, description:"Hovering over a changed Server Header shows the original Name as Tooltip"}, - changeInGuildList: {value:true, inner:true, description:"Server List"}, - changeInGuildHeader: {value:true, inner:true, description:"Server Header"}, - changeInGuildInvites: {value:true, inner:true, description:"Server Invites"}, - changeInChat: {value:true, inner:true, description:"Chat (Welcome Message, etc.)"}, - changeInMutualGuilds: {value:true, inner:true, description:"Mutual Servers"}, - changeInRecentMentions: {value:true, inner:true, description:"Recent Mentions Popout"}, - changeInQuickSwitcher: {value:true, inner:true, description:"Quick Switcher"} - } - }; - - this.patchedModules = { - before: { - Guild: "render", - GuildIconWrapper: "render", - MutualGuilds: "render", - QuickSwitcher: "render", - QuickSwitchChannelResult: "render", - GuildSidebar: "render", - GuildHeader: "render", - InviteGuildName: "GuildName" - }, - after: { - RecentsChannelHeader: "default", - Guild: "render", - BlobMask: "render", - GuildIconWrapper: "render", - GuildIcon: "render", - GuildHeader: "render", - WelcomeArea: "default" - } - }; - - this.patchPriority = 7; - } - - onStart() { - BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.IconUtils, "getGuildBannerURL", {instead:e => { - let guild = BDFDB.LibraryModules.GuildStore.getGuild(e.methodArguments[0].id); - if (guild) { - if (e.methodArguments[0].id == "410787888507256842") return guild.banner; - let data = changedGuilds[guild.id]; - if (data && data.banner && !data.removeBanner) return data.banner; - } - return e.callOriginalMethod(); - }}); - - BDFDB.PatchUtils.patch(this, BDFDB.LibraryComponents.GuildComponents.Guild.prototype, "render", { - before: e => {this.processGuild({instance:e.thisObject, returnvalue:e.returnValue, methodname:"render"});}, - after: e => {this.processGuild({instance:e.thisObject, returnvalue:e.returnValue, methodname:"render"});} - }); - - BDFDB.PatchUtils.patch(this, BDFDB.LibraryComponents.Connectors.Link.prototype, "render", { - after: e => { - if (e.thisObject.props.className && e.thisObject.props.className.indexOf(BDFDB.disCN.guildiconwrapper) > -1) this.processGuildAcronym({instance:e.thisObject, returnvalue:e.returnValue, methodname:"render"}); - } - }); - - this.forceUpdateAll(); - } - - onStop() { - this.forceUpdateAll(); - } - - getSettingsPanel (collapseStates = {}) { - let settingsPanel, settingsItems = [], innerItems = []; - - for (let key in settings) if (!this.defaults.settings[key].inner) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { - type: "Switch", - plugin: this, - keys: ["settings", key], - label: this.defaults.settings[key].description, - value: settings[key] - })); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsPanelInner, { - title: "Change Servers in:", - first: settingsItems.length == 0, - children: Object.keys(settings).map(key => this.defaults.settings[key].inner && BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { - type: "Switch", - plugin: this, - keys: ["settings", key], - label: this.defaults.settings[key].description, - value: settings[key] - })) - })); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { - type: "Button", - color: BDFDB.LibraryComponents.Button.Colors.RED, - label: "Reset all Servers", - onClick: _ => { - BDFDB.ModalUtils.confirm(this, "Are you sure you want to reset all Servers?", _ => { - BDFDB.DataUtils.remove(this, "servers"); - this.forceUpdateAll();; - }); - }, - children: BDFDB.LanguageUtils.LanguageStrings.RESET - })); - - return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, settingsItems); - } - - onSettingsClosed () { - if (this.SettingsUpdated) { - delete this.SettingsUpdated; - this.forceUpdateAll(); - } - } - - forceUpdateAll () { - changedGuilds = BDFDB.DataUtils.load(this, "servers"); - settings = BDFDB.DataUtils.get(this, "settings"); - - BDFDB.PatchUtils.forceAllUpdates(this); - } - - onGuildContextMenu (e) { - if (e.instance.props.guild) { - let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "devmode-copy-id", group: true}); - children.splice(index > -1 ? index : children.length, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { - children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.context_localserversettings_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "settings-submenu"), - children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { - children: [ - BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.submenu_serversettings_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "settings-change"), - action: _ => { - this.openGuildSettingsModal(e.instance.props.guild.id); - } - }), - BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.submenu_resetsettings_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "settings-reset"), - disabled: !changedGuilds[e.instance.props.guild.id], - action: _ => { - BDFDB.DataUtils.remove(this, "servers", e.instance.props.guild.id); - this.forceUpdateAll(); - } - }) - ] - }) - }) - })); - } - } - - processGuild (e) { - if (BDFDB.GuildUtils.is(e.instance.props.guild) && e.instance.props.guild.joinedAt && settings.changeInGuildList) { - e.instance.props.guild = this.getGuildData(e.instance.props.guild.id); - if (e.returnvalue) { - let data = changedGuilds[e.instance.props.guild.id]; - if (data && (data.color3 || data.color4)) { - let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: ["GuildTooltip", "BDFDB_TooltipContainer"]}); - if (index > -1) children[index] = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - tooltipConfig: { - type: "right", - guild: e.instance.props.guild, - list: true, - offset: 12, - backgroundColor: data.color3, - fontColor: data.color4 - }, - children: children[index].props.children - }); - } - } - } - } - - processBlobMask (e) { - if (settings.changeInGuildList) { - let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: "NavItem"}); - if (index > -1 && children[index].props.to && children[index].props.to.pathname) { - let guild = BDFDB.LibraryModules.GuildStore.getGuild((children[index].props.to.pathname.split("/channels/")[1] || "").split("/")[0]); - if (guild) { - let data = changedGuilds[guild.id]; - if (data) { - if (data.shortName) children[index].props.name = data.shortName.split("").join(" "); - else if (data.name && data.ignoreCustomName) children[index].props.name = guild.name; - } - } - } - } - } - - processGuildAcronym (e) { - if (typeof e.returnvalue.props.children == "function" && settings.changeInGuildList) { - let pathname = BDFDB.ObjectUtils.get(e.instance, "props.to.pathname"); - let data = pathname && changedGuilds[(pathname.split("/channels/")[1] || "").split("/")[0]]; - if (data) { - let renderChildren = e.returnvalue.props.children; - e.returnvalue.props.children = (...args) => { - let renderedChildren = renderChildren(...args); - let guildAcronym = BDFDB.ReactUtils.findChild(renderedChildren, {props:[["className", BDFDB.disCN.guildiconacronym]]}); - if (guildAcronym) { - let fontGradient = BDFDB.ObjectUtils.is(data.color2); - guildAcronym.props.style = Object.assign({}, guildAcronym.props.style, { - background: BDFDB.ObjectUtils.is(data.color1) ? BDFDB.ColorUtils.createGradient(data.color1) : BDFDB.ColorUtils.convert(data.color1, "RGBA"), - color: !fontGradient && BDFDB.ColorUtils.convert(data.color2, "RGBA") - }); - if (fontGradient) guildAcronym.props.children = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextGradientElement, { - gradient: BDFDB.ColorUtils.createGradient(data.color2), - children: guildAcronym.props.children - }); - } - return renderedChildren; - }; - } - } - } - - processGuildIconWrapper (e) { - if (BDFDB.GuildUtils.is(e.instance.props.guild) && e.instance.props.guild.joinedAt) { - if (e.instance.props.className && e.instance.props.className.indexOf(BDFDB.disCN.guildfolderguildicon) > -1) e.instance.props.guild = this.getGuildData(e.instance.props.guild.id, settings.changeInGuildList); - else if (e.instance.props.className && e.instance.props.className.indexOf(BDFDB.disCN.listavatar) > -1) e.instance.props.guild = this.getGuildData(e.instance.props.guild.id, settings.changeInMutualGuilds); - else e.instance.props.guild = this.getGuildData(e.instance.props.guild.id); - } - } - - processGuildIcon (e) { - if (BDFDB.GuildUtils.is(e.instance.props.guild) && e.instance.props.guild.joinedAt && e.instance.props.style && (!e.instance.props.style.backgroundImage || e.instance.props.style.backgroundImage == "none")) { - let data = changedGuilds[e.instance.props.guild.id]; - if (data) { - if (e.instance.props.className && e.instance.props.className.indexOf(BDFDB.disCN.guildfolderguildicon) > -1) this.changeGuildIcon(e, data, settings.changeInGuildList); - else if (e.instance.props.className && e.instance.props.className.indexOf(BDFDB.disCN.listavatar) > -1 || BDFDB.ReactUtils.findConstructor(e.instance, "MutualGuild", {up: true})) this.changeGuildIcon(e, data, settings.changeInMutualGuilds); - else this.changeGuildIcon(e, data); - } - } - } - - processMutualGuilds (e) { - if (settings.changeInMutualGuilds) for (let i in e.instance.props.mutualGuilds) e.instance.props.mutualGuilds[i].guild = this.getGuildData(e.instance.props.mutualGuilds[i].guild.id); - } - - processQuickSwitcher (e) { - if (settings.changeInQuickSwitcher) for (let i in e.instance.props.results) if (e.instance.props.results[i].type == "GUILD") e.instance.props.results[i].record = this.getGuildData(e.instance.props.results[i].record.id); - } - - processQuickSwitchChannelResult (e) { - if (e.instance.props.channel && e.instance.props.channel.guild_id && settings.changeInQuickSwitcher) { - e.instance.props.children.props.children = this.getGuildData(e.instance.props.channel.guild_id).name; - } - } - - processRecentsChannelHeader (e) { - if (settings.changeInRecentMentions && BDFDB.ArrayUtils.is(e.returnvalue.props.children)) { - for (let child of e.returnvalue.props.children) if (child && child.props && child.props.channel && child.type.displayName == "ChannelName") { - let oldType = child.type; - child.type = (...args) => { - let instance = oldType(...args); - let guildName = BDFDB.ReactUtils.findChild(instance, {props:[["className", BDFDB.disCN.recentmentionsguildname]]}); - if (guildName) guildName.props.children = (this.getGuildData(e.instance.props.channel.guild_id) || {}).name || guildName.props.children; - return instance; - }; - child.type.displayName = oldType.displayName; - } - } - } - - processGuildSidebar (e) { - if (e.instance.props.guild) { - let data = changedGuilds[e.instance.props.guild.id]; - if (data) { - if (data.removeBanner) e.instance.props.guild = new BDFDB.DiscordObjects.Guild(Object.assign({}, e.instance.props.guild, {banner: null})); - else if (data.banner) e.instance.props.guild = new BDFDB.DiscordObjects.Guild(Object.assign({}, e.instance.props.guild, {banner: data.banner})); - } - } - } - - processGuildHeader (e) { - if (e.instance.props.guild && settings.changeInGuildHeader) { - e.instance.props.guild = this.getGuildData(e.instance.props.guild.id); - let oldName = (BDFDB.LibraryModules.GuildStore.getGuild(e.instance.props.guild.id) || {}).name; - if (e.returnvalue && settings.addOriginalTooltip && oldName != e.instance.props.guild.name) { - e.returnvalue.props.children[0] = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - text: oldName, - children: e.returnvalue.props.children[0], - tooltipConfig: {type: "right"} - }); - } - } - } - - processInviteGuildName (e) { - if (e.instance.props.guild && e.instance.props.guild.joinedAt && settings.changeInGuildInvites) { - e.instance.props.guild = this.getGuildData(e.instance.props.guild.id); - } - } - - processWelcomeArea (e) { - if (e.instance.props.channel && settings.changeInChat) { - let name = (BDFDB.LibraryModules.GuildStore.getGuild(e.instance.props.channel.guild_id) || {}).name; - let guildName = name && BDFDB.ReactUtils.findChild(e.returnvalue, {props:[["className", "titleName-3-Lp3Z"]]}); - if (guildName && guildName.props && BDFDB.ArrayUtils.is(guildName.props.children)) { - for (let child of guildName.props.children) if (child && child.props && BDFDB.ArrayUtils.is(child.props.children) && child.props.children[0] == name) { - child.props.children = [(this.getGuildData(e.instance.props.channel.guild_id) || {}).name || name]; - break; - } - } - } - } - - getGuildData (guildId, change = true) { - let guild = BDFDB.LibraryModules.GuildStore.getGuild(guildId); - if (!guild) return new BDFDB.DiscordObjects.Guild({}); - let data = change && changedGuilds[guild.id]; - if (data) { - let newGuildObject = {}, nativeObject = new BDFDB.DiscordObjects.Guild(guild); - for (let key in nativeObject) newGuildObject[key] = nativeObject[key]; - newGuildObject.name = data.name || nativeObject.name; - newGuildObject.acronym = data.shortName && data.shortName.replace(/\s/g, "") || BDFDB.LibraryModules.StringUtils.getAcronym(!data.ignoreCustomName && data.name || nativeObject.name); - if (data.removeIcon) { - newGuildObject.icon = null; - newGuildObject.getIconURL = _ => {return null;}; - } - else if (data.url) { - newGuildObject.icon = data.url; - newGuildObject.getIconURL = _ => {return data.url;}; - } - if (data.removeBanner) newGuildObject.banner = null; - else if (data.banner) newGuildObject.banner = data.banner; - return newGuildObject; - } - return new BDFDB.DiscordObjects.Guild(guild); - } - - changeGuildIcon (e, data, change = true) { - if (change) { - let fontGradient = BDFDB.ObjectUtils.is(data.color2); - e.returnvalue.props.style = Object.assign({}, e.returnvalue.props.style, { - background: BDFDB.ObjectUtils.is(data.color1) ? BDFDB.ColorUtils.createGradient(data.color1) : BDFDB.ColorUtils.convert(data.color1, "RGBA"), - color: !fontGradient && BDFDB.ColorUtils.convert(data.color2, "RGBA") - }); - if (fontGradient) e.returnvalue.props.children[0] = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextGradientElement, { - gradient: BDFDB.ColorUtils.createGradient(data.color2), - children: e.returnvalue.props.children[0] - }); - } - } - - openGuildSettingsModal (guildId) { - let guild = BDFDB.LibraryModules.GuildStore.getGuild(guildId); - if (!guild) return; - let data = changedGuilds[guild.id] || {}; - - let currentIgnoreCustomNameState = data.ignoreCustomName; - - BDFDB.ModalUtils.open(this, { - size: "MEDIUM", - header: this.labels.modal_header_text, - subheader: guild.name, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, { - tab: this.labels.modal_tabheader1_text, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: this.labels.modal_guildname_text, - className: BDFDB.disCN.marginbottom20, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - className: "input-guildname", - key: "GUILDNAME", - value: data.name, - placeholder: guild.name, - autoFocus: true, - onChange: (value, instance) => { - if (!currentIgnoreCustomNameState) { - let acronymInputIns = BDFDB.ReactUtils.findOwner(instance._reactInternalFiber.return.return.return, {key: "GUILDACRONYM"}); - if (acronymInputIns) { - acronymInputIns.props.placeholder = value && BDFDB.LibraryModules.StringUtils.getAcronym(value) || guild.acronym; - BDFDB.ReactUtils.forceUpdate(acronymInputIns); - } - } - } - }) - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: this.labels.modal_guildacronym_text, - className: BDFDB.disCN.marginbottom8, - children: - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - className: "input-guildacronym", - key: "GUILDACRONYM", - value: data.shortName, - placeholder: !data.ignoreCustomName && data.name && BDFDB.LibraryModules.StringUtils.getAcronym(data.name) || guild.acronym - }) - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { - type: "Switch", - className: BDFDB.disCN.marginbottom20 + " input-ignorecustomname", - label: this.labels.modal_ignorecustomname_text, - tag: BDFDB.LibraryComponents.FormComponents.FormTitle.Tags.H5, - value: data.ignoreCustomName, - onChange: (value, instance) => { - currentIgnoreCustomNameState = value; - let nameInputIns = BDFDB.ReactUtils.findOwner(instance._reactInternalFiber.return, {key: "GUILDNAME"}); - let acronymInputIns = BDFDB.ReactUtils.findOwner(instance._reactInternalFiber.return, {key: "GUILDACRONYM"}); - if (nameInputIns && acronymInputIns) { - acronymInputIns.props.placeholder = !value && nameInputIns.props.value && BDFDB.LibraryModules.StringUtils.getAcronym(nameInputIns.props.value) || guild.acronym; - BDFDB.ReactUtils.forceUpdate(acronymInputIns); - } - } - }), - BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCN.marginbottom20, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { - className: BDFDB.disCN.marginbottom8, - align: BDFDB.LibraryComponents.Flex.Align.CENTER, - direction: BDFDB.LibraryComponents.Flex.Direction.HORIZONTAL, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormTitle, { - className: BDFDB.disCN.marginreset, - tag: BDFDB.LibraryComponents.FormComponents.FormTitle.Tags.H5, - children: this.labels.modal_guildicon_text - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { - className: "input-removeicon", - type: "Switch", - margin: 0, - grow: 0, - label: BDFDB.LanguageUtils.LanguageStrings.REMOVE, - tag: BDFDB.LibraryComponents.FormComponents.FormTitle.Tags.H5, - value: data.removeIcon, - onChange: (value, instance) => { - let iconInputIins = BDFDB.ReactUtils.findOwner(instance._reactInternalFiber.return.return, {key: "GUILDICON"}); - if (iconInputIins) { - delete iconInputIins.props.success; - delete iconInputIins.props.errorMessage; - iconInputIins.props.disabled = value; - BDFDB.ReactUtils.forceUpdate(iconInputIins); - } - } - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - className: "input-guildicon", - key: "GUILDICON", - success: !data.removeIcon && data.url, - maxLength: 100000000000000000000, - value: data.url, - placeholder: BDFDB.GuildUtils.getIcon(guild.id), - disabled: data.removeIcon, - onChange: (value, instance) => { - this.checkUrl(value, instance); - } - }) - ] - }), - BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCN.marginbottom20, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { - className: BDFDB.disCN.marginbottom8, - align: BDFDB.LibraryComponents.Flex.Align.CENTER, - direction: BDFDB.LibraryComponents.Flex.Direction.HORIZONTAL, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormTitle, { - className: BDFDB.disCN.marginreset, - tag: BDFDB.LibraryComponents.FormComponents.FormTitle.Tags.H5, - children: this.labels.modal_guildbanner_text - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { - className: "input-removebanner", - type: "Switch", - margin: 0, - grow: 0, - label: BDFDB.LanguageUtils.LanguageStrings.REMOVE, - tag: BDFDB.LibraryComponents.FormComponents.FormTitle.Tags.H5, - value: data.removeBanner && guild.id != "410787888507256842", - disabled: guild.id == "410787888507256842", - onChange: (value, instance) => { - let bannerInputIns = BDFDB.ReactUtils.findOwner(instance._reactInternalFiber.return.return, {key: "GUILDBANNER"}); - if (bannerInputIns) { - delete bannerInputIns.props.success; - delete bannerInputIns.props.errorMessage; - bannerInputIns.props.disabled = value; - BDFDB.ReactUtils.forceUpdate(bannerInputIns); - } - } - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - className: "input-guildbanner", - key: "GUILDBANNER", - success: !data.removeBanner && data.banner, - maxLength: 100000000000000000000, - value: data.banner, - placeholder: BDFDB.GuildUtils.getBanner(guild.id), - disabled: data.removeBanner || guild.id == "410787888507256842", - onChange: (value, instance) => { - this.checkUrl(value, instance); - } - }) - ] - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, { - tab: this.labels.modal_tabheader2_text, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: this.labels.modal_colorpicker1_text, - className: BDFDB.disCN.marginbottom20, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { - color: data.color1, - number: 1 - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: this.labels.modal_colorpicker2_text, - className: BDFDB.disCN.marginbottom20, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { - color: data.color2, - number: 2 - }) - ] - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, { - tab: this.labels.modal_tabheader3_text, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: this.labels.modal_colorpicker3_text, - className: BDFDB.disCN.marginbottom20, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { - color: data.color3, - number: 3 - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: this.labels.modal_colorpicker4_text, - className: BDFDB.disCN.marginbottom20, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { - color: data.color4, - number: 4 - }) - ] - }) - ] - }) - ], - buttons: [{ - contents: BDFDB.LanguageUtils.LanguageStrings.SAVE, - color: "BRAND", - close: true, - click: modal => { - let oldData = Object.assign({}, data); - - let guildnameinput = modal.querySelector(".input-guildname " + BDFDB.dotCN.input); - let guildacronyminput = modal.querySelector(".input-guildacronym " + BDFDB.dotCN.input); - let ignorecustomnameinput = modal.querySelector(".input-ignorecustomname " + BDFDB.dotCN.switchinner); - let guildiconinput = modal.querySelector(".input-guildicon " + BDFDB.dotCN.input); - let removeiconinput = modal.querySelector(".input-removeicon " + BDFDB.dotCN.switchinner); - let guildbannerinput = modal.querySelector(".input-guildbanner " + BDFDB.dotCN.input); - let removebannerinput = modal.querySelector(".input-removebanner " + BDFDB.dotCN.switchinner); - - data.name = guildnameinput.value.trim() || null; - data.shortName = guildacronyminput.value.trim() || null; - data.ignoreCustomName = ignorecustomnameinput.checked; - data.url = (!data.removeIcon && BDFDB.DOMUtils.containsClass(guildiconinput, BDFDB.disCN.inputsuccess) ? guildiconinput.value.trim() : null) || null; - data.removeIcon = removeiconinput.checked; - data.banner = (!data.removeBanner && BDFDB.DOMUtils.containsClass(guildbannerinput, BDFDB.disCN.inputsuccess) ? guildbannerinput.value.trim() : null) || null; - data.removeBanner = removebannerinput.checked && guild.id != "410787888507256842"; - - data.color1 = BDFDB.ColorUtils.getSwatchColor(modal, 1); - data.color2 = BDFDB.ColorUtils.getSwatchColor(modal, 2); - data.color3 = BDFDB.ColorUtils.getSwatchColor(modal, 3); - data.color4 = BDFDB.ColorUtils.getSwatchColor(modal, 4); - - let changed = false; - if (Object.keys(data).every(key => !data[key]) && (changed = true)) BDFDB.DataUtils.remove(this, "servers", guild.id); - else if (!BDFDB.equals(oldData, data) && (changed = true)) BDFDB.DataUtils.save(data, this, "servers", guild.id); - if (changed) this.forceUpdateAll();; - } - }] - }); - } - - checkUrl (url, instance) { - BDFDB.TimeUtils.clear(instance.checkTimeout); - if (url == null || !url.trim()) { - delete instance.props.success; - delete instance.props.errorMessage; - instance.forceUpdate(); - } - else instance.checkTimeout = BDFDB.TimeUtils.timeout(_ => { - BDFDB.LibraryRequires.request(url.trim(), (error, response, result) => { - if (response && response.headers["content-type"] && response.headers["content-type"].indexOf("image") != -1) { - instance.props.success = true; - delete instance.props.errorMessage; - } - else { - delete instance.props.success; - instance.props.errorMessage = this.labels.modal_invalidurl_text; - } - delete instance.checkTimeout; - instance.forceUpdate(); - }); - }, 1000); - } - - setBanner (id, data) { - data = data || {}; - let guild = BDFDB.LibraryModules.GuildStore.getGuild(id); - if (!guild) return; - if (guild.EditServersCachedBanner === undefined) guild.EditServersCachedBanner = guild.banner; - guild.banner = data.removeBanner ? null : (data.banner || guild.EditServersCachedBanner); - } - - setLabelsByLanguage () { - switch (BDFDB.LanguageUtils.getLanguage().id) { - case "hr": //croatian - return { - context_localserversettings_text: "Lokalne postavke poslužitelja", - submenu_serversettings_text: "Promijeni postavke", - submenu_resetsettings_text: "Ponovno postavite poslužitelj", - modal_header_text: "Lokalne postavke poslužitelja", - modal_guildname_text: "Naziv lokalnog poslužitelja", - modal_guildacronym_text: "Akronim lokalnog poslužitelja", - modal_ignorecustomname_text: "Koristite izvorno ime poslužitelja za akronim poslužitelja", - modal_guildicon_text: "Ikona", - modal_guildbanner_text: "Baner", - modal_tabheader1_text: "Poslužitelja", - modal_tabheader2_text: "Boja ikona", - modal_tabheader3_text: "Boja tooltip", - modal_colorpicker1_text: "Boja ikona", - modal_colorpicker2_text: "Boja fonta", - modal_colorpicker3_text: "Boja tooltip", - modal_colorpicker4_text: "Boja fonta", - modal_invalidurl_text: "Nevažeći URL" - }; - case "da": //danish - return { - context_localserversettings_text: "Lokal serverindstillinger", - submenu_serversettings_text: "Skift indstillinger", - submenu_resetsettings_text: "Nulstil server", - modal_header_text: "Lokal serverindstillinger", - modal_guildname_text: "Lokalt servernavn", - modal_guildacronym_text: "Lokalt serverakronym", - modal_ignorecustomname_text: "Brug det originale servernavn til serverens akronym", - modal_guildicon_text: "Ikon", - modal_guildbanner_text: "Banner", - modal_tabheader1_text: "Server", - modal_tabheader2_text: "Ikonfarve", - modal_tabheader3_text: "Tooltipfarve", - modal_colorpicker1_text: "Ikonfarve", - modal_colorpicker2_text: "Skriftfarve", - modal_colorpicker3_text: "Tooltipfarve", - modal_colorpicker4_text: "Skriftfarve", - modal_invalidurl_text: "Ugyldig URL" - }; - case "de": //german - return { - context_localserversettings_text: "Lokale Servereinstellungen", - submenu_serversettings_text: "Einstellungen ändern", - submenu_resetsettings_text: "Server zurücksetzen", - modal_header_text: "Lokale Servereinstellungen", - modal_guildname_text: "Lokaler Servername", - modal_guildacronym_text: "Lokales Serverkürzel", - modal_ignorecustomname_text: "Benutze den ursprünglichen Servernamen für das Serverkürzel", - modal_guildicon_text: "Icon", - modal_guildbanner_text: "Banner", - modal_tabheader1_text: "Server", - modal_tabheader2_text: "Iconfarbe", - modal_tabheader3_text: "Tooltipfarbe", - modal_colorpicker1_text: "Iconfarbe", - modal_colorpicker2_text: "Schriftfarbe", - modal_colorpicker3_text: "Tooltipfarbe", - modal_colorpicker4_text: "Schriftfarbe", - modal_invalidurl_text: "Ungültige URL" - }; - case "es": //spanish - return { - context_localserversettings_text: "Ajustes local de servidor", - submenu_serversettings_text: "Cambiar ajustes", - submenu_resetsettings_text: "Restablecer servidor", - modal_header_text: "Ajustes local de servidor", - modal_guildname_text: "Nombre local del servidor", - modal_guildacronym_text: "Acrónimo local del servidor", - modal_ignorecustomname_text: "Use el nombre del servidor original para el acrónimo del servidor", - modal_guildicon_text: "Icono", - modal_guildbanner_text: "Bandera", - modal_tabheader1_text: "Servidor", - modal_tabheader2_text: "Color del icono", - modal_tabheader3_text: "Color de tooltip", - modal_colorpicker1_text: "Color del icono", - modal_colorpicker2_text: "Color de fuente", - modal_colorpicker3_text: "Color de tooltip", - modal_colorpicker4_text: "Color de fuente", - modal_invalidurl_text: "URL inválida" - }; - case "fr": //french - return { - context_localserversettings_text: "Paramètres locale du serveur", - submenu_serversettings_text: "Modifier les paramètres", - submenu_resetsettings_text: "Réinitialiser le serveur", - modal_header_text: "Paramètres locale du serveur", - modal_guildname_text: "Nom local du serveur", - modal_guildacronym_text: "Acronyme local de serveur", - modal_ignorecustomname_text: "Utilisez le nom de serveur d'origine pour l'acronyme de serveur", - modal_guildicon_text: "Icône", - modal_guildbanner_text: "Bannière", - modal_tabheader1_text: "Serveur", - modal_tabheader2_text: "Couleur de l'icône", - modal_tabheader3_text: "Couleur de tooltip", - modal_colorpicker1_text: "Couleur de l'icône", - modal_colorpicker2_text: "Couleur de la police", - modal_colorpicker3_text: "Couleur de tooltip", - modal_colorpicker4_text: "Couleur de la police", - modal_invalidurl_text: "URL invalide" - }; - case "it": //italian - return { - context_localserversettings_text: "Impostazioni locale server", - submenu_serversettings_text: "Cambia impostazioni", - submenu_resetsettings_text: "Ripristina server", - modal_header_text: "Impostazioni locale server", - modal_guildname_text: "Nome locale server", - modal_guildacronym_text: "Acronimo locale server", - modal_ignorecustomname_text: "Utilizzare il nome del server originale per l'acronimo del server", - modal_guildicon_text: "Icona", - modal_guildbanner_text: "Bandiera", - modal_tabheader1_text: "Server", - modal_tabheader2_text: "Colore dell'icona", - modal_tabheader3_text: "Colore della tooltip", - modal_colorpicker1_text: "Colore dell'icona", - modal_colorpicker2_text: "Colore del carattere", - modal_colorpicker3_text: "Colore della tooltip", - modal_colorpicker4_text: "Colore del carattere", - modal_invalidurl_text: "URL non valido" - }; - case "nl": //dutch - return { - context_localserversettings_text: "Lokale serverinstellingen", - submenu_serversettings_text: "Verandere instellingen", - submenu_resetsettings_text: "Reset server", - modal_header_text: "Lokale serverinstellingen", - modal_guildname_text: "Lokale servernaam", - modal_guildacronym_text: "Lokale server acroniem", - modal_ignorecustomname_text: "Gebruik de oorspronkelijke servernaam voor het serveracrononiem", - modal_guildicon_text: "Icoon", - modal_guildbanner_text: "Banier", - modal_tabheader1_text: "Server", - modal_tabheader2_text: "Icoonkleur", - modal_tabheader3_text: "Tooltipkleur", - modal_colorpicker1_text: "Icoonkleur", - modal_colorpicker2_text: "Doopvontkleur", - modal_colorpicker3_text: "Tooltipkleur", - modal_colorpicker4_text: "Doopvontkleur", - modal_invalidurl_text: "Ongeldige URL" - }; - case "no": //norwegian - return { - context_localserversettings_text: "Lokal serverinnstillinger", - submenu_serversettings_text: "Endre innstillinger", - submenu_resetsettings_text: "Tilbakestill server", - modal_header_text: "Lokal serverinnstillinger", - modal_guildname_text: "Lokalt servernavn", - modal_guildacronym_text: "Lokalt serverforkortelse", - modal_ignorecustomname_text: "Bruk det originale servernavnet til serverforkortelsen", - modal_guildicon_text: "Ikon", - modal_guildbanner_text: "Banner", - modal_tabheader1_text: "Server", - modal_tabheader2_text: "Ikonfarge", - modal_tabheader3_text: "Tooltipfarge", - modal_colorpicker1_text: "Ikonfarge", - modal_colorpicker2_text: "Skriftfarge", - modal_colorpicker3_text: "Tooltipfarge", - modal_colorpicker4_text: "Skriftfarge", - modal_invalidurl_text: "Ugyldig URL" - }; - case "pl": //polish - return { - context_localserversettings_text: "Lokalne ustawienia serwera", - submenu_serversettings_text: "Zmień ustawienia", - submenu_resetsettings_text: "Resetuj ustawienia", - modal_header_text: "Lokalne ustawienia serwera", - modal_guildname_text: "Lokalna nazwa serwera", - modal_guildacronym_text: "Akronim lokalnego serwera", - modal_ignorecustomname_text: "Użyj oryginalnej nazwy serwera dla akronimu serwera", - modal_guildicon_text: "Ikona", - modal_guildbanner_text: "Baner", - modal_tabheader1_text: "Serwer", - modal_tabheader2_text: "Kolor ikony", - modal_tabheader3_text: "Kolor podpowiedzi", - modal_colorpicker1_text: "Kolor ikony", - modal_colorpicker2_text: "Kolor czcionki", - modal_colorpicker3_text: "Kolor podpowiedzi", - modal_colorpicker4_text: "Kolor czcionki", - modal_invalidurl_text: "Nieprawidłowe URL" - }; - case "pt-BR": //portuguese (brazil) - return { - context_localserversettings_text: "Configurações local do servidor", - submenu_serversettings_text: "Mudar configurações", - submenu_resetsettings_text: "Redefinir servidor", - modal_header_text: "Configurações local do servidor", - modal_guildname_text: "Nome local do servidor", - modal_guildacronym_text: "Acrônimo local de servidor", - modal_ignorecustomname_text: "Use o nome do servidor original para a sigla do servidor", - modal_guildicon_text: "Icone", - modal_guildbanner_text: "Bandeira", - modal_tabheader1_text: "Servidor", - modal_tabheader2_text: "Cor do ícone", - modal_tabheader3_text: "Cor da tooltip", - modal_colorpicker1_text: "Cor do ícone", - modal_colorpicker2_text: "Cor da fonte", - modal_colorpicker3_text: "Cor da tooltip", - modal_colorpicker4_text: "Cor da fonte", - modal_invalidurl_text: "URL inválida" - }; - case "fi": //finnish - return { - context_localserversettings_text: "Paikallinen palvelimen asetukset", - submenu_serversettings_text: "Vaihda asetuksia", - submenu_resetsettings_text: "Nollaa palvelimen", - modal_header_text: "Paikallinen palvelimen asetukset", - modal_guildname_text: "Paikallinen palvelimenimi", - modal_guildacronym_text: "Paikallisen palvelimen lyhenne", - modal_ignorecustomname_text: "Käytä alkuperäistä palvelimen nimeä palvelimen lyhenteessä", - modal_guildicon_text: "Ikonin", - modal_guildbanner_text: "Banneri", - modal_tabheader1_text: "Palvelimen", - modal_tabheader2_text: "Ikoninväri", - modal_tabheader3_text: "Tooltipväri", - modal_colorpicker1_text: "Ikoninväri", - modal_colorpicker2_text: "Fontinväri", - modal_colorpicker3_text: "Tooltipväri", - modal_colorpicker4_text: "Fontinväri", - modal_invalidurl_text: "Virheellinen URL" - }; - case "sv": //swedish - return { - context_localserversettings_text: "Lokal serverinställningar", - submenu_serversettings_text: "Ändra inställningar", - submenu_resetsettings_text: "Återställ server", - modal_header_text: "Lokal serverinställningar", - modal_guildname_text: "Lokalt servernamn", - modal_guildacronym_text: "Lokal server förkortning", - modal_ignorecustomname_text: "Använd det ursprungliga servernamnet för serverförkortningen", - modal_guildicon_text: "Ikon", - modal_guildbanner_text: "Banderoll", - modal_tabheader1_text: "Server", - modal_tabheader2_text: "Ikonfärg", - modal_tabheader3_text: "Tooltipfärg", - modal_colorpicker1_text: "Ikonfärg", - modal_colorpicker2_text: "Fontfärg", - modal_colorpicker3_text: "Tooltipfärg", - modal_colorpicker4_text: "Fontfärg", - modal_invalidurl_text: "Ogiltig URL" - }; - case "tr": //turkish - return { - context_localserversettings_text: "Yerel Sunucu Ayarları", - submenu_serversettings_text: "Ayarları Değiştir", - submenu_resetsettings_text: "Sunucu Sıfırla", - modal_header_text: "Yerel sunucu ayarları", - modal_guildname_text: "Yerel sunucu adı", - modal_guildacronym_text: "Yerel sunucu kısaltması", - modal_ignorecustomname_text: "Sunucu kısaltması için orijinal sunucu adını kullanın", - modal_guildicon_text: "Simge", - modal_guildbanner_text: "Afişi", - modal_tabheader1_text: "Sunucu", - modal_tabheader2_text: "Simge rengi", - modal_tabheader3_text: "Tooltip rengi", - modal_colorpicker1_text: "Simge rengi", - modal_colorpicker2_text: "Yazı rengi", - modal_colorpicker3_text: "Tooltip rengi", - modal_colorpicker4_text: "Yazı rengi", - modal_invalidurl_text: "Geçersiz URL" - }; - case "cs": //czech - return { - context_localserversettings_text: "Místní nastavení serveru", - submenu_serversettings_text: "Změnit nastavení", - submenu_resetsettings_text: "Obnovit server", - modal_header_text: "Místní nastavení serveru", - modal_guildname_text: "Místní název serveru", - modal_guildacronym_text: "Zkratka místního serveru", - modal_ignorecustomname_text: "Pro zkratku serveru použijte původní název serveru", - modal_guildicon_text: "Ikony", - modal_guildbanner_text: "Prapor", - modal_tabheader1_text: "Server", - modal_tabheader2_text: "Barva ikony", - modal_tabheader3_text: "Barva tooltip", - modal_colorpicker1_text: "Barva ikony", - modal_colorpicker2_text: "Barva fontu", - modal_colorpicker3_text: "Barva tooltip", - modal_colorpicker4_text: "Barva fontu", - modal_invalidurl_text: "Neplatná URL" - }; - case "bg": //bulgarian - return { - context_localserversettings_text: "Настройки за локални cървър", - submenu_serversettings_text: "Промяна на настройките", - submenu_resetsettings_text: "Възстановяване на cървър", - modal_header_text: "Настройки за локални cървър", - modal_guildname_text: "Локално име на cървър", - modal_guildacronym_text: "Акроним на локалния сървър", - modal_ignorecustomname_text: "Използвайте оригиналното име на сървъра за съкращението на сървъра", - modal_guildicon_text: "Икона", - modal_guildbanner_text: "Знаме", - modal_tabheader1_text: "Cървър", - modal_tabheader2_text: "Цвят на иконата", - modal_tabheader3_text: "Цвят на подсказка", - modal_colorpicker1_text: "Цвят на иконата", - modal_colorpicker2_text: "Цвят на шрифта", - modal_colorpicker3_text: "Цвят на подсказка", - modal_colorpicker4_text: "Цвят на шрифта", - modal_invalidurl_text: "Невалиден URL" - }; - case "ru": //russian - return { - context_localserversettings_text: "Настройки локального cервер", - submenu_serversettings_text: "Изменить настройки", - submenu_resetsettings_text: "Сбросить cервер", - modal_header_text: "Настройки локального cервер", - modal_guildname_text: "Имя локального cервер", - modal_guildacronym_text: "Акроним локального сервера", - modal_ignorecustomname_text: "Используйте оригинальное имя сервера для сокращения сервера", - modal_guildicon_text: "Значок", - modal_guildbanner_text: "Баннер", - modal_tabheader1_text: "Cервер", - modal_tabheader2_text: "Цвет значков", - modal_tabheader3_text: "Цвет подсказка", - modal_colorpicker1_text: "Цвет значков", - modal_colorpicker2_text: "Цвет шрифта", - modal_colorpicker3_text: "Цвет подсказка", - modal_colorpicker4_text: "Цвет шрифта", - modal_invalidurl_text: "Неверная URL" - }; - case "uk": //ukrainian - return { - context_localserversettings_text: "Налаштування локального cервер", - submenu_serversettings_text: "Змінити налаштування", - submenu_resetsettings_text: "Скидання cервер", - modal_header_text: "Налаштування локального cервер", - modal_guildname_text: "Локальне ім'я cервер", - modal_guildacronym_text: "Акронім локального сервера", - modal_ignorecustomname_text: "Використовуйте оригінальне ім'я сервера для абревіатури сервера", - modal_guildicon_text: "Іконка", - modal_guildbanner_text: "Банер", - modal_tabheader1_text: "Cервер", - modal_tabheader2_text: "Колір ікони", - modal_tabheader3_text: "Колір підказка", - modal_colorpicker1_text: "Колір ікони", - modal_colorpicker2_text: "Колір шрифту", - modal_colorpicker3_text: "Колір підказка", - modal_colorpicker4_text: "Колір шрифту", - modal_invalidurl_text: "Недійсна URL" - }; - case "ja": //japanese - return { - context_localserversettings_text: "ローカルサーバー設定", - submenu_serversettings_text: "設定を変更する", - submenu_resetsettings_text: "サーバーをリセットする", - modal_header_text: "ローカルサーバー設定", - modal_guildname_text: "ローカルサーバー名", - modal_guildacronym_text: "ローカルサーバーの頭字語", - modal_ignorecustomname_text: "サーバーの頭字語に元のサーバー名を使用する", - modal_guildicon_text: "アイコン", - modal_guildbanner_text: "バナー", - modal_tabheader1_text: "サーバー", - modal_tabheader2_text: "アイコンの色", - modal_tabheader3_text: "ツールチップの色", - modal_colorpicker1_text: "アイコンの色", - modal_colorpicker2_text: "フォントの色", - modal_colorpicker3_text: "ツールチップの色", - modal_colorpicker4_text: "フォントの色", - modal_invalidurl_text: "無効な URL" - }; - case "zh-TW": //chinese (traditional) - return { - context_localserversettings_text: "本地服務器設置", - submenu_serversettings_text: "更改設置", - submenu_resetsettings_text: "重置服務器", - modal_header_text: "本地服務器設置", - modal_guildname_text: "服務器名稱", - modal_guildacronym_text: "本地服務器縮寫", - modal_ignorecustomname_text: "使用原始服務器名稱作為服務器首字母縮寫", - modal_guildicon_text: "圖標", - modal_guildbanner_text: "旗幟", - modal_tabheader1_text: "服務器", - modal_tabheader2_text: "圖標顏色", - modal_tabheader3_text: "工具提示顏色", - modal_colorpicker1_text: "圖標顏色", - modal_colorpicker2_text: "字體顏色", - modal_colorpicker3_text: "工具提示顏色", - modal_colorpicker4_text: "字體顏色", - modal_invalidurl_text: "無效的 URL" - }; - case "ko": //korean - return { - context_localserversettings_text: "로컬 서버 설정", - submenu_serversettings_text: "설정 변경", - submenu_resetsettings_text: "서버 재설정", - modal_header_text: "로컬 서버 설정", - modal_guildname_text: "로컬 서버 이름", - modal_guildacronym_text: "로컬 서버 약어", - modal_ignorecustomname_text: "서버 약어에 원래 서버 이름을 사용하십시오", - modal_guildicon_text: "상", - modal_guildbanner_text: "기치", - modal_tabheader1_text: "서버", - modal_tabheader2_text: "상 색깔", - modal_tabheader3_text: "툴팁 색깔", - modal_colorpicker1_text: "상 색깔", - modal_colorpicker2_text: "글꼴 색깔", - modal_colorpicker3_text: "툴팁 색깔", - modal_colorpicker4_text: "글꼴 색깔", - modal_invalidurl_text: "잘못된 URL" - }; - default: //default: english - return { - context_localserversettings_text: "Local Serversettings", - submenu_serversettings_text: "Change Settings", - submenu_resetsettings_text: "Reset Server", - modal_header_text: "Local Serversettings", - modal_guildname_text: "Local Servername", - modal_guildacronym_text: "Local Serveracronym", - modal_ignorecustomname_text: "Use the original Servername for the Serveracronym", - modal_guildicon_text: "Icon", - modal_guildbanner_text: "Banner", - modal_tabheader1_text: "Server", - modal_tabheader2_text: "Iconcolor", - modal_tabheader3_text: "Tooltipcolor", - modal_colorpicker1_text: "Iconcolor", - modal_colorpicker2_text: "Fontcolor", - modal_colorpicker3_text: "Tooltipcolor", - modal_colorpicker4_text: "Fontcolor", - modal_invalidurl_text: "Invalid URL" - }; - } - } - }; - })(window.BDFDB_Global.PluginUtils.buildPlugin(config)); -})();
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/NotificationSounds.config.json b/.config/BetterDiscord/plugins/NotificationSounds.config.json deleted file mode 100644 index 7cf7638..0000000 --- a/.config/BetterDiscord/plugins/NotificationSounds.config.json +++ /dev/null @@ -1,329 +0,0 @@ -{ - "audios": { - "---": { - "---": null - }, - "Default": { - "Communication Channel": "https://notificationsounds.com/soundfiles/63538fe6ef330c13a05a3ed7e599d5f7/file-sounds-917-communication-channel.wav", - "Isn't it": "https://notificationsounds.com/soundfiles/ba2fd310dcaa8781a9a652a31baf3c68/file-sounds-969-isnt-it.wav", - "Job Done": "https://notificationsounds.com/soundfiles/5b69b9cb83065d403869739ae7f0995e/file-sounds-937-job-done.wav", - "Served": "https://notificationsounds.com/soundfiles/b337e84de8752b27eda3a12363109e80/file-sounds-913-served.wav", - "Solemn": "https://notificationsounds.com/soundfiles/53fde96fcc4b4ce72d7739202324cd49/file-sounds-882-solemn.wav", - "System Fault": "https://notificationsounds.com/soundfiles/ebd9629fc3ae5e9f6611e2ee05a31cef/file-sounds-990-system-fault.wav", - "You wouldn't believe": "https://notificationsounds.com/soundfiles/087408522c31eeb1f982bc0eaf81d35f/file-sounds-949-you-wouldnt-believe.wav" - }, - "Discord": { - "HotKeys Window Down": "/assets/71f048f8aa7d4b24bf4268a87cbbb192.mp3", - "HotKeys Window Left": "/assets/1de04408e62b5d52ae3ebbb91e9e1978.mp3", - "HotKeys Window Right": "/assets/2c0433f93db8449e4a82b76dc520cb29.mp3", - "HotKeys Window Up": "/assets/68472713f7a62c7c37e0a6a5d5a1faeb.mp3", - "Human Man Voice": "/assets/a37dcd6272ae41cf49295d58c9806fe3.mp3", - "Incoming Call": "/assets/84a1b4e11d634dbfa1e5dd97a96de3ad.mp3", - "Incoming Call Beat": "/assets/b9411af07f154a6fef543e7e442e4da9.mp3", - "Mention Ping": "/assets/fa4d62c3cbc80733bf1f01b9c6f181de.mp3", - "Mention Ping 2": "/assets/a5f42064e8120e381528b14fd3188b72.mp3", - "Mention Ping 3": "/assets/84c9fa3d07da865278bd77c97d952db4.mp3", - "New Chatmessage": "/assets/dd920c06a01e5bb8b09678581e29d56f.mp3", - "New Chatmessage 2": "/assets/15fe810f6cfab609c7fcda61652b9b34.mp3", - "New Chatmessage 3": "/assets/53ce6a92d3c233e8b4ac529d34d374e4.mp3", - "Outgoing Call": "/assets/c6e92752668dde4eee5923d70441579f.mp3", - "Overlay Unlocked": "/assets/ad322ffe0a88436296158a80d5d11baa.mp3", - "Push2Talk Start": "/assets/8b63833c8d252fedba6b9c4f2517c705.mp3", - "Push2Talk Stop": "/assets/74ab980d6890a0fa6aa0336182f9f620.mp3", - "Robot Man Voice": "/assets/66598bea6e59eb8acdf32cf2d9d75ba9.mp3", - "Stream Ended": "/assets/4e30f98aa537854f79f49a76af822bbc.mp3", - "Stream Started": "/assets/9ca817f41727edc1b2f1bc4f1911107c.mp3", - "Stream User Joined": "/assets/5827bbf9a67c61cbb0e02ffbf434b654.mp3", - "Stream User Left": "/assets/7cdcdcbc426cc43583365a671c24b740.mp3", - "Unknown": "/assets/ae7d16bb2eea76b9b9977db0fad66658.mp3", - "Voicechat Deafen": "/assets/e4d539271704b87764dc465b1a061abd.mp3", - "Voicechat Disconnect": "/assets/7e125dc075ec6e5ae796e4c3ab83abb3.mp3", - "Voicechat Mute": "/assets/429d09ee3b86e81a75b5e06d3fb482be.mp3", - "Voicechat Reconnect": "/assets/471cfd0005b112ff857705e894bf41a6.mp3", - "Voicechat Undeafen": "/assets/5a000a0d4dff083d12a1d4fc2c7cbf66.mp3", - "Voicechat Unmute": "/assets/43805b9dd757ac4f6b9b58c1a8ee5f0d.mp3", - "Voicechat User Joined": "/assets/5dd43c946894005258d85770f0d10cff.mp3", - "Voicechat User Left": "/assets/4fcfeb2cba26459c4750e60f626cebdc.mp3", - "Voicechat User Moved": "/assets/e81d11590762728c1b811eadfa5be766.mp3" - }, - "Google": { - "Cyclist": "data:audio/mpeg;base64,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", - "Crosswalk": "data:audio/mpeg;base64,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", - "Bubble": "data:audio/mpeg;base64,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" - } - }, - "changeLog": { - "version": "3.5.1" - }, - "changelog": { - "currentversion": "3.4.9" - }, - "choices": { - "message1": { - "category": "Google", - "focus": null, - "mute": true, - "sound": "Cyclist", - "volume": 100 - }, - "dm": { - "category": "Discord", - "focus": true, - "mute": true, - "sound": "New Chatmessage 3", - "volume": 100 - }, - "mentioned": { - "category": "Google", - "focus": true, - "mute": true, - "sound": "Crosswalk", - "volume": 100 - }, - "role": { - "category": "Default", - "focus": true, - "mute": true, - "sound": "You wouldn't believe", - "volume": 100 - }, - "everyone": { - "category": "Google", - "focus": true, - "mute": true, - "sound": "Crosswalk", - "volume": 100 - }, - "here": { - "category": "Google", - "focus": true, - "mute": true, - "sound": "Crosswalk", - "volume": 100 - }, - "deafen": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "mute": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "disconnect": { - "category": "Discord", - "focus": null, - "mute": false, - "sound": "Push2Talk Stop", - "volume": 100 - }, - "undeafen": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "unmute": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "user_join": { - "category": "Discord", - "focus": null, - "mute": false, - "sound": "Push2Talk Start", - "volume": 100 - }, - "user_leave": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "user_moved": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "reconnect": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "ptt_start": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "ptt_stop": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "call_calling": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "call_ringing": { - "category": "Discord", - "focus": null, - "mute": true, - "sound": "Incoming Call Beat", - "volume": 54.5 - }, - "call_ringing_beat": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "stream_started": { - "category": "Discord", - "focus": null, - "mute": false, - "sound": "Unknown", - "volume": 100 - }, - "stream_ended": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "stream_user_joined": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "stream_user_left": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "ddr-down": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "ddr-left": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "ddr-right": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "ddr-up": { - "category": "---", - "focus": null, - "mute": false, - "sound": "---", - "volume": 100 - }, - "mention1": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "mention2": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "mention3": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "message2": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "message3": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "human_man": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "robot_man": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "discodo": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "overlayunlock": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - }, - "call_ringing_halloween": { - "category": "---", - "focus": null, - "mute": true, - "sound": "---", - "volume": 100 - } - } -}
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/NotificationSounds.plugin.js b/.config/BetterDiscord/plugins/NotificationSounds.plugin.js deleted file mode 100644 index f0fd1d0..0000000 --- a/.config/BetterDiscord/plugins/NotificationSounds.plugin.js +++ /dev/null @@ -1,684 +0,0 @@ -//META{"name":"NotificationSounds","authorId":"278543574059057154","invite":"Jx3TjNS","donate":"https://www.paypal.me/MircoWittrien","patreon":"https://www.patreon.com/MircoWittrien","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/NotificationSounds","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/NotificationSounds/NotificationSounds.plugin.js"}*// - -module.exports = (_ => { - const config = { - "info": { - "name": "NotificationSounds", - "author": "DevilBro", - "version": "3.5.1", - "description": "Allows you to replace the native sounds of Discord with your own." - }, - "changeLog": { - "added": { - "Halloween": "Added discord's halloween call sound to the choices" - } - } - }; - return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { - getName () {return config.info.name;} - getAuthor () {return config.info.author;} - getVersion () {return config.info.version;} - getDescription () {return config.info.description;} - - load() { - if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue:[]}); - if (!window.BDFDB_Global.downloadModal) { - window.BDFDB_Global.downloadModal = true; - BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click "Download Now" to install it.`, { - confirmText: "Download Now", - cancelText: "Cancel", - onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, - onConfirm: _ => { - delete window.BDFDB_Global.downloadModal; - require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (e, r, b) => { - if (!e && b && b.indexOf(`//META{"name":"`) > -1) require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), b, _ => {}); - else BdApi.alert("Error", "Could not download BDFDB library plugin, try again some time later."); - }); - } - }); - } - if (!window.BDFDB_Global.pluginQueue.includes(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name); - } - start() {this.load();} - stop() {} - } : (([Plugin, BDFDB]) => { - var audios, choices, firedEvents; - - const removeAllKey = "REMOVE_ALL_BDFDB_DEVILBRO_DO_NOT_COPY"; - const defaultDevice = "default"; - - var currentDevice = defaultDevice, createdAudios = {}, repatchIncoming; - - /* NEVER CHANGE THE SRC LINKS IN THE PLUGIN FILE, TO ADD NEW SOUNDS ADD THEM IN THE SETTINGS GUI IN THE PLUGINS PAGE */ - const types = { - "message1": {implemented:true, name:"New Chatmessage", src:"/assets/dd920c06a01e5bb8b09678581e29d56f.mp3", mute:true, focus:null, include:true}, - "dm": {implemented:true, name:"Direct Message", src:"/assets/84c9fa3d07da865278bd77c97d952db4.mp3", mute:true, focus:true, include:false}, - "mentioned": {implemented:true, name:"Mentioned", src:"/assets/a5f42064e8120e381528b14fd3188b72.mp3", mute:true, focus:true, include:false}, - "role": {implemented:true, name:"Mentioned (role)", src:"/assets/a5f42064e8120e381528b14fd3188b72.mp3", mute:true, focus:true, include:false}, - "everyone": {implemented:true, name:"Mentioned (@everyone)", src:"/assets/a5f42064e8120e381528b14fd3188b72.mp3", mute:true, focus:true, include:false}, - "here": {implemented:true, name:"Mentioned (@here)", src:"/assets/a5f42064e8120e381528b14fd3188b72.mp3", mute:true, focus:true, include:false}, - "deafen": {implemented:true, name:"Voicechat Deafen", src:"/assets/e4d539271704b87764dc465b1a061abd.mp3", mute:false, focus:null, include:true}, - "mute": {implemented:true, name:"Voicechat Mute", src:"/assets/429d09ee3b86e81a75b5e06d3fb482be.mp3", mute:false, focus:null, include:true}, - "disconnect": {implemented:true, name:"Voicechat Disconnect", src:"/assets/7e125dc075ec6e5ae796e4c3ab83abb3.mp3", mute:false, focus:null, include:true}, - "undeafen": {implemented:true, name:"Voicechat Undeafen", src:"/assets/5a000a0d4dff083d12a1d4fc2c7cbf66.mp3", mute:false, focus:null, include:true}, - "unmute": {implemented:true, name:"Voicechat Unmute", src:"/assets/43805b9dd757ac4f6b9b58c1a8ee5f0d.mp3", mute:false, focus:null, include:true}, - "user_join": {implemented:true, name:"Voicechat User Joined", src:"/assets/5dd43c946894005258d85770f0d10cff.mp3", mute:false, focus:null, include:true}, - "user_leave": {implemented:true, name:"Voicechat User Left", src:"/assets/4fcfeb2cba26459c4750e60f626cebdc.mp3", mute:false, focus:null, include:true}, - "user_moved": {implemented:true, name:"Voicechat User Moved", src:"/assets/e81d11590762728c1b811eadfa5be766.mp3", mute:false, focus:null, include:true}, - "reconnect": {implemented:false, name:"Voicechat Reconnect", src:"/assets/471cfd0005b112ff857705e894bf41a6.mp3", mute:true, focus:null, include:true}, - "ptt_start": {implemented:true, name:"Push2Talk Start", src:"/assets/8b63833c8d252fedba6b9c4f2517c705.mp3", mute:false, focus:null, include:true}, - "ptt_stop": {implemented:true, name:"Push2Talk Stop", src:"/assets/74ab980d6890a0fa6aa0336182f9f620.mp3", mute:false, focus:null, include:true}, - "call_calling": {implemented:true, name:"Outgoing Call", src:"/assets/c6e92752668dde4eee5923d70441579f.mp3", mute:false, focus:null, include:true}, - "call_ringing": {implemented:true, name:"Incoming Call", src:"/assets/84a1b4e11d634dbfa1e5dd97a96de3ad.mp3", mute:true, focus:null, include:true}, - "call_ringing_beat": {implemented:false, name:"Incoming Call Beat", src:"/assets/b9411af07f154a6fef543e7e442e4da9.mp3", mute:true, focus:null, include:true}, - "call_ringing_halloween": {implemented:false, name:"Incoming Call Halloween", src:"/assets/bceeb2ba92c01584dcaafc957f769bae.mp3", mute:true, focus:null, include:true}, - "stream_started": {implemented:true, name:"Stream Started", src:"/assets/9ca817f41727edc1b2f1bc4f1911107c.mp3", mute:false, focus:null, include:true}, - "stream_ended": {implemented:true, name:"Stream Ended", src:"/assets/4e30f98aa537854f79f49a76af822bbc.mp3", mute:false, focus:null, include:true}, - "stream_user_joined": {implemented:true, name:"Stream User Joined", src:"/assets/5827bbf9a67c61cbb0e02ffbf434b654.mp3", mute:false, focus:null, include:true}, - "stream_user_left": {implemented:true, name:"Stream User Left", src:"/assets/7cdcdcbc426cc43583365a671c24b740.mp3", mute:false, focus:null, include:true}, - "ddr-down": {implemented:true, name:"HotKeys Window Down", src:"/assets/71f048f8aa7d4b24bf4268a87cbbb192.mp3", mute:false, focus:null, include:true}, - "ddr-left": {implemented:true, name:"HotKeys Window Left", src:"/assets/1de04408e62b5d52ae3ebbb91e9e1978.mp3", mute:false, focus:null, include:true}, - "ddr-right": {implemented:true, name:"HotKeys Window Right", src:"/assets/2c0433f93db8449e4a82b76dc520cb29.mp3", mute:false, focus:null, include:true}, - "ddr-up": {implemented:true, name:"HotKeys Window Up", src:"/assets/68472713f7a62c7c37e0a6a5d5a1faeb.mp3", mute:false, focus:null, include:true}, - "mention1": {implemented:false, name:"Mention Ping", src:"/assets/fa4d62c3cbc80733bf1f01b9c6f181de.mp3", mute:true, focus:null, include:true}, - "mention2": {implemented:false, name:"Mention Ping 2", src:"/assets/a5f42064e8120e381528b14fd3188b72.mp3", mute:true, focus:null, include:true}, - "mention3": {implemented:false, name:"Mention Ping 3", src:"/assets/84c9fa3d07da865278bd77c97d952db4.mp3", mute:true, focus:null, include:true}, - "message2": {implemented:false, name:"New Chatmessage 2", src:"/assets/15fe810f6cfab609c7fcda61652b9b34.mp3", mute:true, focus:null, include:true}, - "message3": {implemented:false, name:"New Chatmessage 3", src:"/assets/53ce6a92d3c233e8b4ac529d34d374e4.mp3", mute:true, focus:null, include:true}, - "human_man": {implemented:false, name:"Human Man Voice", src:"/assets/a37dcd6272ae41cf49295d58c9806fe3.mp3", mute:true, focus:null, include:true}, - "robot_man": {implemented:false, name:"Robot Man Voice", src:"/assets/66598bea6e59eb8acdf32cf2d9d75ba9.mp3", mute:true, focus:null, include:true}, - "discodo": {implemented:false, name:"Discodo Launch", src:"/assets/ae7d16bb2eea76b9b9977db0fad66658.mp3", mute:true, focus:null, include:true}, - "overlayunlock": {implemented:false, name:"Overlay Unlocked", src:"/assets/ad322ffe0a88436296158a80d5d11baa.mp3", mute:true, focus:null, include:true} - }; - - /* NEVER CHANGE THE SRC LINKS IN THE PLUGIN FILE, TO ADD NEW SOUNDS ADD THEM IN THE SETTINGS GUI IN THE PLUGINS PAGE */ - const defaultAudios = { - "---": { - "---": null - }, - "Default": { - "Communication Channel": "https://notificationsounds.com/soundfiles/63538fe6ef330c13a05a3ed7e599d5f7/file-sounds-917-communication-channel.wav", - "Isn't it": "https://notificationsounds.com/soundfiles/ba2fd310dcaa8781a9a652a31baf3c68/file-sounds-969-isnt-it.wav", - "Job Done": "https://notificationsounds.com/soundfiles/5b69b9cb83065d403869739ae7f0995e/file-sounds-937-job-done.wav", - "Served": "https://notificationsounds.com/soundfiles/b337e84de8752b27eda3a12363109e80/file-sounds-913-served.wav", - "Solemn": "https://notificationsounds.com/soundfiles/53fde96fcc4b4ce72d7739202324cd49/file-sounds-882-solemn.wav", - "System Fault": "https://notificationsounds.com/soundfiles/ebd9629fc3ae5e9f6611e2ee05a31cef/file-sounds-990-system-fault.wav", - "You wouldn't believe": "https://notificationsounds.com/soundfiles/087408522c31eeb1f982bc0eaf81d35f/file-sounds-949-you-wouldnt-believe.wav" - }, - "Discord": {} - }; - - for (let id in types) if (types[id].include) defaultAudios.Discord[types[id].name] = types[id].src; - - const WebAudioSound = class WebAudioSound { - constructor (type) { - this._name = type; - this._src = audios[choices[type].category][choices[type].sound] || types[type].src; - this._volume = choices[type].volume; - } - loop () { - this._ensureAudio().then(audio => { - audio.loop = true; - audio.play(); - }); - } - play () { - this._ensureAudio().then(audio => { - audio.loop = false; - audio.play(); - }); - } - pause () { - this._audio.then(audio => { - audio.pause(); - }); - } - stop () { - this._destroyAudio(); - } - setTime (time) { - this._audio.then(audio => { - audio.currentTime = time; - }); - } - setLoop (loop) { - this._audio.then(audio => { - audio.loop = loop; - }); - } - _destroyAudio () { - if (this._audio) { - this._audio.then(audio => { - audio.pause(); - audio.src = ""; - }); - this._audio = null; - } - } - _ensureAudio () { - return this._audio = this._audio || new Promise((callback, errorCallback) => { - let audio = new Audio; - audio.src = this._src; - audio.onloadeddata = _ => { - audio.volume = Math.min((BDFDB.LibraryModules.MediaDeviceUtils.getOutputVolume() / 100) * (this._volume / 100), 1); - BDFDB.LibraryModules.PlatformUtils.embedded && audio.setSinkId(currentDevice || defaultDevice); - callback(audio); - }; - audio.onerror = _ => { - return errorCallback(new Error("could not play audio")) - }; - audio.onended = _ => { - return this._destroyAudio() - }; - audio.load(); - }), this._audio; - } - }; - - return class NotificationSounds extends Plugin { - onLoad() { - audios = {}; - choices = {}; - firedEvents = {}; - - this.patchedModules = { - after: { - Shakeable: "render" - } - }; - } - - onStart() { - if (BDFDB.LibraryModules.PlatformUtils.embedded) { - let change = _ => { - if (window.navigator.mediaDevices && window.navigator.mediaDevices.enumerateDevices) { - window.navigator.mediaDevices.enumerateDevices().then(enumeratedDevices => { - let id = BDFDB.LibraryModules.MediaDeviceUtils.getOutputDeviceId(); - let allDevices = BDFDB.LibraryModules.MediaDeviceUtils.getOutputDevices(); - let filteredDevices = enumeratedDevices.filter(d => d.kind == "audiooutput" && d.deviceId != "communications"); - let deviceIndex = BDFDB.LibraryModules.ArrayUtils(allDevices).sortBy(d => d.index).findIndex(d => d.id == id); - let deviceViaId = allDevices[id]; - let deviceViaIndex = filteredDevices[deviceIndex]; - if (deviceViaId && deviceViaIndex && deviceViaIndex.label != deviceViaId.name) deviceViaIndex = filteredDevices.find(d => d.label == deviceViaId.name); - currentDevice = deviceViaIndex ? deviceViaIndex.deviceId : defaultDevice; - }).catch(_ => { - currentDevice = defaultDevice; - }); - } - }; - BDFDB.StoreChangeUtils.add(this, BDFDB.LibraryModules.MediaDeviceUtils, change); - change(); - } - - BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.DispatchApiUtils, "dirtyDispatch", {before: e => { - if (BDFDB.ObjectUtils.is(e.methodArguments[0]) && e.methodArguments[0].type == BDFDB.DiscordConstants.ActionTypes.MESSAGE_CREATE && e.methodArguments[0].message) { - let message = e.methodArguments[0].message; - let guildId = message.guild_id || null; - if (!BDFDB.LibraryModules.MutedUtils.isGuildOrCategoryOrChannelMuted(guildId, message.channel_id) && message.author.id != BDFDB.UserUtils.me.id && !BDFDB.LibraryModules.FriendUtils.isBlocked(message.author.id)) { - if (!guildId && !(choices.dm.focus && document.hasFocus() && BDFDB.LibraryModules.LastChannelStore.getChannelId() == message.channel_id)) { - this.fireEvent("dm"); - this.playAudio("dm"); - return; - } - else if (BDFDB.LibraryModules.MentionUtils.isRawMessageMentioned(message, BDFDB.UserUtils.me.id)) { - if (message.mentions.length && !this.isSuppressMentionEnabled(guildId, message.channel_id) && !(choices.mentioned.focus && document.hasFocus() && BDFDB.LibraryModules.LastChannelStore.getChannelId() == message.channel_id)) for (let mention of message.mentions) if (mention.id == BDFDB.UserUtils.me.id) { - this.fireEvent("mentioned"); - this.playAudio("mentioned"); - return; - } - if (guildId && message.mention_roles.length && !BDFDB.LibraryModules.MutedUtils.isSuppressRolesEnabled(guildId, message.channel_id) && !(choices.role.focus && document.hasFocus() && BDFDB.LibraryModules.LastChannelStore.getChannelId() == message.channel_id)) { - let member = BDFDB.LibraryModules.MemberStore.getMember(guildId, BDFDB.UserUtils.me.id); - if (member && member.roles.length) for (let roleId of message.mention_roles) if (member.roles.includes(roleId)) { - this.fireEvent("role"); - this.playAudio("role"); - return; - } - } - if (message.mention_everyone && !BDFDB.LibraryModules.MutedUtils.isSuppressEveryoneEnabled(guildId, message.channel_id)) { - if (message.content.indexOf("@everyone") > -1 && !(choices.everyone.focus && document.hasFocus() && BDFDB.LibraryModules.LastChannelStore.getChannelId() == message.channel_id)) { - this.fireEvent("everyone"); - this.playAudio("everyone"); - return; - } - if (message.content.indexOf("@here") > -1 && !(choices.here.focus && document.hasFocus() && BDFDB.LibraryModules.LastChannelStore.getChannelId() == message.channel_id)) { - this.fireEvent("here"); - this.playAudio("here"); - return; - } - } - } - } - } - }}); - - BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.SoundUtils, "playSound", {instead: e => { - let type = e.methodArguments[0]; - if (choices[type]) BDFDB.TimeUtils.timeout(_ => { - if (type == "message1") { - if (firedEvents["dm"]) firedEvents["dm"] = false; - else if (firedEvents["mentioned"]) firedEvents["mentioned"] = false; - else if (firedEvents["role"]) firedEvents["role"] = false; - else if (firedEvents["everyone"]) firedEvents["everyone"] = false; - else if (firedEvents["here"]) firedEvents["here"] = false; - else this.playAudio(type); - } - else this.playAudio(type); - }); - else e.callOriginalMethod(); - }}); - BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.SoundUtils, "createSound", {after: e => { - if (choices[e.methodArguments[0]]) { - let audio = new WebAudioSound(e.methodArguments[0]); - createdAudios[e.methodArguments[0]] = audio; - return audio; - } - else BDFDB.LogUtils.warn(`Could not create sound for "${e.methodArguments[0]}".`, this.name); - }}); - - - for (let key in defaultAudios) defaultAudios[key] = BDFDB.ObjectUtils.sort(defaultAudios[key]); - - this.loadAudios(); - this.loadChoices(); - - let callListenerModule = BDFDB.ModuleUtils.findByProperties("handleRingUpdate"); - if (callListenerModule) { - callListenerModule.terminate(); - BDFDB.PatchUtils.patch(this, callListenerModule, "handleRingUpdate", {instead: e => { - if (BDFDB.LibraryModules.CallUtils.getCalls().filter(call => call.ringing.length > 0 && BDFDB.LibraryModules.VoiceUtils.getCurrentClientVoiceChannelId() === call.channelId).length > 0 && !BDFDB.LibraryModules.SoundStateUtils.isSoundDisabled("call_calling") && !BDFDB.LibraryModules.StreamerModeStore.disableSounds) { - createdAudios["call_calling"].loop(); - } - else createdAudios["call_calling"].stop(); - }}); - callListenerModule.initialize(); - } - - this.forceUpdateAll(); - } - - onStop() { - for (let type in createdAudios) if (createdAudios[type]) createdAudios[type].stop(); - } - - getSettingsPanel (collapseStates = {}) { - let createSoundCard = type => { - return [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { - className: BDFDB.disCN.marginbottom8, - align: BDFDB.LibraryComponents.Flex.Align.CENTER, - direction: BDFDB.LibraryComponents.Flex.Direction.HORIZONTAL, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsLabel, { - label: types[type].name - }), - types[type].focus != null ? BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { - type: "Switch", - mini: true, - grow: 0, - label: "Mute when Channel focused:", - value: choices[type].focus, - onChange: value => { - choices[type].focus = value; - this.saveChoice(type, false); - } - }) : null, - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { - type: "Switch", - mini: true, - grow: 0, - label: "Mute in DnD:", - value: choices[type].mute, - onChange: value => { - choices[type].mute = value; - this.saveChoice(type, false); - } - }) - ].filter(n => n) - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { - className: BDFDB.disCN.marginbottom8, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, { - grow: 0, - shrink: 0, - basis: "31%", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: "Category", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Select, { - value: choices[type].category, - options: Object.keys(audios).map(name => ({value:name, label:name})), - searchable: true, - onChange: category => { - choices[type].category = category.value; - choices[type].sound = Object.keys(audios[category.value] || {})[0]; - this.saveChoice(type, true); - BDFDB.PluginUtils.refreshSettingsPanel(this, settingsPanel, collapseStates); - } - }) - }) - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, { - grow: 0, - shrink: 0, - basis: "31%", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: "Sound", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Select, { - value: choices[type].sound, - options: Object.keys(audios[choices[type].category] || {}).map(name => ({value:name, label:name})), - searchable: true, - onChange: sound => { - choices[type].sound = sound.value; - this.saveChoice(type, true); - BDFDB.PluginUtils.refreshSettingsPanel(this, settingsPanel, collapseStates); - } - }) - }) - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, { - grow: 0, - shrink: 0, - basis: "31%", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: "Volume", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Slider, { - defaultValue: choices[type].volume, - digits: 1, - onValueRender: value => { - return value + "%"; - }, - onValueChange: value => { - choices[type].volume = value; - this.saveChoice(type, true); - } - }) - }) - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormDivider, { - className: BDFDB.disCN.marginbottom8 - }) - ]; - }; - - let successSavedAudio = data => { - BDFDB.NotificationUtils.toast(`Sound ${data.sound} was added to category ${data.category}.`, {type:"success"}); - if (!audios[data.category]) audios[data.category] = {}; - audios[data.category][data.sound] = data.source; - BDFDB.DataUtils.save(audios, this, "audios"); - BDFDB.PluginUtils.refreshSettingsPanel(this, settingsPanel, collapseStates); - - }; - - let settingsPanel, settingsItems = []; - - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.CollapseContainer, { - title: "Add new Sound", - collapseStates: collapseStates, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { - className: BDFDB.disCN.margintop4, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, { - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: "Categoryname", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - className: "input-newsound input-category", - value: "", - placeholder: "Categoryname" - }) - }) - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, { - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: "Soundname", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - className: "input-newsound input-sound", - value: "", - placeholder: "Soundname" - }) - }) - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { - className: BDFDB.disCN.margintop4, - align: BDFDB.LibraryComponents.Flex.Align.END, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, { - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: "Source", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - className: "input-newsound input-source", - type: "file", - filter: ["audio", "video"], - useFilePath: true, - value: "", - placeholder: "Source" - }) - }) - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Button, { - style: {marginBottom: 1}, - onClick: _ => { - for (let input of settingsPanel.querySelectorAll(".input-newsound " + BDFDB.dotCN.input)) if (!input.value || input.value.length == 0 || input.value.trim().length == 0) return BDFDB.NotificationUtils.toast("Fill out all fields to add a new sound.", {type:"danger"}); - let category = settingsPanel.querySelector(".input-category " + BDFDB.dotCN.input).value.trim(); - let sound = settingsPanel.querySelector(".input-sound " + BDFDB.dotCN.input).value.trim(); - let source = settingsPanel.querySelector(".input-source " + BDFDB.dotCN.input).value.trim(); - if (source.indexOf("http") == 0) BDFDB.LibraryRequires.request(source, (error, response, result) => { - if (response) { - let type = response.headers["content-type"]; - if (type && (type.indexOf("octet-stream") > -1 || type.indexOf("audio") > -1 || type.indexOf("video") > -1)) return successSavedAudio({category, sound, source}); - } - BDFDB.NotificationUtils.toast("Use a valid direct link to a video or audio source. They usually end on something like .mp3, .mp4 or .wav.", {type:"danger"}); - }); - else BDFDB.LibraryRequires.fs.readFile(source, (error, response) => { - if (error) BDFDB.NotificationUtils.toast("Could not fetch file. Please make sure the file exists.", {type:"danger"}); - else return successSavedAudio({category, sound, source:`data:audio/mpeg;base64,${response.toString("base64")}`}); - }); - }, - children: BDFDB.LanguageUtils.LanguageStrings.SAVE - }) - ] - }) - ] - })); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.CollapseContainer, { - title: "Implemented Sounds", - collapseStates: collapseStates, - children: Object.keys(BDFDB.ObjectUtils.filter(types, typedata => typedata.implemented)).map(type => createSoundCard(type)).flat(10).filter(n => n) - })); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.CollapseContainer, { - title: "Unimplemented Sounds", - collapseStates: collapseStates, - children: Object.keys(BDFDB.ObjectUtils.filter(types, typedata => !typedata.implemented)).map(type => createSoundCard(type)).flat(10).filter(n => n) - })); - - let removeableCategories = [{value:removeAllKey, label:BDFDB.LanguageUtils.LanguageStrings.FORM_LABEL_ALL}].concat(Object.keys(audios).filter(category => !(defaultAudios[category] && !Object.keys(audios[category] || {}).filter(sound => defaultAudios[category][sound] === undefined).length)).map(name => ({value:name, label:name}))); - let removeableSounds = {}; - for (let category of removeableCategories) removeableSounds[category.value] = [{value:removeAllKey, label:BDFDB.LanguageUtils.LanguageStrings.FORM_LABEL_ALL}].concat(Object.keys(audios[category.value] || {}).filter(sound => !(defaultAudios[category.value] && defaultAudios[category.value][sound] !== undefined)).map(name => ({value:name, label:name}))); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.CollapseContainer, { - title: "Remove Sounds", - collapseStates: collapseStates, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { - className: BDFDB.disCN.margintop4, - align: BDFDB.LibraryComponents.Flex.Align.END, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, { - grow: 0, - shrink: 0, - basis: "35%", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: "Category", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Select, { - key: "REMOVE_CATEGORY", - value: removeAllKey, - options: removeableCategories, - searchable: true, - onChange: (category, instance) => { - let soundSelectIns = BDFDB.ReactUtils.findOwner(BDFDB.ReactUtils.findOwner(instance, {name:["BDFDB_Modal", "BDFDB_SettingsPanel"], up:true}), {key:"REMOVE_SOUND"}); - if (soundSelectIns && removeableSounds[category.value]) { - soundSelectIns.props.options = removeableSounds[category.value]; - soundSelectIns.props.value = removeAllKey; - BDFDB.ReactUtils.forceUpdate(soundSelectIns); - } - } - }) - }) - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, { - grow: 0, - shrink: 0, - basis: "35%", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: "Sound", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Select, { - key: "REMOVE_SOUND", - value: removeAllKey, - options: removeableSounds[removeAllKey], - searchable: true - }) - }) - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex.Child, { - grow: 0, - shrink: 0, - basis: "25%", - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Button, { - style: {marginBottom: 1}, - color: BDFDB.LibraryComponents.Button.Colors.RED, - onClick: (event, instance) => { - let wrapperIns = BDFDB.ReactUtils.findOwner(instance, {name:["BDFDB_Modal", "BDFDB_SettingsPanel"], up:true}); - let categorySelectIns = BDFDB.ReactUtils.findOwner(wrapperIns, {key:"REMOVE_CATEGORY"}); - let soundSelectIns = BDFDB.ReactUtils.findOwner(wrapperIns, {key:"REMOVE_SOUND"}); - if (categorySelectIns && soundSelectIns) { - let soundAmount = 0; - let catAll = categorySelectIns.props.value == removeAllKey; - let soundAll = soundSelectIns.props.value == removeAllKey; - if (catAll) soundAmount = BDFDB.ArrayUtils.sum(Object.keys(audios).map(category => Object.keys(audios[category] || {}).filter(sound => !(defaultAudios[category] && defaultAudios[category][sound] !== undefined)).length)); - else if (soundAll) soundAmount = Object.keys(audios[categorySelectIns.props.value] || {}).filter(sound => !(defaultAudios[categorySelectIns.props.value] && defaultAudios[categorySelectIns.props.value][sound] !== undefined)).length; - else if (audios[categorySelectIns.props.value][soundSelectIns.props.value]) soundAmount = 1; - - if (soundAmount) BDFDB.ModalUtils.confirm(this, `Are you sure you want to delete ${soundAmount} added sound${soundAmount == 1 ? "" : "s"}?`, _ => { - if (catAll) BDFDB.DataUtils.remove(this, "audios"); - else if (soundAll) BDFDB.DataUtils.remove(this, "audios", categorySelectIns.props.value); - else { - delete audios[categorySelectIns.props.value][soundSelectIns.props.value]; - if (BDFDB.ObjectUtils.isEmpty(audios[categorySelectIns.props.value])) delete audios[categorySelectIns.props.value]; - BDFDB.DataUtils.save(audios, this, "audios"); - } - this.loadAudios(); - this.loadChoices(); - BDFDB.PluginUtils.refreshSettingsPanel(this, settingsPanel, collapseStates); - }); - else BDFDB.NotificationUtils.toast("No sounds to delete.", {type:"danger"}); - } - }, - children: BDFDB.LanguageUtils.LanguageStrings.DELETE - }) - }) - ] - }) - })); - - return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, settingsItems); - } - - onSettingsClosed () { - if (this.SettingsUpdated) { - delete this.SettingsUpdated; - for (let type in createdAudios) if (createdAudios[type]) createdAudios[type].stop(); - createdAudios = {}; - this.forceUpdateAll(); - } - } - - forceUpdateAll () { - repatchIncoming = true; - createdAudios["call_calling"] = BDFDB.LibraryModules.SoundUtils.createSound("call_calling"); - BDFDB.PatchUtils.forceAllUpdates(this); - } - - processShakeable (e) { - if (e.returnvalue && BDFDB.ArrayUtils.is(e.returnvalue.props.children)) { - let child = e.returnvalue.props.children.find(n => { - let string = n && n.type && n.type.toString(); - return string && string.indexOf("call_ringing_beat") > -1 && string.indexOf("call_ringing") > -1 && string.indexOf("hasIncomingCalls") > -1; - }); - if (child) { - let index = e.returnvalue.props.children.indexOf(child); - if (repatchIncoming) { - e.returnvalue.props.children[index] = null; - BDFDB.TimeUtils.timeout(_ => { - repatchIncoming = false; - BDFDB.ReactUtils.forceUpdate(BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.app), {name:"App", up:true})) - }); - } - else e.returnvalue.props.children[index] = BDFDB.ReactUtils.createElement(e.returnvalue.props.children[index].type, {}); - } - } - } - - loadAudios () { - audios = Object.assign({}, defaultAudios, BDFDB.DataUtils.load(this, "audios")); - BDFDB.DataUtils.save(audios, this, "audios"); - } - - loadChoices () { - let loadedChoices = BDFDB.DataUtils.load(this, "choices"); - for (let type in types) { - let choice = loadedChoices[type] || {}, soundFound = false; - // REMOVE 06.10.2020 - choice.sound = choice.song || choice.sound; - delete choice.song; - delete choice.src; - for (let category in audios) if (choice.category == category) for (let sound in audios[category]) if (choice.sound == sound) { - soundFound = true; - break; - } - if (!soundFound) choice = { - category: "---", - sound: "---", - volume: 100, - mute: types[type].mute, - focus: types[type].focus - }; - choices[type] = choice; - this.saveChoice(type, false); - } - } - - saveChoice (type, play) { - if (!choices[type]) return; - BDFDB.DataUtils.save(choices[type], this, "choices", type); - if (play) { - this.SettingsUpdated = true; - this.playAudio(type); - } - } - - playAudio (type) { - if (this.dontPlayAudio(type) || BDFDB.LibraryModules.StreamerModeStore.disableSounds) return; - if (createdAudios[type]) createdAudios[type].stop(); - createdAudios[type] = new WebAudioSound(type); - createdAudios[type].play(); - } - - isSuppressMentionEnabled (guildId, channelId) { - let channelSettings = BDFDB.LibraryModules.MutedUtils.getChannelMessageNotifications(guildId, channelId); - return channelSettings && (channelSettings == BDFDB.DiscordConstants.UserNotificationSettings.NO_MESSAGES || channelSettings == BDFDB.DiscordConstants.UserNotificationSettings.NULL && BDFDB.LibraryModules.MutedUtils.getMessageNotifications(guildId) == BDFDB.DiscordConstants.UserNotificationSettings.NO_MESSAGES); - } - - dontPlayAudio (type) { - let status = BDFDB.UserUtils.getStatus(); - return choices[type].mute && (status == "dnd" || status == "streaming"); - } - - fireEvent (type) { - firedEvents[type] = true; - BDFDB.TimeUtils.timeout(_ => {firedEvents[type] = false;},3000); - } - }; - })(window.BDFDB_Global.PluginUtils.buildPlugin(config)); -})();
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/PinDMs.config.json b/.config/BetterDiscord/plugins/PinDMs.config.json deleted file mode 100644 index 297e056..0000000 --- a/.config/BetterDiscord/plugins/PinDMs.config.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "changelog": { - "currentversion": "1.7.6" - }, - "dmCategories": { - "3516090637537661": { - "collapsed": false, - "color": null, - "dms": [ - "458302680998215690", - "514803935761006592", - "456428001463369729", - "390601823523962892", - "390786176652673034" - ], - "id": "3516090637537661", - "name": "Gouden mannen", - "pos": 1 - }, - "3586821958853646": { - "collapsed": false, - "color": null, - "dms": [ - "631947333046894623", - "703197442098855997", - "642833698315698232", - "450987439041806346", - "590888637877452840" - ], - "id": "3586821958853646", - "name": "Jongens", - "pos": 0 - } - }, - "settings": { - "showCategoryAmount": false, - "showCategoryUnread": true, - "showPinIcon": true, - "sortInRecentOrder": false, - "sortInRecentOrderGuild": false - } -}
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/PinDMs.plugin.js b/.config/BetterDiscord/plugins/PinDMs.plugin.js deleted file mode 100644 index e61e79d..0000000 --- a/.config/BetterDiscord/plugins/PinDMs.plugin.js +++ /dev/null @@ -1,1138 +0,0 @@ -//META{"name":"PinDMs","authorId":"278543574059057154","invite":"Jx3TjNS","donate":"https://www.paypal.me/MircoWittrien","patreon":"https://www.patreon.com/MircoWittrien","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/PinDMs","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/PinDMs/PinDMs.plugin.js"}*// - -module.exports = (_ => { - const config = { - "info": { - "name": "PinDMs", - "author": "DevilBro", - "version": "1.7.6", - "description": "Allows you to pin DMs, making them appear at the top of your DMs/Server-List." - } - }; - return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { - getName () {return config.info.name;} - getAuthor () {return config.info.author;} - getVersion () {return config.info.version;} - getDescription () {return config.info.description;} - - load() { - if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue:[]}); - if (!window.BDFDB_Global.downloadModal) { - window.BDFDB_Global.downloadModal = true; - BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click "Download Now" to install it.`, { - confirmText: "Download Now", - cancelText: "Cancel", - onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, - onConfirm: _ => {delete window.BDFDB_Global.downloadModal;require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (error, response, body) => {require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), body, _ => {});});} - }); - } - if (!window.BDFDB_Global.pluginQueue.includes(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name); - } - start() {} - stop() {} - } : (([Plugin, BDFDB]) => { - var hoveredCategory, draggedCategory, releasedCategory; - var hoveredChannel, draggedChannel, releasedChannel; - - var settings = {}; - - return class PinDMs extends Plugin { - onLoad() { - this.defaults = { - settings: { - sortInRecentOrder: {value:false, inner:true, description:"Channel List"}, - sortInRecentOrderGuild: {value:false, inner:true, description:"Guild List"}, - showPinIcon: {value:true, inner:false, description:"Shows a little 'Pin' icon for pinned DMs in the server list:"}, - showCategoryUnread: {value:true, inner:false, description:"Shows the amount of unread Messages in a category in the channel list:"}, - showCategoryAmount: {value:true, inner:false, description:"Shows the amount of pinned DMs in a category in the channel list:"} - } - }; - - this.patchedModules = { - before: { - PrivateChannelsList: "render", - UnreadDMs: "render" - }, - after: { - PrivateChannelsList: "render", - UnreadDMs: "render", - PrivateChannel: ["render", "componentDidMount"], - DirectMessage: ["render", "componentDidMount", "componentWillUnmount"] - } - }; - - this.css = ` - ${BDFDB.dotCNS.dmchannel + BDFDB.dotCN.namecontainerchildren} { - display: flex; - } - ${BDFDB.dotCN.dmchannel}:hover ${BDFDB.dotCN._pindmsunpinbutton} { - display: block; - } - ${BDFDB.dotCN._pindmspinnedchannelsheadercontainer} { - display: flex; - cursor: pointer; - } - ${BDFDB.dotCNS._pindmspinnedchannelsheadercontainer + BDFDB.dotCN.dmchannelheadertext} { - margin-right: 6px; - } - ${BDFDB.dotCN._pindmspinnedchannelsheadercontainer + BDFDB.dotCN._pindmspinnedchannelsheadercolored}:hover ${BDFDB.dotCN.dmchannelheadertext} { - filter: brightness(150%); - } - ${BDFDB.dotCNS._pindmspinnedchannelsheadercontainer + BDFDB.dotCN._pindmspinnedchannelsheaderamount} { - position: relative; - top: -1px; - margin-right: 6px; - } - ${BDFDB.dotCN._pindmspinnedchannelsheaderarrow} { - flex: 0; - width: 16px; - height: 16px; - margin-left: 0; - margin-right: 2px; - } - ${BDFDB.dotCNS._pindmspinnedchannelsheadercollapsed + BDFDB.dotCN._pindmspinnedchannelsheaderarrow + BDFDB.dotCN.channelheadericonwrapper} { - transform: rotate(-90deg); - } - ${BDFDB.dotCN._pindmsunpinbutton} { - display: none; - width: 16px; - height: 16px; - opacity: .7; - margin: 2px; - } - ${BDFDB.dotCN._pindmsunpinbutton}:hover { - opacity: 1; - } - ${BDFDB.dotCN._pindmsunpinicon} { - display: block; - width: 16px; - height: 16px; - } - ${BDFDB.dotCNS._pindmsdmchannelplaceholder + BDFDB.dotCN.namecontainerlayout} { - box-sizing: border-box; - border: 1px dashed currentColor; - } - ${BDFDB.dotCN._pindmspinnedchannelsheadercontainer + BDFDB.dotCN._pindmsdmchannelplaceholder} { - margin-left: 8px; - height: 12px; - box-sizing: border-box; - border: 1px dashed currentColor; - } - ${BDFDB.dotCN._pindmsdragpreview} { - pointer-events: none !important; - position: absolute !important; - opacity: 0.5 !important; - z-index: 10000 !important; - } - `; - } - - onStart() { - this.forceUpdateAll(); - } - - onStop() { - this.forceUpdateAll(); - - let unreadDMsInstance = BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.app), {name:"UnreadDMs", unlimited:true}); - if (unreadDMsInstance) { - delete unreadDMsInstance.props.pinnedPrivateChannelIds; - unreadDMsInstance.props.unreadPrivateChannelIds = BDFDB.LibraryModules.DirectMessageUnreadStore.getUnreadPrivateChannelIds(); - BDFDB.ReactUtils.forceUpdate(unreadDMsInstance); - } - } - - getSettingsPanel (collapseStates = {}) { - let settingsPanel, settingsItems = []; - - - for (let key in settings) if (!this.defaults.settings[key].inner) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { - className: BDFDB.disCN.marginbottom8, - type: "Switch", - plugin: this, - keys: ["settings", key], - label: this.defaults.settings[key].description, - value: settings[key] - })); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsPanelInner, { - title: "Sort pinned DMs in the recent message order instead of the pinned at order in:", - first: settingsItems.length == 0, - children: Object.keys(settings).map(key => this.defaults.settings[key].inner && BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { - className: BDFDB.disCN.marginbottom8, - type: "Switch", - plugin: this, - keys: ["settings", key], - label: this.defaults.settings[key].description, - value: settings[key] - })) - })); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { - type: "Button", - className: BDFDB.disCN.marginbottom8, - color: BDFDB.LibraryComponents.Button.Colors.RED, - label: "Unpin all pinned DMs", - onClick: _ => { - BDFDB.ModalUtils.confirm(this, "Are you sure you want to unpin all pinned DMs?", _ => { - BDFDB.DataUtils.remove(this, "dmCategories"); - BDFDB.DataUtils.remove(this, "pinnedRecents"); - }); - }, - children: BDFDB.LanguageUtils.LanguageStrings.UNPIN - })); - - return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, settingsItems); - } - - onSettingsClosed () { - if (this.SettingsUpdated) { - delete this.SettingsUpdated; - this.forceUpdateAll(); - } - } - - forceUpdateAll () { - settings = BDFDB.DataUtils.get(this, "settings"); - - BDFDB.ReactUtils.forceUpdate(BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.app), {name:"FluxContainer(PrivateChannels)", all:true, unlimited:true})); - BDFDB.PatchUtils.forceAllUpdates(this); - } - - onUserContextMenu (e) { - if (e.instance.props.user) { - let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "close-dm"}); - if (index > -1) { - let id = BDFDB.LibraryModules.ChannelStore.getDMFromUserId(e.instance.props.user.id); - if (id) this.injectItem(e.instance, id, children, index); - } - } - } - - onGroupDMContextMenu (e) { - if (e.instance.props.channel) { - let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "change-icon"}); - if (index > -1) this.injectItem(e.instance, e.instance.props.channel.id, children, index + 1); - } - } - - injectItem (instance, id, children, index) { - let pinnedInGuild = this.isPinned(id, "pinnedRecents"); - - let categories = this.sortAndUpdateCategories("dmCategories", true); - let currentCategory = this.getCategory(id, "dmCategories"); - - children.splice(index, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.context_pindm_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "submenu-pin"), - children: [ - BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.context_pinchannel_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "submenu-channelist"), - children: [ - BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { - children: currentCategory ? BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.context_unpinchannel_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "unpin-channellist"), - color: BDFDB.LibraryComponents.MenuItems.Colors.DANGER, - action: _ => { - this.removeFromCategory(id, currentCategory, "dmCategories"); - } - }) : BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels.context_addtonewcategory_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "new-channellist"), - color: BDFDB.LibraryComponents.MenuItems.Colors.BRAND, - action: _ => { - this.openCategorySettingsModal({ - id: this.generateID("dmCategories").toString(), - name: `${this.labels.header_pinneddms_text} #${categories.length + 1}`, - dms: [id], - pos: categories.length, - collapsed: false, - color: null - }, "dmCategories", true); - } - }) - }), - categories.length ? BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { - children: categories.map(category => currentCategory && currentCategory.id == category.id ? null : BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: category.name || this.labels.header_pinneddms_text, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "pin-channellist", category.id), - action: _ => { - if (currentCategory) this.removeFromCategory(id, currentCategory, "dmCategories"); - this.addToCategory(id, category, "dmCategories"); - } - })).filter(n => n) - }) : null - ].filter(n => n) - }), - BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: this.labels[pinnedInGuild ? "context_unpinguild_text" : "context_pinguild_text"], - id: BDFDB.ContextMenuUtils.createItemId(this.name, pinnedInGuild ? "unpin-serverlist" : "pin-serverlist"), - danger: pinnedInGuild, - action: _ => { - if (!pinnedInGuild) this.addPin(id, "pinnedRecents"); - else this.removePin(id, "pinnedRecents"); - } - }) - ] - })); - } - - processPrivateChannelsList (e) { - let categories = this.sortAndUpdateCategories("dmCategories", true); - if (categories.length) { - e.instance.props.channels = Object.assign({}, e.instance.props.channels); - e.instance.props.privateChannelIds = [].concat(e.instance.props.privateChannelIds || []); - e.instance.props.pinnedChannelIds = Object.assign({}, e.instance.props.pinnedChannelIds); - if (!e.returnvalue) { - if (draggedChannel && releasedChannel) { - let categoryId = releasedChannel.split("header_")[1]; - let category = categories.find(n => categoryId != undefined ? n.id == categoryId : n.dms.includes(releasedChannel)); - if (category) { - BDFDB.ArrayUtils.remove(category.dms, draggedChannel, true); - category.dms.splice(categoryId != undefined ? 0 : category.dms.indexOf(releasedChannel) + 1, 0, draggedChannel); - BDFDB.DataUtils.save(category, this, "dmCategories", category.id); - } - draggedChannel = null; - releasedChannel = null; - } - if (draggedCategory && releasedCategory) { - let maybedDraggedCategory = categories.find(n => n.id == draggedCategory); - let maybedReleasedCategory = categories.find(n => n.id == releasedCategory); - if (maybedDraggedCategory && maybedReleasedCategory) { - BDFDB.ArrayUtils.remove(categories, maybedDraggedCategory, true); - categories.splice(categories.indexOf(maybedReleasedCategory) + 1, 0, maybedDraggedCategory); - let newCategories = {}, newPos = 0; - for (let category of [].concat(categories).reverse()) newCategories[category.id] = Object.assign(category, {pos:newPos++}); - BDFDB.DataUtils.save(newCategories, this, "dmCategories"); - } - draggedCategory = null; - releasedCategory = null; - } - e.instance.props.pinnedChannelIds = {}; - for (let category of [].concat(categories).reverse()) { - e.instance.props.pinnedChannelIds[category.id] = []; - for (let id of this.sortDMsByTime(this.filterDMs(category.dms), "dmCategories").reverse()) { - BDFDB.ArrayUtils.remove(e.instance.props.privateChannelIds, id, true); - if (!category.collapsed || e.instance.props.selectedChannelId == id) { - e.instance.props.privateChannelIds.unshift(id); - e.instance.props.pinnedChannelIds[category.id].push(id); - } - } - } - } - else { - e.returnvalue.props.sections = []; - e.returnvalue.props.sections.push(e.instance.state.preRenderedChildren); - let shownPinnedIds = BDFDB.ObjectUtils.toArray(e.instance.props.pinnedChannelIds).reverse(); - for (let ids of shownPinnedIds) e.returnvalue.props.sections.push(ids.length || 1); - e.returnvalue.props.sections.push(e.instance.props.privateChannelIds.length - shownPinnedIds.flat().length); - - let sectionHeight = e.returnvalue.props.sectionHeight; - let sectionHeightFunc = typeof sectionHeight != "function" ? _ => sectionHeight : sectionHeight; - e.returnvalue.props.sectionHeight = (...args) => { - if (args[0] != 0 && args[0] != e.returnvalue.props.sections.length - 1) { - let category = categories[args[0] - 1]; - if (category) return 40; - } - return sectionHeightFunc(...args); - }; - - let rowHeight = e.returnvalue.props.rowHeight; - let rowHeightFunc = typeof rowHeight != "function" ? _ => rowHeight : rowHeight; - e.returnvalue.props.rowHeight = (...args) => { - if (args[0] != 0 && args[0] != e.returnvalue.props.sections.length - 1) { - let category = categories[args[0] - 1]; - if (category && (category.collapsed || category.id == draggedCategory)) return 0; - } - return rowHeightFunc(...args); - }; - - let renderRow = e.returnvalue.props.renderRow; - e.returnvalue.props.renderRow = (...args) => { - let row = renderRow(...args); - return row && row.key == "no-private-channels" ? null : row; - }; - - let renderSection = e.returnvalue.props.renderSection; - e.returnvalue.props.renderSection = (...args) => { - if (args[0].section != 0 && args[0].section != e.returnvalue.props.sections.length - 1) { - let category = categories[args[0].section - 1]; - if (category && draggedCategory != category.id) { - let color = BDFDB.ColorUtils.convert(category.color, "RGBA"); - let foundDMs = this.filterDMs(category.dms); - let unreadAmount = settings.showCategoryUnread && BDFDB.ArrayUtils.sum(foundDMs.map(id => BDFDB.LibraryModules.UnreadChannelUtils.getMentionCount(id))); - return [ - BDFDB.ReactUtils.createElement("h2", { - className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.dmchannelheadercontainer, BDFDB.disCN._pindmspinnedchannelsheadercontainer, category.collapsed && BDFDB.disCN._pindmspinnedchannelsheadercollapsed, color && BDFDB.disCN._pindmspinnedchannelsheadercolored, BDFDB.disCN.namecontainernamecontainer), - categoryId: category.id, - onMouseDown: event => { - event = event.nativeEvent || event; - let node = BDFDB.DOMUtils.getParent(BDFDB.dotCN._pindmspinnedchannelsheadercontainer, event.target).cloneNode(true); - let mousemove = event2 => { - if (Math.sqrt((event.pageX - event2.pageX)**2) > 20 || Math.sqrt((event.pageY - event2.pageY)**2) > 20) { - BDFDB.ListenerUtils.stopEvent(event); - draggedCategory = category.id; - this.updateContainer("dmCategories"); - let dragPreview = this.createDragPreview(node, event2); - document.removeEventListener("mousemove", mousemove); - document.removeEventListener("mouseup", mouseup); - let dragging = event3 => { - this.updateDragPreview(dragPreview, event3); - let placeholder = BDFDB.DOMUtils.getParent(BDFDB.dotCN._pindmsdmchannelplaceholder, event3.target); - let categoryNode = BDFDB.DOMUtils.getParent(BDFDB.dotCN._pindmspinnedchannelsheadercontainer, placeholder ? placeholder.previousSibling : event3.target); - let maybeHoveredCategory = categoryNode && categoryNode.getAttribute("categoryId"); - let update = maybeHoveredCategory != hoveredCategory; - if (maybeHoveredCategory) hoveredCategory = maybeHoveredCategory; - else hoveredCategory = null; - if (update) this.updateContainer("dmCategories"); - }; - let releasing = event3 => { - BDFDB.DOMUtils.remove(dragPreview); - if (hoveredCategory) releasedCategory = hoveredCategory; - else draggedCategory = null; - hoveredCategory = null; - this.updateContainer("dmCategories"); - document.removeEventListener("mousemove", dragging); - document.removeEventListener("mouseup", releasing); - }; - document.addEventListener("mousemove", dragging); - document.addEventListener("mouseup", releasing); - } - }; - let mouseup = _ => { - document.removeEventListener("mousemove", mousemove); - document.removeEventListener("mouseup", mouseup); - }; - document.addEventListener("mousemove", mousemove); - document.addEventListener("mouseup", mouseup); - }, - onClick: _ => { - if (foundDMs.length || !category.collapsed) { - category.collapsed = !category.collapsed; - BDFDB.DataUtils.save(category, this, "dmCategories", category.id); - this.updateContainer("dmCategories"); - } - }, - onContextMenu: event => { - BDFDB.ContextMenuUtils.open(this, event, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { - children: [ - BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: BDFDB.LanguageUtils.LanguageStrings.CATEGORY_SETTINGS, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "category-settings"), - action: event2 => { - this.openCategorySettingsModal(category, "dmCategories"); - } - }), - BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { - label: BDFDB.LanguageUtils.LanguageStrings.DELETE_CATEGORY, - id: BDFDB.ContextMenuUtils.createItemId(this.name, "remove-category"), - color: BDFDB.LibraryComponents.MenuItems.Colors.DANGER, - action: event2 => { - BDFDB.DataUtils.remove(this, "dmCategories", category.id); - this.updateContainer("dmCategories"); - } - }) - ] - })); - }, - children: [ - BDFDB.ObjectUtils.is(color) ? BDFDB.ReactUtils.createElement("span", { - className: BDFDB.disCN.dmchannelheadertext, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextGradientElement, { - gradient: BDFDB.ColorUtils.createGradient(color), - children: category.name - }) - }) : BDFDB.ReactUtils.createElement("span", { - className: BDFDB.disCN.dmchannelheadertext, - style: {color: color}, - children: category.name, - }), - unreadAmount ? BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Badges.NumberBadge, { - className: BDFDB.disCN._pindmspinnedchannelsheaderamount, - count: unreadAmount, - style: {backgroundColor: BDFDB.DiscordConstants.Colors.STATUS_RED} - }) : null, - settings.showCategoryAmount ? BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Badges.NumberBadge, { - className: BDFDB.disCN._pindmspinnedchannelsheaderamount, - count: foundDMs.length, - style: {backgroundColor: BDFDB.DiscordConstants.Colors.BRAND} - }) : null, - BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCNS._pindmspinnedchannelsheaderarrow + BDFDB.disCNS.channelheadericonwrapper + BDFDB.disCN.channelheadericonclickable, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, { - className: BDFDB.disCNS._pindmspinnedchannelsheaderarrow + BDFDB.disCN.channelheadericon, - nativeClass: true, - iconSVG: `<svg width="24" height="24" viewBox="4 4 16 16"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M16.59 8.59004L12 13.17L7.41 8.59004L6 10L12 16L18 10L16.59 8.59004Z"></path></svg>` - }) - }) - ].filter(n => n) - }), - hoveredChannel == "header_" + category.id && BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCNS.dmchannel + BDFDB.disCNS._pindmsdmchannelpinned + BDFDB.disCNS._pindmsdmchannelplaceholder + BDFDB.disCN.namecontainernamecontainer, - children: BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCN.namecontainerlayout - }) - }) - ].filter(n => n); - } - else return null; - } - else return renderSection(...args); - }; - } - - let pinnedIds = BDFDB.ObjectUtils.toArray(e.instance.props.pinnedChannelIds).reverse(); - BDFDB.PatchUtils.unpatch(this, e.instance, "renderDM"); - BDFDB.PatchUtils.patch(this, e.instance, "renderDM", {before: e2 => { - if (e2.methodArguments[0] != 0) e2.methodArguments[1] += pinnedIds.slice(0, e2.methodArguments[0] - 1).flat().length; - }, after: e2 => { - if (e2.methodArguments[0] != 0) { - let id = e.instance.props.privateChannelIds[e2.methodArguments[1]]; - e2.returnValue = e.instance.props.channels[id] ? BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.PrivateChannelItems[e.instance.props.channels[id].isMultiUserDM() ? "GroupDM" : "DirectMessage"], Object.assign({ - key: id, - channel: e.instance.props.channels[id], - selected: e.instance.props.selectedChannelId == id - }, (e.instance.props.navigator || e.instance.props.listNavigator).getItemProps({ - index: e2.methodArguments[2] - }))) : null; - - let category = categories[e2.methodArguments[0] - 1]; - if (category) { - if (!id || (category.collapsed && e.instance.props.selectedChannelId != id) || !category.dms.includes(id) || draggedCategory == category.id || draggedChannel == id) e2.returnValue = null; - else if (hoveredCategory == category.id && [].concat(category.dms).reverse()[0] == id) e2.returnValue = [ - e2.returnValue, - BDFDB.ReactUtils.createElement("h2", { - className: BDFDB.disCNS.dmchannelheadercontainer + BDFDB.disCNS._pindmspinnedchannelsheadercontainer + BDFDB.disCNS._pindmsdmchannelplaceholder + BDFDB.disCN.namecontainernamecontainer - }) - ].filter(n => n); - else if (hoveredChannel == id) e2.returnValue = [ - e2.returnValue, - BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCNS.dmchannel + BDFDB.disCNS._pindmsdmchannelpinned + BDFDB.disCNS._pindmsdmchannelplaceholder + BDFDB.disCN.namecontainernamecontainer, - children: BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCN.namecontainerlayout - }) - }) - ].filter(n => n); - } - } - }}, {force: true, noCache: true}); - } - } - - processUnreadDMs (e) { - e.instance.props.pinnedPrivateChannelIds = []; - let sortedRecents = this.sortAndUpdate("pinnedRecents"); - if (sortedRecents.length) { - e.instance.props.unreadPrivateChannelIds = []; - for (let pos in sortedRecents) { - let id = sortedRecents[pos]; - if (e.instance.props.channels[id]) { - if (!e.instance.props.pinnedPrivateChannelIds.includes(id)) e.instance.props.pinnedPrivateChannelIds.push(id); - if (!e.instance.props.unreadPrivateChannelIds.includes(id)) e.instance.props.unreadPrivateChannelIds.push(id); - } - } - e.instance.props.unreadPrivateChannelIds = e.instance.props.unreadPrivateChannelIds.concat(BDFDB.LibraryModules.DirectMessageUnreadStore.getUnreadPrivateChannelIds()); - if (e.returnvalue) { - if (draggedChannel && releasedChannel) { - let pinnedPrivateChannelIds = [].concat(e.instance.props.pinnedPrivateChannelIds), newData = {}; - BDFDB.ArrayUtils.remove(pinnedPrivateChannelIds, draggedChannel, true); - pinnedPrivateChannelIds.splice(pinnedPrivateChannelIds.indexOf(releasedChannel) + 1, 0, draggedChannel); - for (let pos in pinnedPrivateChannelIds) newData[pinnedPrivateChannelIds[pos]] = parseInt(pos); - BDFDB.DataUtils.save(newData, this, "pinnedRecents"); - draggedChannel = null; - releasedChannel = null; - BDFDB.ReactUtils.forceUpdate(e.instance); - } - if (draggedChannel) { - let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {filter: child => BDFDB.ObjectUtils.get(child, "props.channel.id") == draggedChannel}); - children.splice(index, 1); - } - if (this.hoveredChannel) { - let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {filter: child => BDFDB.ObjectUtils.get(child, "props.channel.id") == this.hoveredChannel}); - children.splice(index + 1, 0, BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCNS.guildouter + BDFDB.disCN._pindmsrecentplaceholder, - children: BDFDB.ReactUtils.createElement("div", { - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.GuildComponents.Items.DragPlaceholder, {}) - }) - })); - } - } - } - else e.instance.props.unreadPrivateChannelIds = BDFDB.LibraryModules.DirectMessageUnreadStore.getUnreadPrivateChannelIds(); - } - - processPrivateChannel (e) { - if (e.instance.props.channel) { - let category = this.getCategory(e.instance.props.channel.id, "dmCategories"); - if (category) { - if (e.node) { - BDFDB.DOMUtils.addClass(e.node, BDFDB.disCN._pindmsdmchannelpinned); - e.node.removeEventListener("mousedown", e.node.PinDMsMouseDownListener); - if (!settings.sortInRecentOrder) { - e.node.setAttribute("draggable", false); - e.node.PinDMsMouseDownListener = event => { - if (!BDFDB.BDUtils.isPluginEnabled("PinDMs")) e.node.removeEventListener("mousedown", e.node.PinDMsMouseDownListener); - else { - event = event.nativeEvent || event; - let mousemove = event2 => { - if (Math.sqrt((event.pageX - event2.pageX)**2) > 20 || Math.sqrt((event.pageY - event2.pageY)**2) > 20) { - BDFDB.ListenerUtils.stopEvent(event); - draggedChannel = e.instance.props.channel.id; - this.updateContainer("dmCategories"); - let dragPreview = this.createDragPreview(e.node, event2); - document.removeEventListener("mousemove", mousemove); - document.removeEventListener("mouseup", mouseup); - let dragging = event3 => { - this.updateDragPreview(dragPreview, event3); - let maybeHoveredChannel = null; - let categoryNode = BDFDB.DOMUtils.getParent(BDFDB.dotCN._pindmspinnedchannelsheadercontainer, event3.target); - if (categoryNode) { - let hoveredCategoryId = categoryNode.getAttribute("categoryid"); - if (hoveredCategoryId && hoveredCategoryId == category.id) maybeHoveredChannel = "header_" + category.id; - } - else { - let placeholder = BDFDB.DOMUtils.getParent(BDFDB.dotCN._pindmsdmchannelplaceholder, event3.target); - maybeHoveredChannel = (BDFDB.ReactUtils.findValue(BDFDB.DOMUtils.getParent(BDFDB.dotCN._pindmsdmchannelpinned, placeholder ? placeholder.previousSibling : event3.target), "channel", {up: true}) || {}).id; - let maybeHoveredCategory = maybeHoveredChannel && this.getCategory(maybeHoveredChannel, "dmCategories"); - if (!maybeHoveredCategory || maybeHoveredCategory.id != category.id) maybeHoveredChannel = null; - }; - let update = maybeHoveredChannel != hoveredChannel; - if (maybeHoveredChannel) hoveredChannel = maybeHoveredChannel; - else hoveredChannel = null; - if (update) this.updateContainer("dmCategories"); - }; - let releasing = event3 => { - BDFDB.DOMUtils.remove(dragPreview); - if (hoveredChannel) releasedChannel = hoveredChannel; - else draggedChannel = null; - hoveredChannel = null; - this.updateContainer("dmCategories"); - document.removeEventListener("mousemove", dragging); - document.removeEventListener("mouseup", releasing); - }; - document.addEventListener("mousemove", dragging); - document.addEventListener("mouseup", releasing); - } - }; - let mouseup = _ => { - document.removeEventListener("mousemove", mousemove); - document.removeEventListener("mouseup", mouseup); - }; - document.addEventListener("mousemove", mousemove); - document.addEventListener("mouseup", mouseup); - } - }; - e.node.addEventListener("mousedown", e.node.PinDMsMouseDownListener); - } - } - if (e.returnvalue) e.returnvalue.props.children = [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - text: BDFDB.LanguageUtils.LanguageStrings.UNPIN, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Clickable, { - className: BDFDB.disCN._pindmsunpinbutton, - onClick: event => { - BDFDB.ListenerUtils.stopEvent(event); - this.removeFromCategory(e.instance.props.channel.id, category, "dmCategories"); - }, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, { - className: BDFDB.disCN._pindmsunpinicon, - name: BDFDB.LibraryComponents.SvgIcon.Names.PIN - }) - }) - }), - e.returnvalue.props.children - ].flat(10).filter(n => n); - } - } - } - - processDirectMessage (e) { - if (e.instance.props.channel) { - if (e.node && e.methodname == "componentDidMount") { - BDFDB.DOMUtils.removeClass(e.node, BDFDB.disCN._pindmsrecentpinned); - e.node.removeEventListener("contextmenu", e.node.PinDMsContextMenuListener); - e.node.PinDMsContextMenuListener = event => {BDFDB.DMUtils.openMenu(e.instance.props.channel.id, event);}; - e.node.addEventListener("contextmenu", e.node.PinDMsContextMenuListener); - if (this.isPinned(e.instance.props.channel.id, "pinnedRecents")) { - BDFDB.DOMUtils.addClass(e.node, BDFDB.disCN._pindmsrecentpinned); - e.node.removeEventListener("mousedown", e.node.PinDMsMouseDownListener); - if (!settings.sortInRecentOrderGuild) { - for (let child of e.node.querySelectorAll("a")) child.setAttribute("draggable", false); - e.node.PinDMsMouseDownListener = event => { - let mousemove = event2 => { - if (Math.sqrt((event.pageX - event2.pageX)**2) > 20 || Math.sqrt((event.pageY - event2.pageY)**2) > 20) { - BDFDB.ListenerUtils.stopEvent(event); - draggedChannel = e.instance.props.channel.id; - BDFDB.PatchUtils.forceAllUpdates(this, "UnreadDMs"); - let dragPreview = this.createDragPreview(e.node, event2); - document.removeEventListener("mousemove", mousemove); - document.removeEventListener("mouseup", mouseup); - let dragging = event3 => { - this.updateDragPreview(dragPreview, event3); - let placeholder = BDFDB.DOMUtils.getParent(BDFDB.dotCN._pindmsrecentplaceholder, event3.target); - let maybeHoveredChannel = (BDFDB.ReactUtils.findValue(BDFDB.DOMUtils.getParent(BDFDB.dotCN._pindmsrecentpinned, placeholder ? placeholder.previousSibling : event3.target), "channel", {up: true}) || {}).id; - let update = maybeHoveredChannel != hoveredChannel; - if (maybeHoveredChannel) hoveredChannel = maybeHoveredChannel; - else hoveredChannel = null; - if (update) BDFDB.PatchUtils.forceAllUpdates(this, "UnreadDMs"); - }; - let releasing = event3 => { - BDFDB.DOMUtils.remove(dragPreview); - if (hoveredChannel) releasedChannel = hoveredChannel; - else draggedChannel = null; - hoveredChannel = null; - BDFDB.PatchUtils.forceAllUpdates(this, "UnreadDMs"); - document.removeEventListener("mousemove", dragging); - document.removeEventListener("mouseup", releasing); - }; - document.addEventListener("mousemove", dragging); - document.addEventListener("mouseup", releasing); - } - }; - let mouseup = _ => { - document.removeEventListener("mousemove", mousemove); - document.removeEventListener("mouseup", mouseup); - }; - document.addEventListener("mousemove", mousemove); - document.addEventListener("mouseup", mouseup); - }; - e.node.addEventListener("mousedown", e.node.PinDMsMouseDownListener); - } - } - } - if (e.node && e.methodname == "componentWillUnmount") { - BDFDB.PatchUtils.forceAllUpdates(this, "PrivateChannelsList"); - } - if (e.returnvalue && this.isPinned(e.instance.props.channel.id, "pinnedRecents") && settings.showPinIcon) { - let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name:"BlobMask"}); - if (index > -1) children[index].props.upperLeftBadge = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Badges.IconBadge, { - className: BDFDB.disCN.guildiconbadge, - disableColor: true, - style: {transform: "scale(-1, 1)"}, - icon: BDFDB.LibraryComponents.SvgIcon.Names.NOVA_PIN - }); - } - } - } - - generateID (type) { - if (!type) return null; - let categories = BDFDB.DataUtils.load(this, type); - let id = Math.round(Math.random() * 10000000000000000); - return categories[id] ? this.generateID() : id; - } - - filterDMs (dms) { - return dms.filter(id => BDFDB.LibraryModules.ChannelStore.getChannel(id)); - } - - addToCategory (id, category, type) { - if (!id || !category || !type) return; - let wasEmpty = !this.filterDMs(category.dms).length; - if (!category.dms.includes(id)) category.dms.unshift(id); - if (wasEmpty && category.dms.length) category.collapsed = false; - BDFDB.DataUtils.save(category, this, type, category.id); - this.updateContainer(type); - } - - removeFromCategory (id, category, type) { - if (!id || !category || !type) return; - BDFDB.ArrayUtils.remove(category.dms, id, true); - if (!this.filterDMs(category.dms).length) category.collapsed = true; - BDFDB.DataUtils.save(category, this, type, category.id); - this.updateContainer(type); - } - - getCategory (id, type) { - if (!id || !type) return null; - let categories = BDFDB.DataUtils.load(this, type); - for (let catId in categories) if (categories[catId].dms.includes(id)) return categories[catId]; - return null; - } - - sortAndUpdateCategories (type, reverse) { - let data = BDFDB.ObjectUtils.sort(BDFDB.DataUtils.load(this, type), "pos"), newData = {}; - let sorted = [], pos = 0, sort = id => { - if (sorted[pos] === undefined) { - newData[id] = Object.assign({}, data[id], {pos}); - sorted[pos] = newData[id]; - } - else { - pos++; - sort(id); - } - }; - for (let id in data) sort(id); - if (!BDFDB.equals(data, newData)) BDFDB.DataUtils.save(newData, this, type); - return (reverse ? sorted.reverse() : sorted).filter(n => n); - } - - sortDMsByTime (dms, type) { - if (dms.length > 1 && settings[type == "dmCategories" ? "sortInRecentOrder" : "sortInRecentOrderGuild"]) { - let timestamps = BDFDB.LibraryModules.DirectMessageStore.getPrivateChannelIds().reduce((newObj, channelId) => (newObj[channelId] = BDFDB.LibraryModules.UnreadChannelUtils.lastMessageId(channelId), newObj), {}); - return [].concat(dms).sort(function (x, y) {return timestamps[x] > timestamps[y] ? -1 : timestamps[x] < timestamps[y] ? 1 : 0;}); - } - else return dms; - } - - openCategorySettingsModal (data, type, isNew) { - if (BDFDB.ObjectUtils.is(data) && type) BDFDB.ModalUtils.open(this, { - size: "MEDIUM", - header: BDFDB.LanguageUtils.LanguageStrings.CATEGORY_SETTINGS, - subheader: data.name, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: BDFDB.LanguageUtils.LanguageStrings.CATEGORY_NAME, - className: BDFDB.disCN.marginbottom20 + " input-categoryname", - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { - value: data.name, - placeholder: data.name, - autoFocus: true - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormDivider, { - className: BDFDB.disCN.dividerdefault - }) - ] - }), - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { - title: this.labels.modal_colorpicker1_text, - className: BDFDB.disCN.marginbottom20, - children: [ - BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { - color: data.color, - number: 1 - }) - ] - }) - ], - buttons: [{ - contents: isNew ? BDFDB.LanguageUtils.LanguageStrings.CREATE : BDFDB.LanguageUtils.LanguageStrings.SAVE, - color: "BRAND", - close: true, - click: modal => { - data.name = modal.querySelector(".input-categoryname " + BDFDB.dotCN.input).value.trim() || data.name; - - data.color = BDFDB.ColorUtils.getSwatchColor(modal, 1); - if (data.color != null && !BDFDB.ObjectUtils.is(data.color)) { - if (data.color[0] < 30 && data.color[1] < 30 && data.color[2] < 30) data.color = BDFDB.ColorUtils.change(data.color, 30); - else if (data.color[0] > 225 && data.color[1] > 225 && data.color[2] > 225) data.color = BDFDB.ColorUtils.change(data.color, -30); - } - - BDFDB.DataUtils.save(data, this, type, data.id); - - this.updateContainer(type); - } - }] - }); - } - - addPin (newid, type) { - if (!newid) return; - let pinnedDMs = BDFDB.DataUtils.load(this, type); - for (let id in pinnedDMs) pinnedDMs[id] = pinnedDMs[id] + 1; - pinnedDMs[newid] = 0; - BDFDB.DataUtils.save(pinnedDMs, this, type); - this.updateContainer(type); - } - - removePin (id, type) { - if (!id) return; - BDFDB.DataUtils.remove(this, type, id); - this.updateContainer(type); - } - - isPinned (id, type) { - return BDFDB.DataUtils.load(this, type, id) != undefined; - } - - updateContainer (type) { - switch (type) { - case "dmCategories": - BDFDB.PatchUtils.forceAllUpdates(this, "PrivateChannelsList"); - break; - case "pinnedRecents": - BDFDB.PatchUtils.forceAllUpdates(this, "UnreadDMs"); - break; - } - } - - sortAndUpdate (type) { - let data = BDFDB.DataUtils.load(this, type), newData = {}; - delete data[""]; - delete data["null"]; - let sortedDMs = [], existingDMs = [], sortDM = (id, pos) => { - if (sortedDMs[pos] === undefined) sortedDMs[pos] = id; - else sortDM(id, pos + 1); - }; - for (let id in data) sortDM(id, data[id]); - sortedDMs = sortedDMs.filter(n => n); - for (let pos in sortedDMs) { - newData[sortedDMs[pos]] = parseInt(pos); - if (BDFDB.LibraryModules.ChannelStore.getChannel(sortedDMs[pos])) existingDMs.push(sortedDMs[pos]); - } - if (!BDFDB.equals(data, newData)) BDFDB.DataUtils.save(newData, this, type); - return this.sortDMsByTime(existingDMs, type); - } - - createDragPreview (div, event) { - if (!Node.prototype.isPrototypeOf(div)) return; - let dragPreview = div.cloneNode(true); - BDFDB.DOMUtils.addClass(dragPreview, BDFDB.disCN._pindmsdragpreview); - BDFDB.DOMUtils.remove(dragPreview.querySelector(BDFDB.dotCNC.guildlowerbadge + BDFDB.dotCNC.guildupperbadge + BDFDB.dotCN.guildpillwrapper)); - document.querySelector(BDFDB.dotCN.appmount).appendChild(dragPreview); - let rects = BDFDB.DOMUtils.getRects(dragPreview); - BDFDB.DOMUtils.hide(dragPreview); - dragPreview.style.setProperty("pointer-events", "none", "important"); - dragPreview.style.setProperty("left", event.clientX - (rects.width/2) + "px", "important"); - dragPreview.style.setProperty("top", event.clientY - (rects.height/2) + "px", "important"); - return dragPreview; - } - - updateDragPreview (dragPreview, event) { - if (!Node.prototype.isPrototypeOf(dragPreview)) return; - BDFDB.DOMUtils.show(dragPreview); - let rects = BDFDB.DOMUtils.getRects(dragPreview); - dragPreview.style.setProperty("left", event.clientX - (rects.width/2) + "px", "important"); - dragPreview.style.setProperty("top", event.clientY - (rects.height/2) + "px", "important"); - } - - setLabelsByLanguage () { - switch (BDFDB.LanguageUtils.getLanguage().id) { - case "hr": //croatian - return { - context_pindm_text: "Prikljucite Izravnu Poruku", - context_pinchannel_text: "Priložite popisu kanala", - context_unpinchannel_text: "Ukloni s popisa kanala", - context_addtonewcategory_text: "Dodavanje u novu kategoriju", - context_pinguild_text: "Priložite popisu poslužitelja", - context_unpinguild_text: "Ukloni s popisa poslužitelja", - header_pinneddms_text: "Prikvačene Izravne Poruke", - modal_colorpicker1_text: "Boja kategorije" - }; - case "da": //danish - return { - context_pindm_text: "Fastgør PB", - context_pinchannel_text: "Vedhæft til kanalliste", - context_unpinchannel_text: "Fjern fra kanalliste", - context_addtonewcategory_text: "Føj til ny kategori", - context_pinguild_text: "Vedhæft til serverliste", - context_unpinguild_text: "Fjern fra serverliste", - header_pinneddms_text: "Pinned Privat Beskeder", - modal_colorpicker1_text: "Kategori farve" - }; - case "de": //german - return { - context_pindm_text: "Direktnachricht anheften", - context_pinchannel_text: "An Kanalliste anheften", - context_unpinchannel_text: "Von Kanalliste loslösen", - context_addtonewcategory_text: "Zur neuen Kategorie hinzufügen", - context_pinguild_text: "An Serverliste anheften", - context_unpinguild_text: "Von Serverliste loslösen", - header_pinneddms_text: "Gepinnte Direktnachrichten", - modal_colorpicker1_text: "Kategoriefarbe" - }; - case "es": //spanish - return { - context_pindm_text: "Anclar MD", - context_pinchannel_text: "Adjuntar a la lista de canales", - context_unpinchannel_text: "Deshazte de la lista de canales", - context_addtonewcategory_text: "Agregar a nueva categoría", - context_pinguild_text: "Adjuntar a la lista de servidores", - context_unpinguild_text: "Deshazte de la lista de servidores", - header_pinneddms_text: "Mensajes Directos Fijados", - modal_colorpicker1_text: "Color de la categoría" - }; - case "fr": //french - return { - context_pindm_text: "Épingler MP", - context_pinchannel_text: "Épingler à la liste des salons", - context_unpinchannel_text: "Détacher de la liste des salons", - context_addtonewcategory_text: "Ajouter à une nouvelle catégorie", - context_pinguild_text: "Épingler à la liste de serveurs", - context_unpinguild_text: "Détacher de la liste de serveurs", - header_pinneddms_text: "Messages Prives Épinglés", - modal_colorpicker1_text: "Couleur de la catégorie" - }; - case "it": //italian - return { - context_pindm_text: "Fissa il messaggio diretto", - context_pinchannel_text: "Allega alla lista dei canali", - context_unpinchannel_text: "Rimuovi dalla lista dei canali", - context_addtonewcategory_text: "Aggiungi a nuova categoria", - context_pinguild_text: "Allega alla lista dei server", - context_unpinguild_text: "Rimuovi dalla lista dei server", - header_pinneddms_text: "Messaggi Diretti Aggiunti", - modal_colorpicker1_text: "Colore della categoria" - }; - case "nl": //dutch - return { - context_pindm_text: "PB pinnen", - context_pinchannel_text: "Pin naar de kanalenlijst", - context_unpinchannel_text: "Losmaken van kanalenlijst", - context_addtonewcategory_text: "Toevoegen aan nieuwe categorie", - context_pinguild_text: "Pin naar de serverlijst", - context_unpinguild_text: "Losmaken van serverlijst", - header_pinneddms_text: "Vastgezette Persoonluke Berichten", - modal_colorpicker1_text: "Categorie kleur" - }; - case "no": //norwegian - return { - context_pindm_text: "Fest DM", - context_pinchannel_text: "Fest på kanalliste", - context_unpinchannel_text: "Fjern fra kanalliste", - context_addtonewcategory_text: "Legg til i ny kategori", - context_pinguild_text: "Fest på serverliste", - context_unpinguild_text: "Fjern fra serverlisten", - header_pinneddms_text: "Pinned Direktemeldinger", - modal_colorpicker1_text: "Kategorifarge" - }; - case "pl": //polish - return { - context_pindm_text: "Przypnij PW", - context_pinchannel_text: "Dołącz do listy kanałów", - context_unpinchannel_text: "Usuń z listy kanałów", - context_addtonewcategory_text: "Dodaj do nowej kategorii", - context_pinguild_text: "Dołącz do listy serwerów", - context_unpinguild_text: "Usuń z listy serwerów", - header_pinneddms_text: "Prywatne Wiadomości Bezpośrednie", - modal_colorpicker1_text: "Kolor kategorii" - }; - case "pt-BR": //portuguese (brazil) - return { - context_pindm_text: "Fixar MD", - context_pinchannel_text: "Anexar à lista de canais", - context_unpinchannel_text: "Remover da lista de canais", - context_addtonewcategory_text: "Adicionar à nova categoria", - context_pinguild_text: "Anexar à lista de servidores", - context_unpinguild_text: "Remover da lista de servidores", - header_pinneddms_text: "Mensagens diretas fixadas", - modal_colorpicker1_text: "Cor da categoria" - }; - case "fi": //finnish - return { - context_pindm_text: "Kiinnitä yksityisviestit", - context_pinchannel_text: "Liitä kanavaluetteloon", - context_unpinchannel_text: "Poista kanavaluettelosta", - context_addtonewcategory_text: "Lisää uuteen luokkaan", - context_pinguild_text: "Liitä palvelinluetteloon", - context_unpinguild_text: "Poista palvelinluettelosta", - header_pinneddms_text: "Liitetyt yksityisviestit", - modal_colorpicker1_text: "Luokan väri" - }; - case "sv": //swedish - return { - context_pindm_text: "Fäst DM", - context_pinchannel_text: "Fäst till kanallista", - context_unpinchannel_text: "Ta bort från kanallistan", - context_addtonewcategory_text: "Lägg till i ny kategori", - context_pinguild_text: "Fäst till servernlista", - context_unpinguild_text: "Ta bort från servernlista", - header_pinneddms_text: "Inlagda Direktmeddelanden", - modal_colorpicker1_text: "Kategori färg" - }; - case "tr": //turkish - return { - context_pindm_text: "DM'yi Sabitle", - context_pinchannel_text: "Kanal listesine ekle", - context_unpinchannel_text: "Kanal listesinden kaldır", - context_addtonewcategory_text: "Yeni kategoriye ekle", - context_pinguild_text: "Sunucu listesine ekle", - context_unpinguild_text: "Sunucu listesinden kaldır", - header_pinneddms_text: "Direkt Mesajlar Sabitleyin", - modal_colorpicker1_text: "Kategori rengi" - }; - case "cs": //czech - return { - context_pindm_text: "Připnout PZ", - context_pinchannel_text: "Připojení k seznamu kanálů", - context_unpinchannel_text: "Odstranit ze seznamu kanálů", - context_addtonewcategory_text: "Přidat do nové kategorie", - context_pinguild_text: "Připojit ke seznamu serverů", - context_unpinguild_text: "Odstranit ze seznamu serverů", - header_pinneddms_text: "Připojené Přímá Zpráva", - modal_colorpicker1_text: "Barva kategorie" - }; - case "bg": //bulgarian - return { - context_pindm_text: "Закачени ДС", - context_pinchannel_text: "Прикачете към списъка с канали", - context_unpinchannel_text: "Премахване от списъка с канали", - context_addtonewcategory_text: "Добавяне към нова категория", - context_pinguild_text: "Прикачване към списъка със сървъри", - context_unpinguild_text: "Премахване от списъка със сървъри", - header_pinneddms_text: "Свързани директни съобщения", - modal_colorpicker1_text: "Цвят на категорията" - }; - case "ru": //russian - return { - context_pindm_text: "Закрепить ЛС", - context_pinchannel_text: "Прикрепить к списку каналов", - context_unpinchannel_text: "Удалить из списка каналов", - context_addtonewcategory_text: "Добавить в новую категорию", - context_pinguild_text: "Присоединить к списку серверов", - context_unpinguild_text: "Удалить из списка серверов", - header_pinneddms_text: "Прикрепленные Личные Сообщения", - modal_colorpicker1_text: "Цвет категории" - }; - case "uk": //ukrainian - return { - context_pindm_text: "Закріпити ОП", - context_pinchannel_text: "Додайте до списку каналів", - context_unpinchannel_text: "Видалити зі списку каналів", - context_addtonewcategory_text: "Додати до нової категорії", - context_pinguild_text: "Додайте до списку серверів", - context_unpinguild_text: "Видалити зі списку серверів", - header_pinneddms_text: "Прикріплені oсобисті повідомлення", - modal_colorpicker1_text: "Колір категорії" - }; - case "ja": //japanese - return { - context_pindm_text: "DMピン", - context_pinchannel_text: "チャンネルリストに添付", - context_unpinchannel_text: "チャンネルリストから削除", - context_addtonewcategory_text: "新しいカテゴリに追加", - context_pinguild_text: "サーバーリストに添付", - context_unpinguild_text: "サーバーリストから削除", - header_pinneddms_text: "固定された直接メッセージ", - modal_colorpicker1_text: "カテゴリーの色" - }; - case "zh-TW": //chinese (traditional) - return { - context_pindm_text: "引腳直接留言", - context_pinchannel_text: "附加到頻道列表", - context_unpinchannel_text: "從頻道列表中刪除", - context_addtonewcategory_text: "添加到新類別", - context_pinguild_text: "附加到服務器列表", - context_unpinguild_text: "從服務器列表中刪除", - header_pinneddms_text: "固定私人信息", - modal_colorpicker1_text: "類別顏色" - }; - case "ko": //korean - return { - context_pindm_text: "비공개 메시지 고정", - context_pinchannel_text: "채널 목록에 첨부", - context_unpinchannel_text: "채널 목록에서 삭제", - context_addtonewcategory_text: "새 카테고리에 추가", - context_pinguild_text: "서버 목록에 첨부", - context_unpinguild_text: "서버 목록에서 제거", - header_pinneddms_text: "고정 된 비공개 메시지", - modal_colorpicker1_text: "카테고리 색상" - }; - default: //default: english - return { - context_pindm_text: "Pin DM", - context_pinchannel_text: "Pin to Channellist", - context_unpinchannel_text: "Unpin from Channellist", - context_addtonewcategory_text: "Add to new Category", - context_pinguild_text: "Pin to Serverlist", - context_unpinguild_text: "Unpin from Serverlist", - header_pinneddms_text: "Pinned Direct Messages", - modal_colorpicker1_text: "Categorycolor" - }; - } - } - }; - })(window.BDFDB_Global.PluginUtils.buildPlugin(config)); -})();
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/QuickMention.plugin.js b/.config/BetterDiscord/plugins/QuickMention.plugin.js deleted file mode 100644 index 7cbb694..0000000 --- a/.config/BetterDiscord/plugins/QuickMention.plugin.js +++ /dev/null @@ -1,67 +0,0 @@ -//META{"name":"QuickMention","authorId":"278543574059057154","invite":"Jx3TjNS","donate":"https://www.paypal.me/MircoWittrien","patreon":"https://www.patreon.com/MircoWittrien","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/QuickMention","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/QuickMention/QuickMention.plugin.js"}*// - -module.exports = (_ => { - const config = { - "info": { - "name": "QuickMention", - "author": "DevilBro", - "version": "1.0.2", - "description": "Adds a mention entry to the message option toolbar." - } - }; - return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { - getName () {return config.info.name;} - getAuthor () {return config.info.author;} - getVersion () {return config.info.version;} - getDescription () {return config.info.description;} - - load() { - if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue:[]}); - if (!window.BDFDB_Global.downloadModal) { - window.BDFDB_Global.downloadModal = true; - BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click "Download Now" to install it.`, { - confirmText: "Download Now", - cancelText: "Cancel", - onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, - onConfirm: _ => { - delete window.BDFDB_Global.downloadModal; - require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (e, r, b) => { - if (!e && b && b.indexOf(`//META{"name":"`) > -1) require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), b, _ => {}); - else BdApi.alert("Error", "Could not download BDFDB library plugin, try again some time later."); - }); - } - }); - } - if (!window.BDFDB_Global.pluginQueue.includes(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name); - } - start() {} - stop() {} - } : (([Plugin, BDFDB]) => { - return class QuickMention extends Plugin { - onLoad() {} - - onStart() {} - - onStop() {} - - onMessageOptionToolbar (e) { - if (!e.instance.props.expanded && e.instance.props.message.author.id != BDFDB.UserUtils.me.id && (BDFDB.UserUtils.can("SEND_MESSAGES") || e.instance.props.channel.type == BDFDB.DiscordConstants.ChannelTypes.DM || e.instance.props.channel.type == BDFDB.DiscordConstants.ChannelTypes.GROUP_DM)) e.returnvalue.props.children.unshift(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - key: "mention", - text: BDFDB.LanguageUtils.LanguageStrings.MENTION, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Clickable, { - className: BDFDB.disCN.messagetoolbarbutton, - onClick: _ => { - BDFDB.LibraryModules.DispatchUtils.ComponentDispatch.dispatchToLastSubscribed(BDFDB.DiscordConstants.ComponentActions.INSERT_TEXT, { - content: `<@!${e.instance.props.message.author.id}>` - }); - }, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, { - className: BDFDB.disCN.messagetoolbaricon, - name: BDFDB.LibraryComponents.SvgIcon.Names.NOVA_AT - }) - }) - })); - } - }; - })(window.BDFDB_Global.PluginUtils.buildPlugin(config)); -})();
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/RemoveNicknames.config.json b/.config/BetterDiscord/plugins/RemoveNicknames.config.json deleted file mode 100644 index 1818ecb..0000000 --- a/.config/BetterDiscord/plugins/RemoveNicknames.config.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "changelog": { - "currentversion": "1.3.0" - }, - "settings": { - "addNickname": false, - "changeInAutoComplete": true, - "changeInChatWindow": true, - "changeInMemberList": true, - "changeInMentions": true, - "changeInTyping": true, - "changeInVoiceChat": true, - "replaceBots": true, - "replaceOwn": false, - "swapPositions": false - } -}
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/RemoveNicknames.plugin.js b/.config/BetterDiscord/plugins/RemoveNicknames.plugin.js deleted file mode 100644 index 7d05528..0000000 --- a/.config/BetterDiscord/plugins/RemoveNicknames.plugin.js +++ /dev/null @@ -1,189 +0,0 @@ -//META{"name":"RemoveNicknames","authorId":"278543574059057154","invite":"Jx3TjNS","donate":"https://www.paypal.me/MircoWittrien","patreon":"https://www.patreon.com/MircoWittrien","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/RemoveNicknames","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/RemoveNicknames/RemoveNicknames.plugin.js"}*// - -module.exports = (_ => { - const config = { - "info": { - "name": "RemoveNicknames", - "author": "DevilBro", - "version": "1.3.2", - "description": "Replace all nicknames with the actual accountnames." - }, - "changeLog": { - "fixed": { - "Mentions": "Now also works for mentions inside quotes" - } - } - }; - return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { - getName () {return config.info.name;} - getAuthor () {return config.info.author;} - getVersion () {return config.info.version;} - getDescription () {return config.info.description;} - - load() { - if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue:[]}); - if (!window.BDFDB_Global.downloadModal) { - window.BDFDB_Global.downloadModal = true; - BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click "Download Now" to install it.`, { - confirmText: "Download Now", - cancelText: "Cancel", - onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, - onConfirm: _ => { - delete window.BDFDB_Global.downloadModal; - require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (e, r, b) => { - if (!e && b && b.indexOf(`//META{"name":"`) > -1) require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), b, _ => {}); - else BdApi.alert("Error", "Could not download BDFDB library plugin, try again some time later."); - }); - } - }); - } - if (!window.BDFDB_Global.pluginQueue.includes(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name); - } - start() {this.load();} - stop() {} - } : (([Plugin, BDFDB]) => { - var settings = {}; - - return class RemoveNicknames extends Plugin { - onLoad() { - this.defaults = { - settings: { - replaceOwn: {value:false, inner:false, description:"Replace your own name:"}, - replaceBots: {value:true, inner:false, description:"Replace the nickname of bots:"}, - addNickname: {value:false, inner:false, description:"Add nickname as parentheses:"}, - swapPositions: {value:false, inner:false, description:"Swap the position of username and nickname:"}, - changeInChatWindow: {value:true, inner:true, description:"Messages"}, - changeInMentions: {value:true, inner:true, description:"Mentions"}, - changeInVoiceChat: {value:true, inner:true, description:"Voice Channels"}, - changeInMemberList: {value:true, inner:true, description:"Member List"}, - changeInTyping: {value:true, inner:true, description:"Typing List"}, - changeInAutoComplete: {value:true, inner:true, description:"Autocomplete Menu"} - } - }; - - this.patchedModules = { - before: { - AutocompleteUserResult: "render", - VoiceUser: "render", - MemberListItem: "render", - Message: "default", - MessageContent: "type", - }, - after: { - TypingUsers: "render", - Mention: "default" - } - }; - } - - onStart() { - this.forceUpdateAll(); - } - - onStop() { - this.forceUpdateAll(); - } - - getSettingsPanel (collapseStates = {}) { - let settingsPanel, settingsItems = [], innerItems = []; - - for (let key in settings) (!this.defaults.settings[key].inner ? settingsItems : innerItems).push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { - type: "Switch", - plugin: this, - keys: ["settings", key], - label: this.defaults.settings[key].description, - value: settings[key] - })); - settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsPanelInner, { - title: "Remove Nicknames in:", - first: settingsItems.length == 0, - last: true, - children: innerItems - })); - - return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, settingsItems); - } - - onSettingsClosed (e) { - if (this.SettingsUpdated) { - delete this.SettingsUpdated; - this.forceUpdateAll(); - } - } - - forceUpdateAll () { - settings = BDFDB.DataUtils.get(this, "settings"); - - BDFDB.PatchUtils.forceAllUpdates(this); - BDFDB.MessageUtils.rerenderAll(); - } - - processAutocompleteUserResult (e) { - if (e.instance.props.user && e.instance.props.nick && settings.changeInAutoComplete) { - let newName = this.getNewName(e.instance.props.user); - if (newName) e.instance.props.nick = newName; - } - } - - processVoiceUser (e) { - if (e.instance.props.user && e.instance.props.nick && settings.changeInVoiceChat) { - let newName = this.getNewName(e.instance.props.user); - if (newName) e.instance.props.nick = newName; - } - } - - processMemberListItem (e) { - if (e.instance.props.user && e.instance.props.nick && settings.changeInMemberList) { - let newName = this.getNewName(e.instance.props.user); - if (newName) e.instance.props.nick = newName; - } - } - - processTypingUsers (e) { - if (BDFDB.ObjectUtils.is(e.instance.props.typingUsers) && Object.keys(e.instance.props.typingUsers).length && settings.changeInTyping) { - let users = Object.keys(e.instance.props.typingUsers).filter(id => id != BDFDB.UserUtils.me.id).filter(id => !BDFDB.LibraryModules.FriendUtils.isBlocked(id)).map(id => BDFDB.LibraryModules.UserStore.getUser(id)).filter(user => user); - if (users.length) { - let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {props: [["className", BDFDB.disCN.typingtext]]}); - if (index > -1 && BDFDB.ArrayUtils.is(children[index].props.children)) for (let child of children[index].props.children) if (child.type == "strong") { - let newName = this.getNewName(users.shift()); - if (newName) BDFDB.ReactUtils.setChild(child, newName); - } - } - } - } - - processMessage (e) { - let header = e.instance.props.childrenHeader; - if (header && header.props && header.props.message && header.props.message.nick) { - let newName = this.getNewName(header.props.message.author); - if (newName) header.props.message = new BDFDB.DiscordObjects.Message(Object.assign({}, header.props.message, {nick: newName})); - } - } - - processMessageContent (e) { - if (e.instance.props.message.type != BDFDB.DiscordConstants.MessageTypes.DEFAULT && e.instance.props.message.nick && settings.changeInChatWindow) { - let newName = this.getNewName(e.instance.props.message.author); - if (newName) { - e.instance.props.message = new BDFDB.DiscordObjects.Message(Object.assign({}, e.instance.props.message, {nick: newName})); - e.instance.props.children.props.message = e.instance.props.message; - } - } - } - - processMention (e) { - if (e.instance.props.userId && settings.changeInMentions) { - let newName = this.getNewName(BDFDB.LibraryModules.UserStore.getUser(e.instance.props.userId)); - if (newName) e.returnvalue.props.children[0] = "@" + newName; - } - } - - getNewName (user, wrapper) { - if (!user) return null; - let member = BDFDB.LibraryModules.MemberStore.getMember(BDFDB.LibraryModules.LastGuildStore.getGuildId(), user.id) || {}; - if (!member.nick || user.id == BDFDB.UserUtils.me.id && !settings.replaceOwn || user.bot && !settings.replaceBots) return null; - let username = (BDFDB.BDUtils.isPluginEnabled("EditUsers") && BDFDB.DataUtils.load("EditUsers", "users", user.id) || {}).name || user.username; - return settings.addNickname ? (settings.swapPositions ? (member.nick + " (" + username + ")") : (username + " (" + member.nick + ")")) : username; - } - }; - })(window.BDFDB_Global.PluginUtils.buildPlugin(config)); -})();
\ No newline at end of file diff --git a/.config/BetterDiscord/plugins/SendLargeMessages.plugin.js b/.config/BetterDiscord/plugins/SendLargeMessages.plugin.js deleted file mode 100644 index 733fd67..0000000 --- a/.config/BetterDiscord/plugins/SendLargeMessages.plugin.js +++ /dev/null @@ -1,234 +0,0 @@ -//META{"name":"SendLargeMessages","authorId":"278543574059057154","invite":"Jx3TjNS","donate":"https://www.paypal.me/MircoWittrien","patreon":"https://www.patreon.com/MircoWittrien","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/SendLargeMessages","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/SendLargeMessages/SendLargeMessages.plugin.js"}*// - -module.exports = (_ => { - const config = { - "info": { - "name": "SendLargeMessages", - "author": "DevilBro", - "version": "1.6.5", - "description": "Splits messages into several smaller messages when your message exceeds the limit." - } - }; - return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { - getName () {return config.info.name;} - getAuthor () {return config.info.author;} - getVersion () {return config.info.version;} - getDescription () {return config.info.description;} - - load() { - if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue:[]}); - if (!window.BDFDB_Global.downloadModal) { - window.BDFDB_Global.downloadModal = true; - BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click "Download Now" to install it.`, { - confirmText: "Download Now", - cancelText: "Cancel", - onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, - onConfirm: _ => {delete window.BDFDB_Global.downloadModal;require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (error, response, body) => {require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), body, _ => {});});} - }); - } - if (!window.BDFDB_Global.pluginQueue.includes(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name); - } - start() {} - stop() {} - } : (([Plugin, BDFDB]) => { - const messageDelay = 1000; //changing at own risk, might result in bans or mutes - - return class SendLargeMessages extends Plugin { - onLoad() { - this.patchedModules = { - before: { - ChannelTextAreaForm: "render", - ChannelEditorContainer: "render" - }, - after: { - ChannelTextAreaContainer: "render", - } - }; - } - - onStart() { - BDFDB.PatchUtils.forceAllUpdates(this); - } - - onStop() { - BDFDB.PatchUtils.forceAllUpdates(this); - } - - processChannelTextAreaForm (e) { - if (!BDFDB.PatchUtils.isPatched(this, e.instance, "handleSendMessage")) BDFDB.PatchUtils.patch(this, e.instance, "handleSendMessage", {instead: e2 => { - if (e2.methodArguments[0].length > BDFDB.DiscordConstants.MAX_MESSAGE_LENGTH) { - e2.stopOriginalMethodCall(); - let messages = this.formatText(e2.methodArguments[0]); - messages.filter(n => n).forEach((message, i) => { - BDFDB.TimeUtils.timeout(_ => { - e2.originalMethod(message); - if (i >= messages.length-1) BDFDB.NotificationUtils.toast(this.labels.toast_allsent_text, {type:"success"}); - }, messageDelay * i); - }); - return Promise.resolve({ - shouldClear: true, - shouldRefocus: true - }); - } - else return e2.callOriginalMethodAfterwards(); - }}, {force: true, noCache: true}); - } - - processChannelTextAreaContainer (e) { - if (e.returnvalue.ref && e.returnvalue.ref.current && BDFDB.DOMUtils.getParent(BDFDB.dotCN.chatform, e.returnvalue.ref.current)) { - let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: "SlateCharacterCount"}); - if (index > -1) { - let text = BDFDB.LibraryModules.SlateSelectionUtils.serialize(children[index].props.document, "raw"); - if (text.length > BDFDB.DiscordConstants.MAX_MESSAGE_LENGTH) children[index] = BDFDB.ReactUtils.createElement("div", { - className: BDFDB.disCNS.textareacharcounter + BDFDB.disCN.textareacharcountererror, - children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { - text: Math.ceil(text.length / BDFDB.DiscordConstants.MAX_MESSAGE_LENGTH * (39/40)) + " " + BDFDB.LanguageUtils.LanguageStrings.MESSAGES, - children: BDFDB.ReactUtils.createElement("span", { - children: BDFDB.DiscordConstants.MAX_MESSAGE_LENGTH - text.length - }) - }) - }); - } - } - } - - processChannelEditorContainer (e) { - if (e.instance.props.type && e.instance.props.type == BDFDB.DiscordConstants.TextareaTypes.NORMAL) e.instance.props.shouldUploadLongMessages = false; - } - - formatText (text) { - text = text.replace(/\t/g, " "); - let longWords = text.match(new RegExp(`[^ ]{${BDFDB.DiscordConstants.MAX_MESSAGE_LENGTH * (19/20)},}`, "gm")); - if (longWords) for (let longWord of longWords) { - let count1 = 0; - let shortWords = []; - longWord.split("").forEach(c => { - if (shortWords[count1] && (shortWords[count1].length >= BDFDB.DiscordConstants.MAX_MESSAGE_LENGTH * (19/20) || (c == "\n" && shortWords[count1].length >= BDFDB.DiscordConstants.MAX_MESSAGE_LENGTH * (19/20) - 100))) count1++; - shortWords[count1] = shortWords[count1] ? shortWords[count1] + c : c; - }); - text = text.replace(longWord, shortWords.join(" ")); - } - let messages = []; - let count2 = 0; - text.split(" ").forEach((word) => { - if (messages[count2] && (messages[count2] + "" + word).length > BDFDB.DiscordConstants.MAX_MESSAGE_LENGTH * (39/40)) count2++; - messages[count2] = messages[count2] ? messages[count2] + " " + word : word; - }); - - let insertCodeBlock = null, insertCodeLine = null; - for (let j = 0; j < messages.length; j++) { - if (insertCodeBlock) { - messages[j] = insertCodeBlock + messages[j]; - insertCodeBlock = null; - } - else if (insertCodeLine) { - messages[j] = insertCodeLine + messages[j]; - insertCodeLine = null; - } - - let codeBlocks = messages[j].match(/`{3,}[\S]*\n|`{3,}/gm); - let codeLines = messages[j].match(/[^`]{0,1}`{1,2}[^`]|[^`]`{1,2}[^`]{0,1}/gm); - - if (codeBlocks && codeBlocks.length % 2 == 1) { - messages[j] = messages[j] + "```"; - insertCodeBlock = codeBlocks[codeBlocks.length-1] + "\n"; - } - else if (codeLines && codeLines.length % 2 == 1) { - insertCodeLine = codeLines[codeLines.length-1].replace(/[^`]/g, ""); - messages[j] = messages[j] + insertCodeLine; - } - } - return messages; - } - - setLabelsByLanguage () { - switch (BDFDB.LanguageUtils.getLanguage().id) { - case "hr": //croatian - return { - toast_allsent_text: "Sve veliku poslane." - }; - case "da": //danish - return { - toast_allsent_text: "Alle beskeder sendes." - }; - case "de": //german - return { - toast_allsent_text: "Alle Nachrichten versendet." - }; - case "es": //spanish - return { - toast_allsent_text: "Todos los mensajes enviados." - }; - case "fr": //french - return { - toast_allsent_text: "Tous les messages envoyés" - }; - case "it": //italian - return { - toast_allsent_text: "Tutti i messaggi inviati." - }; - case "nl": //dutch - return { - toast_allsent_text: "Alle berichten verzonden." - }; - case "no": //norwegian - return { - toast_allsent_text: "Alle meldinger sendt." - }; - case "pl": //polish - return { - toast_allsent_text: "Wszystkie wiadomości zostały wysłane." - }; - case "pt-BR": //portuguese (brazil) - return { - toast_allsent_text: "Todas as mensagens enviadas." - }; - case "fi": //finnish - return { - toast_allsent_text: "Kaikki lähetetyt viestit." - }; - case "sv": //swedish - return { - toast_allsent_text: "Alla meddelanden skickade." - }; - case "tr": //turkish - return { - toast_allsent_text: "Tüm mesajlar gönderildi." - }; - case "cs": //czech - return { - toast_allsent_text: "Všechny zprávy byly odeslány." - }; - case "bg": //bulgarian - return { - toast_allsent_text: "Всички изпратени съобщения." - }; - case "ru": //russian - return { - toast_allsent_text: "Все отправленные сообщения." - }; - case "uk": //ukrainian - return { - toast_allsent_text: "Всі повідомлення надіслано." - }; - case "ja": //japanese - return { - toast_allsent_text: "すべてのメッセージが送信されました。" - }; - case "zh-TW": //chinese (traditional) - return { - toast_allsent_text: "發送的所有消息。" - }; - case "ko": //korean - return { - toast_allsent_text: "모든 메시지가 전송되었습니다." - }; - default: //default: english - return { - toast_allsent_text: "All messages sent." - }; - } - } - }; - })(window.BDFDB_Global.PluginUtils.buildPlugin(config)); -})();
\ No newline at end of file diff --git a/.config/BetterDiscord/themes/bliss.theme.css b/.config/BetterDiscord/themes/bliss.theme.css new file mode 100644 index 0000000..0c58aea --- /dev/null +++ b/.config/BetterDiscord/themes/bliss.theme.css @@ -0,0 +1,34 @@ +/** + * @name bliss + * @author Loekaars#8205 + * @version 1.0.0 + * @description based off co1ncidence's vim theme +*/ + +:root { + --accent: 175, 192, 247; + + --pywal-serverside: #0c0c0c; + + --pywal-bg0: #121213; + --pywal-bg1: #222222; + --pywal-bg2: #222222; + --pywal-bg3: #2d2d2d; + + --pywal-color0: #121213; + --pywal-color1: #DE9DAC; + --pywal-color2: #9DDEAF; + --pywal-color3: #DEDD9D; + --pywal-color4: #9DACDE; + --pywal-color5: #AF9DDE; + --pywal-color6: #9DCCDE; + --pywal-color7: #f4e0d8; + --pywal-color8: #393b3b; + --pywal-color9: #F7AFC0; + --pywal-color10: #AFF7C3; + --pywal-color11: #F7F6AF; + --pywal-color12: #AFC0F7; + --pywal-color13: #C3AFF7; + --pywal-color14: #AFE3F7; + --pywal-color15: #f9ece8; +} diff --git a/.config/X11/Xresources b/.config/X11/Xresources index d25fa34..4089089 100644 --- a/.config/X11/Xresources +++ b/.config/X11/Xresources @@ -1,23 +1,23 @@ -*.color0: #050505 -*.color1: #AC8A8C -*.color2: #8AAC8B -*.color3: #ACA98A -*.color4: #8F8AAC -*.color5: #AC8AAC -*.color6: #8AABAC -*.color7: #e7e7e7 -*.color8: #676767 -*.color9: #AC8A8C -*.color10: #8AAC8B -*.color11: #ACA98A -*.color12: #8F8AAC -*.color13: #AC8AAC -*.color14: #8AABAC -*.color15: #f0f0f0 +*.color0: #121213 +*.color1: #DE9DAC +*.color2: #9DDEAF +*.color3: #DEDD9D +*.color4: #9DACDE +*.color5: #AF9DDE +*.color6: #9DCCDE +*.color7: #f4e0d8 +*.color8: #393b3b +*.color9: #F7AFC0 +*.color10: #AFF7C3 +*.color11: #F7F6AF +*.color12: #AFC0F7 +*.color13: #C3AFF7 +*.color14: #AFE3F7 +*.color15: #f9ece8 -*.foreground: #f0f0f0 -*.background: #050505 -*.cursorColor: #f0f0f0 +*.foreground: #fdf9f7 +*.background: #121213 +*.cursorColor: #fdf9f7 *.font: JetBrainsMono NF:style=Medium,Regular:size=10 diff --git a/.config/coc/extensions/package.json b/.config/coc/extensions/package.json index bfa87f6..731dc65 100644 --- a/.config/coc/extensions/package.json +++ b/.config/coc/extensions/package.json @@ -3,6 +3,7 @@ "coc-css": ">=1.2.5", "coc-emmet": ">=1.1.6", "coc-html": ">=1.2.4", + "coc-java": ">=1.5.0", "coc-json": ">=1.2.6", "coc-neosnippet": ">=1.2.2", "coc-python": ">=1.2.12", diff --git a/.config/coc/snippets-mru b/.config/coc/snippets-mru index 9173cb7..e6969a3 100644 --- a/.config/coc/snippets-mru +++ b/.config/coc/snippets-mru @@ -1,19 +1,20 @@ +try/except +foreach +get beg +lambda +newdocument __main__ def -newdocument async/def newhtml while -lambda set for forof throw -foreach if try/except/else -try/except \begin gerrit nopagenumbers diff --git a/.config/i3/config b/.config/i3/config index 6b0bcbf..fdbc394 100644 --- a/.config/i3/config +++ b/.config/i3/config @@ -8,12 +8,12 @@ gaps inner $inner_gaps gaps outer $outer_gaps # border color -client.focused #222222 #222222 #f0f0f0 #111111 #222222 -client.focused_inactive #050505 #050505 #f0f0f0 #050505 #050505 -client.unfocused #050505 #050505 #f0f0f0 #050505 #050505 -client.urgent #050505 #ac8a8c #f0f0f0 #ac8a8c #ac8a8c -client.placeholder #000000 #0c0c0c #f0f0f0 #050505 #050505 -client.background #c7c5ca +client.focused #262427 #262427 #fdf9f7 #262427 #262427 +client.focused_inactive #121213 #121213 #fdf9f7 #121213 #121213 +client.unfocused #121213 #121213 #fdf9f7 #121213 #121213 +client.urgent #121213 #de9dac #fdf9f7 #de9dac #de9dac +client.placeholder #000000 #0c0c0c #fdf9f7 #121213 #121213 +client.background #f9ece8 # Replace window decorations with a border for_window [class=".*"] border pixel 0 @@ -44,9 +44,10 @@ exec "xbanish &" exec "redshift &" exec "dunst &" exec "flashfocus &" -exec "xbindkeys -f ~/.config/xb.rc" exec "xset r rate 250 40" exec "autocutsel &" +exec "xbindkeys -f ~/.config/xbindkeys/main" +exec "xbindkeys -f ~/.config/xbindkeys/delay" # split in horizontal orientation bindsym $mod+bar split h @@ -104,6 +105,4 @@ for_window [window_type=notification] floating enable for_window [class="Unturned.x86_64"] floating disable for_window [class="Unturned.x86_64"] fullscreen disable -for_window [class="Minecraft.*"] floating enable -for_window [class="Minecraft.*"] fullscreen enable diff --git a/.config/mpd/mpd.conf b/.config/mpd/mpd.conf index 6b7fdf9..8bbe4f5 100644 --- a/.config/mpd/mpd.conf +++ b/.config/mpd/mpd.conf @@ -1,23 +1,29 @@ -music_directory "~/music" -playlist_directory "~/music/playlists" -log_file "~/.local/mpd/log" +# See: /usr/share/doc/mpd/mpdconf.example +music_directory "/mnt/e/mpd/music" +playlist_directory "/mnt/e/mpd/playlists" -auto_update "yes" -bind_to_address "127.0.0.1" -restore_paused "yes" +pid_file "/mnt/e/mpd/mpd.pid" +db_file "/mnt/e/mpd/mpd.db" +state_file "/mnt/e/mpd/mpdstate" + +auto_update "yes" +bind_to_address "*" +port "6600" +restore_paused "yes" user "loek" group "users" -default_permissions "read,add,control,admin" +default_permissions "read,add,control,admin" -input { - plugin "curl" -} +# input { +# plugin "curl" +# } audio_output { - type "pulse" - name "pulse audio" + type "pulse" + name "pulse audio" + # server "127.0.0.1" } audio_output { @@ -25,11 +31,12 @@ audio_output { name "icecast mpd stream" host "localhost" port "8000" - mount "/mnt/mpd" + mount "/mpd.ogg" user "source" password "sSJKfSicDF8" bitrate "320" format "48000:24:2" - encoding "mp3" + encoding "ogg" + protocol "icecast2" } diff --git a/.config/ncmpcpp/config b/.config/ncmpcpp/config index e68c10f..0afd73a 100644 --- a/.config/ncmpcpp/config +++ b/.config/ncmpcpp/config @@ -1,6 +1,6 @@ mpd_host = "127.0.0.1" mpd_port = "6600" -mpd_music_dir = "/home/loek/music" +mpd_music_dir = "/mnt/e/mpd/music" mpd_connection_timeout = "5" mpd_crossfade_time = "1" ncmpcpp_directory="/home/loek/.config/ncmpcpp" diff --git a/.config/nvim/bliss-lightline.vim b/.config/nvim/bliss-lightline.vim new file mode 100644 index 0000000..aac8433 --- /dev/null +++ b/.config/nvim/bliss-lightline.vim @@ -0,0 +1,25 @@ +let s:bg = [ '#121213', 'NONE' ] +let s:fg = [ '#fdf9f7', 'NONE' ] +let s:mode = [ '#222222', 'NONE' ] +let s:faint = [ '#393b3b', 'NONE' ] +let s:none = [ 'NONE', 'NONE' ] +let s:test = [ '#ff00ff', 'NONE' ] + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} +let s:p.normal.left = [ [ s:fg, s:mode ], [ s:faint, s:bg ] ] +let s:p.normal.right = [ [ s:faint, s:bg ] ] +let s:p.normal.middle = [ [ s:none, s:none ] ] +let s:p.normal.error = [ [ s:test, s:test ] ] +let s:p.normal.warning = [ [ s:test, s:test ] ] +let s:p.inactive.left = copy(s:p.normal.left) +let s:p.inactive.right = copy(s:p.normal.right) +let s:p.inactive.middle = copy(s:p.normal.middle) +let s:p.insert.left = copy(s:p.normal.left) +let s:p.replace.left = copy(s:p.insert.left) +let s:p.visual.left = copy(s:p.insert.left) +let s:p.tabline.left = copy(s:p.normal.middle) +let s:p.tabline.tabsel = [ [ s:fg, s:faint ] ] +let s:p.tabline.middle = copy(s:p.normal.middle) +let s:p.tabline.right = copy(s:p.normal.middle) + +let g:lightline#colorscheme#bliss#palette = lightline#colorscheme#flatten(s:p) diff --git a/.config/nvim/coc-settings.json b/.config/nvim/coc-settings.json index 0dcf343..b98f17d 100644 --- a/.config/nvim/coc-settings.json +++ b/.config/nvim/coc-settings.json @@ -4,6 +4,19 @@ "command": "clangd", "rootPatterns": ["compile_flags.txt", "compile_commands.json"], "filetypes": ["c", "cc", "cpp", "c++", "objc", "objcpp"] + }, + "dart": { + "command": "dart", + "args": [ + "/opt/dart-sdk/bin/snapshots/analysis_server.dart.snapshot", + "--lsp", + "--client-id", + "vim", + "--client-version", + "coc.nvim" + ], + "filetypes": ["dart"], + "trace.server": "verbose" } } } diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim index 873f0fa..b07548e 100644 --- a/.config/nvim/init.vim +++ b/.config/nvim/init.vim @@ -29,12 +29,12 @@ hi! link CocFloating SneakScope cabbrev help tab help autocmd BufNewFile,BufRead *.jdscn set syntax=json -" if ! filereadable(expand('~/.config/nvim/autoload/plug.vim')) -" echo "Downloading junegunn/vim-plug to manage plugins..." -" silent !mkdir -p ~/.config/nvim/autoload/ -" silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ~/.config/nvim/autoload/plug.vim -" autocmd VimEnter * PlugInstall -" endif +if ! filereadable(expand('~/.config/nvim/autoload/plug.vim')) + echo "Downloading junegunn/vim-plug to manage plugins..." + silent !mkdir -p ~/.config/nvim/autoload/ + silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ~/.config/nvim/autoload/plug.vim + autocmd VimEnter * PlugInstall +endif " plugged call plug#begin('~/.config/nvim/plugged') @@ -63,6 +63,9 @@ Plug 'lervag/vimtex' Plug 'pangloss/vim-javascript' Plug 'hail2u/vim-css3-syntax' Plug 'octol/vim-cpp-enhanced-highlight' +Plug 'dart-lang/dart-vim-plugin' +Plug 'bartlomiejdanek/vim-dart' +Plug 'natebosch/dartlang-snippets' " 'vim=ide' Plug 'neoclide/coc.nvim', {'branch': 'release'} @@ -81,6 +84,7 @@ Plug 'scheakur/vim-scheakur' Plug 'mkarmona/materialbox' Plug 'morhetz/gruvbox' Plug 'co1ncidence/mountaineer' +Plug 'co1ncidence/bliss' call plug#end() " keybinds @@ -167,7 +171,7 @@ map <leader>.v :tabnew ~/.config/nvim/init.vim<cr> map <leader>.c :tabnew ~/.config/picom.conf<cr> map <leader>.z :tabnew ~/.zshrc<cr> map <leader>.i :tabnew ~/.config/i3/config<cr> -map <leader>.p :tabnew ~/.config/polybar/config.ini<cr> +map <leader>.p :tabnew ~/.config/polybar/config<cr> map <leader>.x :tabnew ~/.config/xb.rc<cr> let g:which_key_map['.'] = { \ 'name': '+config', @@ -183,9 +187,9 @@ cnoreabbrev W w cnoreabbrev sudow w !sudo tee % " colorscheme thingers -colorscheme mountaineer +colorscheme bliss let g:lightline = { - \ 'colorscheme': 'mountaineer', + \ 'colorscheme': 'bliss', \ 'mode_map': { \ 'n' : 'norm', \ 'i' : 'ins', @@ -215,7 +219,7 @@ let g:lightline = { \ 'right': [ ] \ }, \ } -source $HOME/.config/nvim/mountaineer-lightline.vim +source $HOME/.config/nvim/bliss-lightline.vim hi! SignColumn guibg=NONE ctermbg=NONE " vimtex config diff --git a/.config/picom.conf b/.config/picom.conf index 73aa2fc..c0a831e 100644 --- a/.config/picom.conf +++ b/.config/picom.conf @@ -27,8 +27,7 @@ shadow-offset-x = -48; shadow-exclude = [ "!I3_FLOATING_WINDOW@:c && _NET_WM_WINDOW_TYPE@:32a *= '_NET_WM_WINDOW_TYPE_NORMAL'", - "class_g = 'firefox' && !I3_FLOATING_WINDOW@:c", - "class_g = 'conky'" + "class_g = 'firefox' && !I3_FLOATING_WINDOW@:c" ] wintypes: { diff --git a/.config/polybar/config b/.config/polybar/config index b7941e8..84a2bb3 100644 --- a/.config/polybar/config +++ b/.config/polybar/config @@ -98,9 +98,9 @@ pseudo-transparency = false [color] -bg = #050505 -fg = #f0f0f0 -fg-alt = #050505 +bg = #121213 +fg = #fdf9f7 +fg-alt = #121213 alpha = #00000000 diff --git a/.config/polybar/onstart.sh b/.config/polybar/onstart.sh deleted file mode 100644 index 033cec0..0000000 --- a/.config/polybar/onstart.sh +++ /dev/null @@ -1,3 +0,0 @@ -# Tray below bar :( -sleep 1 -xdo raise -n Polybar -n tray diff --git a/.config/polybar/player-mpris-simple.sh b/.config/polybar/player-mpris-simple.sh deleted file mode 100755 index 938ac21..0000000 --- a/.config/polybar/player-mpris-simple.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -player_status=$(playerctl status 2> /dev/null) - -if [ "$player_status" = "Playing" ] || [ "$player_status" = "Paused" ]; then - echo "$(playerctl metadata artist) - $(playerctl metadata title)" | awk -v len=60 '{ if (length($0) > len) print substr($0, 1, len-3) "..."; else print; }' -else - echo "" -fi diff --git a/.config/rofi/pywal.rasi b/.config/rofi/pywal.rasi index e73f155..9ebbb47 100644 --- a/.config/rofi/pywal.rasi +++ b/.config/rofi/pywal.rasi @@ -1,6 +1,6 @@ * { - background-color: #050505; - text-color: #f0f0f0; + background-color: #121213; + text-color: #f4e0d8; spacing: 0; width: 720px; } @@ -15,8 +15,6 @@ prompt { } textbox { - background-color: #050505; - border-color: #050505; padding: 8px 16px; } @@ -35,6 +33,6 @@ element { } element selected { - background-color: #ac8a8c; - text-color: #050505; + background-color: #AF9DDE; + text-color: #121213; } diff --git a/.config/startpage/style.css b/.config/startpage/style.css index 2cd20bb..9eefe45 100644 --- a/.config/startpage/style.css +++ b/.config/startpage/style.css @@ -1,20 +1,20 @@ :root { - --color0: #050505; - --color1: #AC8A8C; - --color2: #8AAC8B; - --color3: #ACA98A; - --color4: #8F8AAC; - --color5: #AC8AAC; - --color6: #8AABAC; - --color7: #e7e7e7; - --color8: #676767; - --color9: #AC8A8C; - --color10: #8AAC8B; - --color11: #ACA98A; - --color12: #8F8AAC; - --color13: #AC8AAC; - --color14: #8AABAC; - --color15: #f0f0f0; + --color0: #121213; + --color1: #DE9DAC; + --color2: #9DDEAF; + --color3: #DEDD9D; + --color4: #9DACDE; + --color5: #AF9DDE; + --color6: #9DCCDE; + --color7: #f4e0d8; + --color8: #393b3b; + --color9: #F7AFC0; + --color10: #AFF7C3; + --color11: #F7F6AF; + --color12: #AFC0F7; + --color13: #C3AFF7; + --color14: #AFE3F7; + --color15: #f9ece8; } html, body { diff --git a/.config/user-dirs.dirs b/.config/user-dirs.dirs index f7c6dec..df754e6 100644 --- a/.config/user-dirs.dirs +++ b/.config/user-dirs.dirs @@ -7,7 +7,7 @@ # XDG_DOWNLOAD_DIR="$HOME/dl" XDG_DOCUMENTS_DIR="$HOME/docs" -XDG_MUSIC_DIR="$HOME/music" +XDG_MUSIC_DIR="$HOME/" XDG_DESKTOP_DIR="$HOME/" XDG_TEMPLATES_DIR="$HOME/" XDG_PUBLICSHARE_DIR="$HOME/" diff --git a/.config/xb.rc b/.config/xbindkeys/main index 3a60d41..c5a6c79 100644 --- a/.config/xb.rc +++ b/.config/xbindkeys/main @@ -8,8 +8,6 @@ Mod4 + Return "bwmenu" Mod4 + p -"flost fzmp -A" - Mod4 + a "maim -sb 4 -c 255,255,255 | xclip -selection clipboard -t image/png" Print diff --git a/.config/zathura/zathurarc b/.config/zathura/zathurarc index fdd2203..36da877 100644 --- a/.config/zathura/zathurarc +++ b/.config/zathura/zathurarc @@ -8,8 +8,29 @@ set selection-clipboard clipboard map <C-i> recolor set recolor "true" -set default-bg rgb(5,5,5) -set recolor-lightcolor rgba(240,240,240,0) - set recolor-reverse-video "true" set recolor-keephue "true" + + +set default-bg "#121213" +set statusbar-bg "#121213" +set inputbar-bg "#121213" +set completion-highlight-fg "#121213" +set completion-bg "#121213" +set notification-error-fg "#121213" +set notification-warning-fg "#121213" +set notification-fg "#121213" + +set default-fg "#f9ece8" +set inputbar-fg "#f9ece8" +set completion-fg "#f9ece8" +set statusbar-fg "#f9ece8" +set recolor-lightcolor rgba(2249,236,232,0) + +set notification-error-bg "#DE9DAC" +set notification-warning-bg "#DE9DAC" +set completion-highlight-bg "#DE9DAC" +set highlight-color "#DE9DAC" + +set highlight-active-color "#C3AFF7" +set notification-bg "#C3AFF7" diff --git a/.local/share/bin/addtoqueue b/.local/share/bin/addtoqueue index 8f931e6..d4b82b6 100755 --- a/.local/share/bin/addtoqueue +++ b/.local/share/bin/addtoqueue @@ -1 +1,2 @@ +#!/bin/sh flost fzmp -A @@ -68,7 +68,8 @@ alias les="less" alias scdl="scdl --onlymp3 -l" alias screenrecord='giph -s -b 4 -c 255,255,255 $(date +"$HOME/%Y-%m-%d_%H-%M-%S.mp4")' function b64d { echo $1 | base64 -d } -function genplaylist { find $1 -name "*.flac" | sort -V > playlists/$1.m3u } +function genplaylist { find $1 -name "*.flac" | sort -V > ../playlists/$1.m3u } +function bgcol { convert -size 1x1 xc:$1 /tmp/bgcol.png && feh --bg-tile /tmp/bgcol.png } alias r="ranger" alias v="nvim" alias l="live-server" @@ -9,17 +9,11 @@ these are dotfiles - i3 - polybar - zathura -- chromium - brave - rofi -- konsole - [st](https://github.com/lonkaars/st) -also includes jswal, my shitty inefficient wrapper for wal that adds readable colors and more things to theme and such - # screenshots -![](1.png) -![](2.png) -![](3.png) +no |