//META{"name":"ServerFolders","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/ServerFolders","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/ServerFolders/ServerFolders.plugin.js"}*// class ServerFolders { getName () {return "ServerFolders";} getVersion () {return "6.6.0";} getAuthor () {return "DevilBro";} getDescription () {return "Patches Discords native Folders in a way to open Servers within a Folder in a new bar to the right. Also adds a bunch of new features to more easily organize, customize and manage your Folders.";} constructor () { this.changelog = { "fixed":[["Dark Sidebar","Now properly colored with dark sidebar"]] }; this.patchModules = { "Guilds":["componentDidMount","componentDidUpdate","componentWillUnmount"], "GuildFolder":["componentDidMount","componentDidUpdate"], "Guild":["componentDidMount","componentDidUpdate"], "GuildFolderSettingsModal":"componentDidMount", "StandardSidebarView":"componentWillUnmount" }; } initConstructor () { this.folderStates = {}; this.folderReads = {}; this.guildStates = {}; this.css = ` .${this.name}-modal .ui-icon-picker-icon { position: relative; margin: 3px 3px; padding: 3px 3px; width: 55px; height: 55px; border-radius: 12px; } .${this.name}-modal .ui-icon-picker-icon .ui-picker-inner { width: 100%; height: 100%; border-radius: 12px; background-position: center; background-size: cover; background-repeat: no-repeat; } .${this.name}-modal .ui-icon-picker-icon.selected ${BDFDB.dotCN.hovercardbutton} { display: none !important; } .${this.name}-modal .ui-icon-picker-icon ${BDFDB.dotCN.hovercardbutton} { position: absolute; top: -10px; right: -10px; } .${this.name}-modal .ui-icon-picker-icon.preview.nopic .ui-picker-inner { background: url('data:image/svg+xml; utf8, ') center/cover no-repeat; } ${BDFDB.dotCN.guildfolder}[style*="background-image"] { background-color: transparent !important; background-position: center !important; background-size: cover !important; background-repeat: no-repeat !important; transiton: unset !important; } ${BDFDB.dotCN.guildfolder}[style*="background-image"] ${BDFDB.dotCN.guildfoldericonwrapper}, ${BDFDB.dotCN.guildfolderexpandendbackground}, ${BDFDB.dotCN.guildfolderexpandedguilds} { display: none !important; } ${BDFDB.dotCN.guildupperbadge}.count { left: 0px; right: unset; } ${BDFDB.dotCN.guildouter}.serverfolders-dragpreview { pointer-events: none !important; position: absolute !important; opacity: 0.5 !important; z-index: 10000 !important; } ${BDFDB.dotCN.guildouter}.serverfolders-dragpreview, ${BDFDB.dotCN.guildouter}.serverfolders-dragpreview ${BDFDB.dotCN.guildinner}, ${BDFDB.dotCN.guildouter}.serverfolders-dragpreview ${BDFDB.dotCNS.guildinner + BDFDB.dotCN.guildiconwrapper}, ${BDFDB.dotCN.guildouter}.serverfolders-dragpreview ${BDFDB.dotCNS.guildinner + BDFDB.dotCNS.guildiconwrapper + BDFDB.dotCN.guildicon} { border-radius: 50% !important; width: 48px !important; height: 48px !important; } ${BDFDB.dotCN.guildouter}.serverfolders-dragpreview ${BDFDB.dotCN.guildpillwrapper} { display: none !important; } ${BDFDB.dotCN.guildouter}.serverfolders-dragpreview ${BDFDB.dotCN.guildiconacronym} { color: white !important; background-color: #444 !important; border-radius: 50% !important; overflow: hidden !important; } ${BDFDB.dotCN.guildswrapper}.foldercontent { transition: width .3s linear !important; left: 72px; } ${BDFDB.dotCN.guildswrapper}.foldercontent .folderseparatorouter { margin-top: 10px; } ${BDFDB.dotCN.guildswrapper}.foldercontent.foldercontentclosed { width: 0px !important; } ${BDFDB.dotCN.appcontainer} { display: flex !important; } ${BDFDB.dotCN.guildswrapper} { position: static !important; contain: unset !important; } ${BDFDB.dotCN.chatbase} { position: static !important; contain: unset !important; width: 100% !important; }`; this.folderContentMarkup = `
`; this.dragPlaceholderMarkup = `
`; this.folderIcons = [ {openicon:``, closedicon:``}, {openicon:``, closedicon:``}, {openicon:``, closedicon:``}, {openicon:``, closedicon:``}, {openicon:``, closedicon:``}, {openicon:``, closedicon:``}, {openicon:``, closedicon:``} ]; this.defaults = { settings: { closeOtherFolders: {value:false, description:"Close other Folders when opening a Folder."}, closeTheFolder: {value:false, description:"Close the Folder when selecting a Server."}, closeAllFolders: {value:false, description:"Close All Folders when selecting a Server."}, forceOpenFolder: {value:false, description:"Force a Folder to open when switching to a Server of that Folder."}, showCountBadge: {value:true, description:"Display Badge for Amount of Servers in a Folder."}, addSeparators: {value:true, description:"Adds separators between Servers of different Folders."} } }; } getSettingsPanel () { if (!global.BDFDB || typeof BDFDB != "object" || !BDFDB.loaded || !this.started) return; let settings = BDFDB.DataUtils.get(this, "settings"); let settingshtml = `
${this.name}
`; for (let key in settings) { settingshtml += `

${this.defaults.settings[key].description}

`; } settingshtml += `

Remove all custom Icons.

`; settingshtml += `
`; let settingspanel = BDFDB.DOMUtils.create(settingshtml); BDFDB.initElements(settingspanel, this); BDFDB.ListenerUtils.add(this, settingspanel, "click", ".removecustom-button", () => { BDFDB.ModalUtils.confirm(this, "Are you sure you want to remove all custom icons?", () => { BDFDB.DataUtils.remove(this, "customicons"); }); }); return settingspanel; } //legacy load () {} start () { if (!global.BDFDB) global.BDFDB = {myPlugins:{}}; if (global.BDFDB && global.BDFDB.myPlugins && typeof global.BDFDB.myPlugins == "object") global.BDFDB.myPlugins[this.getName()] = this; var libraryScript = document.querySelector('head script#BDFDBLibraryScript'); if (!libraryScript || (performance.now() - libraryScript.getAttribute("date")) > 600000) { if (libraryScript) libraryScript.remove(); libraryScript = document.createElement("script"); libraryScript.setAttribute("id", "BDFDBLibraryScript"); libraryScript.setAttribute("type", "text/javascript"); libraryScript.setAttribute("src", "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.min.js"); libraryScript.setAttribute("date", performance.now()); libraryScript.addEventListener("load", () => {this.initialize();}); document.head.appendChild(libraryScript); } else if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) this.initialize(); this.startTimeout = setTimeout(() => { try {return this.initialize();} catch (err) {console.error(`%c[${this.getName()}]%c`, "color: #3a71c1; font-weight: 700;", "", "Fatal Error: Could not initiate plugin! " + err);} }, 30000); } initialize () { if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) { if (this.started) return; BDFDB.PluginUtils.init(this); // REMOVE 08.10.2019 let foldersdata = BDFDB.ObjectUtils.sort(BDFDB.DataUtils.load(this, "folders"), "position"); let newfolders = Object.keys(foldersdata).filter(n => n.indexOf("folder") == -1); let cleaned = false; if (newfolders.length) for (let id of newfolders) if (foldersdata[id].icons) { cleaned = true; delete foldersdata[id].icons; } if (cleaned) { BDFDB.DataUtils.save(foldersdata, this, "folders"); foldersdata = BDFDB.ObjectUtils.sort(BDFDB.DataUtils.load(this, "folders"), "position"); } let oldfolders = Object.keys(foldersdata).filter(n => n.indexOf("folder") == 0); if (oldfolders.length) BDFDB.ModalUtils.confirm(this, `Old ServerFolders data detected!\nFound ${oldfolders.length} old custom folders in the ServerFolders.config.json.\nPress the '${BDFDB.LanguageUtils.LanguageStrings.OKAY}' button to automatically create a native folder for each old folder and to automatically put the servers in them.`, "Convert?", () => { let oldGuildFolders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders); let guildsInFolders = []; let guildFolders = []; let guildPositions = []; let newfoldersdata = {}; for (let folderid in foldersdata) { let newid = this.generateID("folder"); let olddata = foldersdata[folderid]; let color1 = BDFDB.ColorUtils.convert(olddata.color1, "INT"); guildFolders.push({ guildIds: olddata.servers, folderId: newid, folderName: olddata.folderName, folderColor: color1 != null && color1 != undefined ? color1 : 7506394 }); guildsInFolders = guildsInFolders.concat(olddata.servers); newfoldersdata[newid] = Object.assign({}, olddata); delete newfoldersdata[newid].position; delete newfoldersdata[newid].folderName; delete newfoldersdata[newid].folderId; delete newfoldersdata[newid].servers; delete newfoldersdata[newid].isOpen; newfoldersdata[newid].autoRead = newfoldersdata[newid].autounread; delete newfoldersdata[newid].autounread; newfoldersdata[newid].useCloseIcon = true; newfoldersdata[newid].muteFolder = false; } for (let i in oldGuildFolders) if (oldGuildFolders[i].folderId || !guildsInFolders.includes(oldGuildFolders[i].guildIds[0])) guildFolders.push(Object.assign({}, oldGuildFolders[i])); for (let i in guildFolders) for (let guildid of guildFolders[i].guildIds) guildPositions.push(guildid); BDFDB.LibraryModules.SettingsUtils.updateRemoteSettings({guildPositions, guildFolders}); BDFDB.DataUtils.save(newfoldersdata, this, "folders"); }); BDFDB.ModuleUtils.forceAllUpdates(this); } else console.error(`%c[${this.getName()}]%c`, "color: #3a71c1; font-weight: 700;", "", "Fatal Error: Could not load BD functions!"); } stop () { if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) { this.stopping = true; BDFDB.DOMUtils.remove(this.foldercontent, BDFDB.dotCN.guildswrapper + ".foldercontent"); let modal = document.querySelector(`.${this.name}-modal`); if (modal) { BDFDB.DOMUtils.removeClass(modal, `${this.name}-modal`); let modalclose = modal.querySelector(BDFDB.dotCN.modalclose); if (modalclose) modalclose.click(); } for (let folderinner of document.querySelectorAll(`${BDFDB.dotCNS.guildfolderwrapper + BDFDB.dotCN.guildfolderexpandendbackground} ~ ${BDFDB.dotCNS.guildouter + BDFDB.dotCN.guildinner}`)) { folderinner.removeEventListener("mouseenter", folderinner.ServerFoldersTooltipListener); folderinner.removeEventListener("mousedown", folderinner.ServerFoldersClickListener); BDFDB.DOMUtils.remove(folderinner.querySelectorAll(`${BDFDB.dotCN.guildupperbadge}.count`)); } for (let foldericon of document.querySelectorAll(BDFDB.dotCN.guildfolder)) { foldericon.style.removeProperty("background-image"); foldericon.parentElement.parentElement.style.removeProperty("-webkit-mask"); } BDFDB.PluginUtils.clear(this); } } onSwitch () { if (typeof BDFDB === "object" && BDFDB.DataUtils.get(this, "settings", "forceOpenFolder")) { let folder = this.getFolderOfGuildId(BDFDB.LibraryModules.LastGuildStore.getGuildId()); if (folder && !BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folder.folderId)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folder.folderId); } } // begin of own functions onGuildContextMenu (instance, menu, returnvalue) { if (document.querySelector(".BDFDB-modal")) return; if (instance.props && instance.props.target && instance.props.folderId && instance.props.type == "GUILD_ICON_FOLDER" && !menu.querySelector(`${this.name}-contextMenuItem`)) { let folderid = instance.props.folderId; let folder = BDFDB.LibraryModules.FolderStore.getGuildFolderById(folderid); let data = this.getFolderConfig(folderid); let muted = data.muteFolder && folder.guildIds.every(guildid => BDFDB.LibraryModules.MutedUtils.isGuildOrCategoryOrChannelMuted(guildid)); if (data.muteFolder != muted) { data.muteFolder = muted; BDFDB.DataUtils.save(data, this, "folders", folderid); } let [children, index] = BDFDB.ReactUtils.findChildren(returnvalue, {name:"GuildFolderMarkReadItem"}); const autoreaditem = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuToggleItem, { label: this.labels.foldercontext_autoreadfolder_text, className: `BDFDB-contextMenuToggleItem ${this.name}-contextMenuToggleItem ${this.name}-autoread-contextMenuToggleItem`, active: data.autoRead, action: state => { data.autoRead = state; BDFDB.DataUtils.save(data, this, "folders", folderid); } }); if (index > -1) children.splice(index + 1, 0, autoreaditem); else children.push(autoreaditem); const muteGroup = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItemGroup, { className: `BDFDB-contextMenuItemGroup ${this.name}-contextMenuItemGroup`, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuToggleItem, { label: this.labels.foldercontext_mutefolder_text, className: `BDFDB-contextMenuToggleItem ${this.name}-contextMenuToggleItem ${this.name}-mutefolder-contextMenuToggleItem`, active: muted, action: state => { data.muteFolder = state; BDFDB.DataUtils.save(data, this, "folders", folderid); for (let guildid of folder.guildIds) if (BDFDB.LibraryModules.MutedUtils.isGuildOrCategoryOrChannelMuted(guildid) != state) BDFDB.LibraryModules.GuildSettingsUtils.updateNotificationSettings(guildid, {muted:state, suppress_everyone:state}); } }) }); returnvalue.props.children.splice(returnvalue.props.children.length - 1, 0, muteGroup); const deleteGroup = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItemGroup, { className: `BDFDB-contextMenuItemGroup ${this.name}-contextMenuItemGroup`, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItem, { label: this.labels.foldercontext_removefolder_text, className: `BDFDB-contextMenuItem ${this.name}-contextMenuItem ${this.name}-removefolder-contextMenuItem`, danger: true, action: e => { BDFDB.ContextMenuUtils.close(BDFDB.DOMUtils.getParent(BDFDB.dotCN.contextmenu, e.target)); BDFDB.ModalUtils.confirm(this, `Are you sure you want to remove the folder${folder.folderName ? (" '" + folder.folderName + '"') : ""}?`, () => {this.removeFolder(folderid);}); } }) }); returnvalue.props.children.push(deleteGroup); } else if (instance.props && instance.props.target && instance.props.guild && instance.props.type == "GUILD_ICON_BAR" && !menu.querySelector(`${this.name}-contextMenuItem`)) { let guildid = instance.props.guild.id; let folders = this.getFolders(); let folder = this.getFolderOfGuildId(guildid); let addtofolderitems = [], openguilds = BDFDB.LibraryModules.FolderStore.getSortedGuilds().filter(n => !n.folderId).map(n => n.guilds[0]); for (let i = 0; i < folders.length; i++) addtofolderitems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItem, { label: folders[i].folderName || (this.labels.modal_tabheader1_text + " #" + parseInt(i+1)), className: `BDFDB-contextMenuItem ${this.name}-contextMenuItem ${this.name}-addtofolder-contextMenuItem`, action: e => { BDFDB.ContextMenuUtils.close(menu); this.addGuildToFolder(folders[i].folderId, guildid); } })); let [children, index] = BDFDB.ReactUtils.findChildren(returnvalue, {name:["FluxContainer(MessageDeveloperModeGroup)", "DeveloperModeGroup"]}); const addType = !addtofolderitems.length ? "contextMenuItem" : "contextMenuSubItem"; const itemgroup = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItemGroup, { className: `BDFDB-contextMenuItemGroup ${this.name}-contextMenuItemGroup`, children: [ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuSubItem, { label: this.labels.servercontext_serverfolders_text, className: `BDFDB-contextMenuSubItem ${this.name}-contextMenuSubItem ${this.name}-guild-contextMenuSubItem`, render: folder ? [ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItem, { label: this.labels.serversubmenu_removefromfolder_text, className: `BDFDB-contextMenuItem ${this.name}-contextMenuItem ${this.name}-removefromfolder-contextMenuItem`, danger: true, action: e => { BDFDB.ContextMenuUtils.close(menu); this.removeGuildFromFolder(folder.folderId, guildid); } }) ] : [ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItem, { label: this.labels.serversubmenu_createfolder_text, className: `BDFDB-contextMenuItem ${this.name}-contextMenuItem ${this.name}-createfolder-contextMenuItem`, disabled: !openguilds.length, action: e => { BDFDB.ContextMenuUtils.close(menu); this.openFolderCreationMenu(openguilds, guildid); } }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents[addType.charAt(0).toUpperCase() + addType.slice(1)], { label: this.labels.serversubmenu_addtofolder_text, className: `BDFDB-${addType} ${this.name}-${addType} ${this.name}-addtofolder-${addType}`, disabled: !addtofolderitems.length, render: addtofolderitems }) ] }) ] }); if (index > -1) children.splice(index, 0, itemgroup); else children.push(itemgroup); } } processGuilds (instance, wrapper, returnvalue, methodnames) { if (methodnames.includes("componentWillUnmount")) { BDFDB.DOMUtils.remove(this.foldercontent, BDFDB.dotCN.guildswrapper + ".foldercontent"); delete this.foldercontent; delete this.foldercontentguilds; } if (methodnames.includes("componentDidMount")) { let process = () => { if (!wrapper.parentElement.querySelector(BDFDB.dotCN.guildswrapper + ".foldercontent")) { this.foldercontent = BDFDB.DOMUtils.create(this.folderContentMarkup); this.updateFolderContentColor(wrapper); wrapper.parentElement.insertBefore(this.foldercontent, wrapper.nextElementSibling); this.foldercontentguilds = this.foldercontent.querySelector(BDFDB.dotCN.guildsscroller); this.toggleFolderContent(); } }; if (document.querySelector(BDFDB.dotCNS.guildswrapper + BDFDB.dotCN.guildouter + ":not(.copy) " + BDFDB.dotCN.guildiconwrapper)) process(); else BDFDB.TimeUtils.timeout(process, 5000); } } processGuildFolder (instance, wrapper, returnvalue, methodnames) { if (!this.foldercontentguilds) return; let state = this.getState(instance); let data = this.getFolderConfig(state.folderId); if (methodnames.includes("componentDidMount")) { if (data.muteFolder) for (let guildid of instance.props.guildIds) if (!BDFDB.LibraryModules.MutedUtils.isGuildOrCategoryOrChannelMuted(guildid)) BDFDB.LibraryModules.GuildSettingsUtils.updateNotificationSettings(guildid, {muted:true, suppress_everyone:true}); } if (!BDFDB.equals(state, this.folderStates[instance.props.folderId])) { if (data.autoRead && (state.unread || state.badge > 0)) { BDFDB.TimeUtils.clear(this.folderReads[state.folderId]); this.folderReads[state.folderId] = BDFDB.TimeUtils.timeout(() => { BDFDB.GuildUtils.markAsRead(instance.props.guildIds); }, 10000); } if (state.expanded) BDFDB.TimeUtils.timeout(() => { for (let guildid of instance.props.guildIds) this.updateGuildInFolderContent(state.folderId, guildid); if (this.clickedFolder == state.folderId && BDFDB.DataUtils.get(this, "settings", "closeOtherFolders")) for (let openFolderId of BDFDB.LibraryModules.FolderUtils.getExpandedFolders()) if (openFolderId != state.folderId) { BDFDB.DOMUtils.remove(this.foldercontent.querySelectorAll(`${BDFDB.dotCN.guildouter}[folderid="${openFolderId}"]`)); BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId); } this.addSeparator(state.folderId); this.toggleFolderContent(); }); else BDFDB.TimeUtils.timeout(() => { BDFDB.DOMUtils.remove(this.foldercontent.querySelectorAll(`${BDFDB.dotCN.guildouter}[folderid="${state.folderId}"]`)); if (BDFDB.DOMUtils.containsClass(this.foldercontentguilds.firstElementChild, "folderseparatorouter")) BDFDB.DOMUtils.remove(this.foldercontentguilds.firstElementChild); this.toggleFolderContent(); }, BDFDB.LibraryModules.FolderUtils.getExpandedFolders().size > 0 ? 0 : 300); this.changeFolder(state.folderId, wrapper); } this.folderStates[state.folderId] = state; } processGuild (instance, wrapper, returnvalue, methodnames) { if (!this.foldercontentguilds) return; if (instance.props && instance.props.guild) { if (methodnames.includes("componentDidMount")) { BDFDB.ListenerUtils.add(this, wrapper, "click", () => {BDFDB.TimeUtils.timeout(() => { let folder = this.getFolderOfGuildId(instance.props.guild.id); let folderid = folder ? folder.folderId : null; let settings = BDFDB.DataUtils.get(this, "settings"); if (settings.closeAllFolders) for (let openFolderId of BDFDB.LibraryModules.FolderUtils.getExpandedFolders()) if (!folderid || openFolderId != folderid || !settings.forceOpenFolder) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId); else if (folderid && settings.closeTheFolder && !settings.forceOpenFolder && BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folderid)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folderid); if (settings.closeAllFolders) for (let openFolderId of BDFDB.LibraryModules.FolderUtils.getExpandedFolders()) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId); else if (settings.closeTheFolder) { let folder = this.getFolderOfGuildId(instance.props.guild.id); if (folder && BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folder.folderId)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folder.folderId); } })}); } if (methodnames.includes("componentDidUpdate")) { let folder = this.getFolderOfGuildId(instance.props.guild.id); if (folder) { let state = this.getState(instance); if (!BDFDB.equals(state, this.guildStates[instance.props.guild.id])) this.updateGuildInFolderContent(folder.folderId, instance.props.guild.id); } } } } processGuildFolderSettingsModal (instance, wrapper, returnvalue) { if (instance.props && instance.props.folderId) { let folderid = instance.props.folderId; let data = this.getFolderConfig(folderid); wrapper = wrapper.parentElement; let root = wrapper.querySelector(BDFDB.dotCN.layermodal); let header = wrapper.querySelector(BDFDB.dotCN.modalheader); let form = wrapper.querySelector(BDFDB.dotCN.modalsubinner + " form"); BDFDB.DOMUtils.addClass(root, "BDFDB-modal", `${this.name}-modal`, BDFDB.disCN.layermodalmedium); BDFDB.DOMUtils.removeClass(root, BDFDB.disCN.layermodalsmall); if (header) { BDFDB.TimeUtils.clear(this.settingsModalWait); header.parentElement.insertBefore(BDFDB.DOMUtils.create(`
${this.labels.modal_tabheader1_text}
${this.labels.modal_tabheader2_text}
${this.labels.modal_tabheader3_text}
${this.labels.modal_tabheader4_text}
`), header.nextElementSibling); } if (root && form) { form.setAttribute("tab", "folder"); BDFDB.DOMUtils.addClass(form, "tab-content", BDFDB.disCN.marginbottom8); for (let child of form.childNodes) if (form.firstElementChild != child) BDFDB.DOMUtils.hide(child); form.appendChild(BDFDB.DOMUtils.create(`
${this.labels.modal_iconpicker_text}
`)); form.appendChild(BDFDB.DOMUtils.create(`

${this.labels.modal_usecloseicon_text}

`)); form.parentElement.appendChild(BDFDB.DOMUtils.create(`
${this.labels.modal_colorpicker1_text}
${this.labels.modal_colorpicker2_text}
`)); form.parentElement.appendChild(BDFDB.DOMUtils.create(`
${this.labels.modal_colorpicker3_text}
${this.labels.modal_colorpicker4_text}

${this.labels.modal_copytooltipcolor_text}

`)); form.parentElement.appendChild(BDFDB.DOMUtils.create(`
${this.labels.modal_customopen_text}
${this.labels.modal_customclosed_text}
${this.labels.modal_custompreview_text}
`)); let usecloseiconinput = root.querySelector("#input-usecloseicon"); let copytooltipcolorinput = root.querySelector("#input-copytooltipcolor"); usecloseiconinput.checked = data.useCloseIcon; copytooltipcolorinput.checked = data.copyTooltipColor; this.setIcons(form, data.iconID); BDFDB.setColorSwatches(root, data.color1); BDFDB.setColorSwatches(root, data.color2); BDFDB.setColorSwatches(root, data.color3); BDFDB.setColorSwatches(root, data.color4); BDFDB.ListenerUtils.addToChildren(root, "change", "input[type='file'][option]", e => { let input = e.currentTarget, file = input.files[0]; if (file) BDFDB.TimeUtils.timeout(() => {this.fetchCustomIcon(root, input.getAttribute("option"))}); }); BDFDB.ListenerUtils.addToChildren(root, "keyup", "input[type='text'][option]", e => { if (e.which == 13) this.fetchCustomIcon(root, e.currentTarget.getAttribute("option")); }); BDFDB.ListenerUtils.addToChildren(root, "click", ".btn-addcustom", () => { this.saveCustomIcon(root); }); BDFDB.ListenerUtils.addToChildren(root, "click", BDFDB.dotCNS.modalfooter + BDFDB.dotCN.button, e => { var olddata = Object.assign({}, data); var selectedIcon = root.querySelector(".ui-icon-picker-icon.selected"); data.iconID = selectedIcon.getAttribute("value"); data.useCloseIcon = usecloseiconinput.checked; data.copyTooltipColor = copytooltipcolorinput.checked; data.color1 = BDFDB.ColorUtils.getSwatchColor(root, 1); data.color2 = BDFDB.ColorUtils.getSwatchColor(root, 2); data.color3 = BDFDB.ColorUtils.getSwatchColor(root, 3); data.color4 = BDFDB.ColorUtils.getSwatchColor(root, 4); if (!BDFDB.equals(olddata, data)) { BDFDB.DataUtils.save(data, this, "folders", folderid); instance.handleColorChange(data.color1 ? BDFDB.ColorUtils.convert(data.color1 && BDFDB.ObjectUtils.is(data.color1) ? data.color1[Object.keys(data.color1)[0]] : data.color1, "INT") : null); this.changeFolder(folderid); } }); } BDFDB.initElements(wrapper); } } processStandardSidebarView (instance, wrapper, returnvalue) { if (!this.foldercontent) return; if (this.SettingsUpdated && this.foldercontent) {this.SettingsUpdated; this.folderStates = {}; BDFDB.ModuleUtils.forceAllUpdates(this, "GuildFolder"); } this.updateFolderContentColor(); } updateFolderContentColor (nativecontent = document.querySelector(BDFDB.dotCN.guildswrapper)) { if (!nativecontent || !this.foldercontent) return; BDFDB.toggleClass(this.foldercontent, BDFDB.disCN.themedark, BDFDB.DiscordUtils.getTheme() == BDFDB.disCN.themelight && BDFDB.containsClass(nativecontent, BDFDB.disCN.themedark)); } loadAllIcons () { let icons = {}; this.folderIcons.forEach((array,i) => {icons[i] = {"openicon":array.openicon,"closedicon":array.closedicon,"customID":null};}); Object.assign(icons, BDFDB.DataUtils.load(this, "customicons")); return icons; } fetchCustomIcon (modal, type) { let successFetchIcon; let url = modal.querySelector("input[type='text'][option='" + type + "']").value; if (url.indexOf("http") == 0) { BDFDB.LibraryRequires.request(url, (error, response, result) => { if (response) { let type = response.headers["content-type"]; if (type && type.indexOf("image") > -1) { successFetchIcon(); return; } } BDFDB.NotificationUtils.toast("Use a valid direct link to an image source. They usually end on something like .png, .jpg or .gif.", {type:"danger"}); }); } else { if (BDFDB.LibraryRequires.fs.existsSync(url)) { BDFDB.LibraryRequires.fs.readFile(url, (error, response) => { if (!error) { url = `data:image/png;base64,${response.toString("base64")}`; successFetchIcon(); } }); } else { BDFDB.NotificationUtils.toast("Could not fetch file. Please make sure the file exists.", {type:"danger"}); } } successFetchIcon = () => { let iconpreview = modal.querySelector(".ui-icon-picker-icon.preview." + type); let iconpreviewinner = iconpreview.querySelector(".ui-picker-inner"); BDFDB.DOMUtils.removeClass(iconpreview, "nopic"); iconpreview.url = url; iconpreviewinner.style.setProperty("background-image", `url(${url})`); let iconpreviewopen = modal.querySelector(".ui-icon-picker-icon.preview.open"); let iconpreviewclosed = modal.querySelector(".ui-icon-picker-icon.preview.closed"); if (!BDFDB.DOMUtils.containsClass(iconpreviewopen, "nopic") && !BDFDB.DOMUtils.containsClass(iconpreviewclosed, "nopic")) { let iconpreviewswitching = modal.querySelector(".ui-icon-picker-icon.preview.switching"); let iconpreviewopenimage = iconpreviewopen.querySelector(".ui-picker-inner").style.getPropertyValue("background-image"); let iconpreviewclosedimage = iconpreviewclosed.querySelector(".ui-picker-inner").style.getPropertyValue("background-image"); let iconpreviewswitchinginner = iconpreviewswitching.querySelector(".ui-picker-inner"); BDFDB.DOMUtils.removeClass(iconpreviewswitching, "nopic"); iconpreviewswitchinginner.style.setProperty("background-image", iconpreviewopenimage); let switching = true; iconpreviewswitching.switchInterval = BDFDB.TimeUtils.interval(() => { switching = !switching; iconpreviewswitchinginner.style.setProperty("background-image", switching ? iconpreviewopenimage : iconpreviewclosedimage); },1000); } }; } saveCustomIcon (modal) { let iconpreviewopen = modal.querySelector(".ui-icon-picker-icon.preview.open"); let iconpreviewclosed = modal.querySelector(".ui-icon-picker-icon.preview.closed"); let iconpreviewswitching = modal.querySelector(".ui-icon-picker-icon.preview.switching"); if (!BDFDB.DOMUtils.containsClass(iconpreviewopen, "nopic") && !BDFDB.DOMUtils.containsClass(iconpreviewclosed, "nopic") && !BDFDB.DOMUtils.containsClass(iconpreviewswitching, "nopic")) { let customID = this.generateID("customicon"); BDFDB.DataUtils.save({"openicon":iconpreviewopen.url,"closedicon":iconpreviewclosed.url,customID}, this, "customicons", customID); modal.querySelectorAll("input[type='text'][option]").forEach((input) => {input.value = "";}); let iconpreviewopeninner = iconpreviewopen.querySelector(".ui-picker-inner"); let iconpreviewclosedinner = iconpreviewclosed.querySelector(".ui-picker-inner"); let iconpreviewswitchinginner = iconpreviewswitching.querySelector(".ui-picker-inner"); BDFDB.DOMUtils.addClass(iconpreviewopen, "nopic"); iconpreviewopeninner.style.removeProperty("background-image"); BDFDB.DOMUtils.addClass(iconpreviewclosed, "nopic"); iconpreviewclosedinner.style.removeProperty("background-image"); BDFDB.DOMUtils.addClass(iconpreviewswitching, "nopic"); iconpreviewswitchinginner.style.removeProperty("background-image"); BDFDB.TimeUtils.clear(iconpreviewswitching.switchInterval); BDFDB.NotificationUtils.toast(`Custom Icon was added to selection.`, {type:"success"}); this.setIcons(modal, modal.querySelector(".ui-icon-picker-icon.selected").getAttribute("value")); } else BDFDB.NotificationUtils.toast(`Add an image for the open and the closed icon.`, {type:"danger"}); } generateID (prefix) { if (prefix == "folder") { let id = Math.floor(Math.random() * 4294967296); return BDFDB.LibraryModules.FolderStore.guildFolders.every(n => !n.folderId || n.folderId != id) ? id : this.generateID(prefix); } else { let data = BDFDB.DataUtils.load(this, prefix + "s"); let id = prefix + "_" + Math.round(Math.random()*10000000000000000); return data[id] ? this.generateID(prefix) : id; } } setIcons (modal, selection) { let wrapper = modal.querySelector(".icons"); if (!wrapper) return; BDFDB.DOMUtils.remove(wrapper.childNodes); let folderIcons = this.loadAllIcons(); for (let id in folderIcons) if (!folderIcons[id].customID) { folderIcons[id].openicon = this.createBase64SVG(folderIcons[id].openicon); folderIcons[id].closedicon = this.createBase64SVG(folderIcons[id].closedicon); } wrapper.appendChild(BDFDB.DOMUtils.create(`
${Object.getOwnPropertyNames(folderIcons).map(id => `
${folderIcons[id].customID ? '
' : ''}
`).join("")}
`)); setIcon(wrapper.querySelector(`.ui-icon-picker-icon[value="${folderIcons[selection] ? selection : -1}"]`), false, true); BDFDB.ListenerUtils.addToChildren(wrapper, "click", ".ui-icon-picker-icon", e => { if (BDFDB.DOMUtils.containsClass(e.target, BDFDB.disCN.hovercardbutton)) return; setIcon(wrapper.querySelector(".ui-icon-picker-icon.selected"), false, false); setIcon(e.currentTarget, true, true); }); BDFDB.ListenerUtils.addToChildren(wrapper, "click", BDFDB.dotCN.hovercardbutton, e => { if (BDFDB.DOMUtils.containsClass(e.currentTarget.parentElement, "selected")) return; BDFDB.DataUtils.remove(this, "customicons", e.currentTarget.getAttribute("value")); e.currentTarget.parentElement.remove(); BDFDB.NotificationUtils.toast(`Custom Icon was deleted.`, {type:"success"}); }); BDFDB.ListenerUtils.addToChildren(wrapper, "mouseenter", ".ui-icon-picker-icon", e => { setIcon(e.currentTarget, true); if (e.currentTarget.getAttribute("value") == -1) BDFDB.TooltipUtils.create(e.currentTarget, BDFDB.LanguageUtils.LanguageStrings.DEFAULT, {type:"top"}); }); BDFDB.ListenerUtils.addToChildren(wrapper, "mouseleave", ".ui-icon-picker-icon", e => { setIcon(e.currentTarget, false); }); function setIcon (icon, hover, enable) { if (!icon) return; let id = icon.getAttribute("value"); if (enable != undefined) BDFDB.DOMUtils.toggleClass(icon, "selected", enable); if (hover) { if (folderIcons[id]) icon.querySelector(".ui-picker-inner").style.setProperty("background-image", `url(${folderIcons[id].openicon})`); if (BDFDB.DOMUtils.containsClass(icon, "selected")) icon.style.setProperty("background-color", "rgb(255,255,255,0.2)"); else icon.style.setProperty("background-color", "rgb(255,255,255,0.1)"); } else { if (folderIcons[id]) icon.querySelector(".ui-picker-inner").style.setProperty("background-image", `url(${folderIcons[id].closedicon})`); if (BDFDB.DOMUtils.containsClass(icon, "selected")) icon.style.setProperty("background-color", "rgb(255,255,255,0.2)"); else icon.style.removeProperty("background-color"); } } } getState (instance) { let state = {}; for (let key in instance.props) { if (typeof instance.props[key] != "object" && typeof instance.props[key] != "function") state[key] = instance.props[key]; else if (Array.isArray(instance.props[key])) state[key] = instance.props[key].length; } return state; } getFolders () { let found = [], folders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders); for (let pos in folders) if (folders[pos].folderId) found.push(Object.assign({}, folders[pos])); return found; } getFolderOfGuildId (guildid) { if (!guildid) return null; for (let folder of BDFDB.LibraryModules.FolderStore.guildFolders) if (folder.folderId && folder.guildIds.includes(guildid)) return folder; } getFolderConfig (folderid) { let folder = BDFDB.LibraryModules.FolderStore.getGuildFolderById(folderid) || {}; let data = BDFDB.DataUtils.load(this, "folders", folderid) || { iconID: "-1", muteFolder: false, autoRead: false, copyTooltipColor: false, useCloseIcon: true, color1: null, color2: ["255","255","255"], color3: null, color4: null }; if (!data.color1) data.color1 = BDFDB.ColorUtils.convert(folder.folderColor, "RGBCOMP") || ["0","0","0"]; else if (folder.folderColor && !BDFDB.ColorUtils.compare(folder.folderColor, BDFDB.ColorUtils.convert(BDFDB.ObjectUtils.is(data.color1) ? data.color1[Object.keys(data.color1)[0]] : data.color1, "INT"))) { data.color1 = BDFDB.ColorUtils.convert(folder.folderColor, "RGBCOMP"); BDFDB.DataUtils.save(data, this, "folders", folderid); } return data; } toggleFolderContent (forceOpenClose) { if (!this.foldercontentguilds) return; forceOpenClose = forceOpenClose === undefined ? BDFDB.LibraryModules.FolderUtils.getExpandedFolders().size > 0 : forceOpenClose; BDFDB.DOMUtils.toggleClass(this.foldercontent, "foldercontentopen", forceOpenClose); BDFDB.DOMUtils.toggleClass(this.foldercontent, "foldercontentclosed", !forceOpenClose); BDFDB.DOMUtils.toggleClass(document.body, "foldercontentopened", forceOpenClose); } changeFolder (folderid, wrapper) { wrapper = wrapper || BDFDB.FolderUtils.getDiv(folderid); if (wrapper) { let folderinner = wrapper.querySelector(`${BDFDB.dotCN.guildfolderexpandendbackground} ~ ${BDFDB.dotCNS.guildouter + BDFDB.dotCN.guildinner}`); let foldericon = wrapper.querySelector(BDFDB.dotCN.guildfolder); if (folderinner && foldericon) { let folder = BDFDB.LibraryModules.FolderStore.getGuildFolderById(folderid); let data = this.getFolderConfig(folderid); BDFDB.DOMUtils.remove(folderinner.querySelectorAll(`${BDFDB.dotCN.guildupperbadge}.count`)); foldericon.parentElement.parentElement.style.removeProperty("-webkit-mask"); if (BDFDB.DataUtils.get(this, "settings", "showCountBadge")) { folderinner.appendChild(BDFDB.DOMUtils.create(`
${folder.guildIds.length}
`)); let width = folder.guildIds.length > 99 ? 36 : (folder.guildIds.length > 9 ? 30 : 24); foldericon.parentElement.parentElement.style.setProperty("-webkit-mask", `url(data:image/svg+xml;base64,${btoa(``)}) center/cover no-repeat`); } let icontype = BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folderid) ? "openicon" : "closedicon"; let folderIcons = this.loadAllIcons(); let icon = folderIcons[data.iconID] ? (!folderIcons[data.iconID].customID ? this.createBase64SVG(folderIcons[data.iconID][icontype], data.color1, data.color2) : folderIcons[data.iconID][icontype]) : null; if (icon) foldericon.style.setProperty("background-image", `url(${icon})`, "important"); else foldericon.style.removeProperty("background-image"); folderinner.removeEventListener("mouseenter", folderinner.ServerFoldersTooltipListener); folderinner.removeEventListener("mousedown", folderinner.ServerFoldersClickListener); if (data.color3 || data.color4) { var isgradient3 = data.color3 && BDFDB.ObjectUtils.is(data.color3); var isgradient4 = data.color4 && BDFDB.ObjectUtils.is(data.color4); var bgColor = data.color3 ? (!isgradient3 ? BDFDB.ColorUtils.convert(data.color3, "RGBA") : BDFDB.ColorUtils.createGradient(data.color3)) : ""; var fontColor = data.color4 ? (!isgradient4 ? BDFDB.ColorUtils.convert(data.color4, "RGBA") : BDFDB.ColorUtils.createGradient(data.color4)) : ""; var folderName = folder.folderName || BDFDB.ReactUtils.getValue(wrapper, "return.stateNode.props.defaultFolderName"); folderinner.ServerFoldersTooltipListener = () => { BDFDB.TooltipUtils.create(folderinner, isgradient4 ? `${BDFDB.StringUtils.htmlEscape(folderName)}` : folderName, {type:"right", selector:"ServerFolders-tooltip", style:`${isgradient4 ? '' : `color: ${fontColor} !important; `}background: ${bgColor} !important; border-color: ${isgradient3 ? BDFDB.ColorUtils.convert(data.color3[0], "RGBA") : bgColor} !important;`, html:isgradient3, hide:true}); }; folderinner.addEventListener("mouseenter", folderinner.ServerFoldersTooltipListener); } folderinner.ServerFoldersClickListener = () => { BDFDB.TimeUtils.clear(this.clickedFolderTimeout); this.clickedFolder = folderid; this.clickedFolderTimeout = BDFDB.TimeUtils.timeout(() => { delete this.clickedFolderTimeout; }, 3000); }; folderinner.addEventListener("mousedown", folderinner.ServerFoldersClickListener); } } } updateGuildInFolderContent (folderid, guildid) { if (!this.foldercontentguilds || !folderid || !guildid) return; let guild = BDFDB.LibraryModules.GuildStore.getGuild(guildid); let oldCopy = this.foldercontentguilds.querySelector(`.copy[guildid="${guildid}"]`); if (guild) { let newCopy = this.createCopyOfServer(folderid, guildid); if (newCopy) { if (oldCopy) this.foldercontentguilds.insertBefore(newCopy, oldCopy); else { let folder = BDFDB.LibraryModules.FolderStore.getGuildFolderById(folderid); let position = folder.guildIds.indexOf(guildid); let siblingId = position > -1 ? folder.guildIds[folder.guildIds.indexOf(guildid) + 1] : null; let insertNode = siblingId ? this.foldercontentguilds.querySelector(`[guildid="${siblingId}"][folderid="${folderid}"]`) : null; if (!insertNode) { let sameFolderEles = this.foldercontentguilds.querySelectorAll(`[folderid="${folderid}"]`); insertNode = sameFolderEles.length > 0 ? sameFolderEles[sameFolderEles.length - 1].nextSibling : null; } this.foldercontentguilds.insertBefore(newCopy, insertNode); } if (BDFDB.DOMUtils.containsClass(this.foldercontentguilds.firstElementChild, "folderseparatorouter")) BDFDB.DOMUtils.remove(this.foldercontentguilds.firstElementChild); } } BDFDB.DOMUtils.remove(oldCopy); } addSeparator (folderid) { if (!this.foldercontentguilds) return; if (!this.foldercontent.querySelector(`.folderseparatorouter[folderid="${folderid}"]`) && BDFDB.DataUtils.get(this, "settings", "addSeparators")) this.foldercontentguilds.insertBefore(BDFDB.DOMUtils.create(`
`), this.foldercontentguilds.querySelectorAll(`[folderid="${folderid}"]`)[0]); if (BDFDB.DOMUtils.containsClass(this.foldercontentguilds.firstElementChild, "folderseparatorouter")) BDFDB.DOMUtils.remove(this.foldercontentguilds.firstElementChild); } createBase64SVG (paths, color1 = "#000000", color2 = "#FFFFFF") { if (paths.indexOf("`; if (isgradient1) { svg += ``; for (let pos of Object.keys(color1).sort()) svg += ``; svg += ``; } if (isgradient2) { svg += ``; for (let pos of Object.keys(color2).sort()) svg += ``; svg += ``; } svg += `${paths.replace("REPLACE_FILL1", isgradient1 ? "url(#grad1)" : BDFDB.ColorUtils.convert(color1, "RGBA")).replace("REPLACE_FILL2", isgradient2 ? "url(#grad2)" : BDFDB.ColorUtils.convert(color2, "RGBA"))}`; return `data:image/svg+xml;base64,${btoa(svg)}`; } createCopyOfServer (folderid, guildid) { if (!folderid || !guildid) return; let guild = BDFDB.LibraryModules.GuildStore.getGuild(guildid); let guilddiv = BDFDB.GuildUtils.getDiv(guildid); let props = BDFDB.ReactUtils.getValue(guilddiv, "return.stateNode.props"); if (!guild || !guilddiv || !props) return; let guildcopy = guilddiv.cloneNode(true); let guildcopyinner = guildcopy.querySelector(BDFDB.dotCN.guildcontainer); let guildiconwrapper = guildcopy.querySelector(BDFDB.dotCN.guildiconwrapper); let guildicon = guildcopy.querySelector(BDFDB.dotCN.guildicon); let guildpillitem = guildcopy.querySelector(BDFDB.dotCN.guildpillitem); if (!guildpillitem) { guildpillitem = BDFDB.DOMUtils.create(`
`); guildcopy.insertBefore(guildpillitem, guildcopy.firstElementChild); guildpillitem = guildpillitem.firstElementChild; } guildcopy.setAttribute("guildid", guildid); guildcopy.setAttribute("folderid", folderid); guildiconwrapper.style.setProperty("border-radius", props.selected ? "30%" : "50%"); guildiconwrapper.style.setProperty("overflow", "hidden"); guildpillitem.style.setProperty("opacity", props.selected ? 1 : (props.unread ? 0.7 : 0)); guildpillitem.style.setProperty("height", props.selected ? "40px" : "8px"); guildpillitem.style.setProperty("transform", "translate3d(0px, 0px, 0px)"); guildcopy.querySelector("mask").setAttribute("id", "SERVERFOLDERSCOPY" + guildid); guildcopy.querySelector("mask path").setAttribute("d", "M0 0 l50 0l0 50l-50 0l0 -50Z"); guildcopy.querySelector("foreignObject").setAttribute("mask", "url(#SERVERFOLDERSCOPY" + guildid + ")"); BDFDB.DOMUtils.addClass(guildcopy, "copy"); BDFDB.DOMUtils.show(guildcopy); let pillvisible = guildpillitem && guildpillitem.style.getPropertyValue("opacity") != 0; let borderRadius = new BDFDB.LibraryModules.AnimationUtils.Value(0); borderRadius .interpolate({ inputRange: [0, 1], outputRange: [50, 30] }) .addListener((value) => { guildiconwrapper.style.setProperty("border-radius", `${value.value}%`); }); let pillHeight = new BDFDB.LibraryModules.AnimationUtils.Value(0); pillHeight .interpolate({ inputRange: [0, 1], outputRange: [8, 20] }) .addListener((value) => { if (guildpillitem) guildpillitem.style.setProperty("height", `${value.value}px`); }); let pillOpacity = new BDFDB.LibraryModules.AnimationUtils.Value(0); pillOpacity .interpolate({ inputRange: [0, 1], outputRange: [0, 0.7] }) .addListener((value) => { if (guildpillitem) guildpillitem.style.setProperty("opacity", `${value.value}`); }); let animate = (v) => { BDFDB.LibraryModules.AnimationUtils.parallel([ BDFDB.LibraryModules.AnimationUtils.timing(borderRadius, {toValue: v, duration: 200}), BDFDB.LibraryModules.AnimationUtils.spring(pillHeight, {toValue: v, friction: 5}) ]).start(); }; let animate2 = (v) => { BDFDB.LibraryModules.AnimationUtils.parallel([ BDFDB.LibraryModules.AnimationUtils.timing(pillOpacity, {toValue: v, duration: 200}), ]).start(); }; guildcopyinner.addEventListener("mouseenter", () => { if (!BDFDB.LibraryModules.GuildStore.getGuild(guildid)) return BDFDB.DOMUtils.remove(guildcopy); let EditServers = BDFDB.BDUtils.getPlugin("EditServers"); let ESdata = EditServers ? EditServers.getGuildData(guildid, guildcopyinner) : null; if (ESdata && (ESdata.name || ESdata.color3 || ESdata.color4)) EditServers.changeTooltip(guild, guildcopyinner, "right"); else { let folderData = BDFDB.DataUtils.load(this, "folders", folderid) || {}; let color3 = folderData.copyTooltipColor ? folderData.color3 : null; let color4 = folderData.copyTooltipColor ? folderData.color4 : null; let isgradient3 = color3 && BDFDB.ObjectUtils.is(color3); let isgradient4 = color4 && BDFDB.ObjectUtils.is(color4); let bgColor = color3 ? (!isgradient3 ? BDFDB.ColorUtils.convert(color3, "RGBA") : BDFDB.ColorUtils.createGradient(color3)) : ""; let fontColor = color4 ? (!isgradient4 ? BDFDB.ColorUtils.convert(color4, "RGBA") : BDFDB.ColorUtils.createGradient(color4)) : ""; BDFDB.TooltipUtils.create(guildcopyinner, isgradient4 ? `${BDFDB.StringUtils.htmlEscape(guild.name)}` : guild.name, {type:"right", selector:"guild-folder-tooltip", style:`${isgradient4 ? '' : 'color: ' + fontColor + ' !important; '}background: ${bgColor} !important; border-color: ${isgradient3 ? BDFDB.ColorUtils.convert(color3[0], "RGBA") : bgColor} !important;`, html:isgradient3, hide:true}); } if (guildicon && guildicon.src && guild.icon && guild.icon.startsWith("a_") && guild.features.has("ANIMATED_ICON") && guildicon.src.includes("discordapp.com/icons/")) { guildicon.src = guildicon.src.replace(".webp", ".gif"); } pillvisible = guildpillitem && guildpillitem.style.getPropertyValue("opacity") != 0; if (BDFDB.LibraryModules.LastGuildStore.getGuildId() != guildid) { animate(1); if (!pillvisible) animate2(1); } }); guildcopyinner.addEventListener("mouseleave", () => { if (guildicon && guildicon.src && guild.icon && guild.icon.startsWith("a_") && guild.features.has("ANIMATED_ICON") && guildicon.src.includes("discordapp.com/icons/") && !BDFDB.ReactUtils.getValue(BDFDB.BDUtils.getPlugin("AutoPlayGifs", true), "settings.guildList")) { guildicon.src = guildicon.src.replace(".gif", ".webp"); } if (BDFDB.LibraryModules.LastGuildStore.getGuildId() != guildid) { animate(0); if (!pillvisible) animate2(0); } }); guildcopy.addEventListener("click", e => { BDFDB.ListenerUtils.stopEvent(e); if (BDFDB.pressedKeys.includes(46)) this.removeGuildFromFolder(folderid, guildid); else { BDFDB.LibraryModules.GuildUtils.transitionToGuildSync(guild.id); let settings = BDFDB.DataUtils.get(this, "settings"); if (settings.closeAllFolders) for (let openFolderId of BDFDB.LibraryModules.FolderUtils.getExpandedFolders()) if (openFolderId != folderid || !settings.forceOpenFolder) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId); else if (settings.closeTheFolder && !settings.forceOpenFolder && BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folderid)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folderid); } }); guildcopy.addEventListener("contextmenu", e => { BDFDB.GuildUtils.openMenu(guilddiv, e); }); guildcopy.addEventListener("mousedown", e => { let x = e.pageX, y = e.pageY; let mousemove = e2 => { if (Math.sqrt((x - e2.pageX)**2) > 20 || Math.sqrt((y - e2.pageY)**2) > 20) { document.removeEventListener("mousemove", mousemove); document.removeEventListener("mouseup", mouseup); let hovcopy = null; let placeholder = BDFDB.DOMUtils.create(this.dragPlaceholderMarkup); let dragpreview = this.createDragPreview(guilddiv, e); let dragging = e3 => { BDFDB.DOMUtils.remove(placeholder); BDFDB.DOMUtils.hide(guildcopy); this.updateDragPreview(dragpreview, e3); if (this.foldercontent.contains(e3.target)) { hovcopy = BDFDB.DOMUtils.getParent(BDFDB.dotCN.guildouter, e3.target); if (hovcopy && hovcopy.getAttribute("folderid") == folderid) this.foldercontentguilds.insertBefore(placeholder, hovcopy.nextSibling); else hovcopy = null; } }; let releasing = e3 => { document.removeEventListener("mousemove", dragging); document.removeEventListener("mouseup", releasing); BDFDB.DOMUtils.remove(placeholder, dragpreview); BDFDB.DOMUtils.show(guildcopy); let dropfolderdiv = BDFDB.DOMUtils.getParent(BDFDB.dotCN.guildfolderwrapper, e3.target); let newfolderid = dropfolderdiv ? BDFDB.FolderUtils.getId(dropfolderdiv) : null; if (newfolderid) { if (newfolderid != folderid) { BDFDB.DOMUtils.remove(guildcopy); this.addGuildToFolder(newfolderid, guildid); } } else if (hovcopy) { this.foldercontentguilds.insertBefore(guildcopy, hovcopy.nextSibling); this.updateGuildPositions(folderid); } }; 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); }); guildcopy.querySelector("a").setAttribute("draggable", false); return guildcopy; } updateGuildPositions (folderid) { let oldGuildFolders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders); let guildFolders = [], guildPositions = []; for (let i in oldGuildFolders) { if (oldGuildFolders[i].folderId) { let newFolder = Object.assign({}, oldGuildFolders[i]); if (oldGuildFolders[i].folderId == folderid) { let sameFolderGuilds = this.foldercontentguilds.querySelectorAll(`[guildid][folderid="${folderid}"]`); if (sameFolderGuilds.length > 0) { newFolder.guildIds = []; for (let guilddiv of sameFolderGuilds) newFolder.guildIds.push(guilddiv.getAttribute("guildid")); } } guildFolders.push(newFolder); } else guildFolders.push(oldGuildFolders[i]); } for (let i in guildFolders) for (let guildid of guildFolders[i].guildIds) guildPositions.push(guildid); BDFDB.LibraryModules.SettingsUtils.updateRemoteSettings({guildPositions, guildFolders}); } openFolderCreationMenu (guilds, initguildid) { let modal = BDFDB.DOMUtils.create(`

${this.labels.serversubmenu_createfolder_text}

`); let targetedguildsids = {}; let container = modal.querySelector(".entries"); BDFDB.ListenerUtils.addToChildren(modal, "click", ".btn-done", () => { let ids = []; for (let id in targetedguildsids) if (targetedguildsids[id]) ids.push(id); this.createFolder(ids); }); for (let guild of guilds) { if (container.firstElementChild) container.appendChild(BDFDB.DOMUtils.create(`
`)); let entry = BDFDB.DOMUtils.create(`
${BDFDB.GuildUtils.createCopy(guild.id, {size: 48}).outerHTML}

${BDFDB.StringUtils.htmlEscape(guild.name)}

`); container.appendChild(entry); let switchinput = entry.querySelector(BDFDB.dotCN.switchinner); switchinput.checked = guild.id == initguildid; targetedguildsids[guild.id] = guild.id == initguildid; switchinput.addEventListener("click", e => { targetedguildsids[guild.id] = !targetedguildsids[guild.id]; }); } BDFDB.appendModal(modal); } createFolder (guildids) { if (!guildids) return; guildids = Array.isArray(guildids) ? guildids : Array.from(guildids); if (!guildids.length) return; let oldGuildFolders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders); let guildFolders = [], guildPositions = [], added = false; for (let i in oldGuildFolders) { if (!oldGuildFolders[i].folderId && guildids.includes(oldGuildFolders[i].guildIds[0])) { if (!added) { added = true; guildFolders.push({ guildIds: guildids, folderId: this.generateID("folder") }); } } else guildFolders.push(oldGuildFolders[i]); } for (let i in guildFolders) for (let guildid of guildFolders[i].guildIds) guildPositions.push(guildid); BDFDB.LibraryModules.SettingsUtils.updateRemoteSettings({guildPositions, guildFolders}); } removeFolder (folderid) { BDFDB.DataUtils.remove(this, "folders", folderid); BDFDB.DOMUtils.remove(this.foldercontentguilds.querySelector(`${BDFDB.dotCN.guildouter}[folderid="${folderid}"]`)); let oldGuildFolders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders); let guildFolders = [], guildPositions = []; for (let i in oldGuildFolders) { if (oldGuildFolders[i].folderId == folderid) { for (let guildid of oldGuildFolders[i].guildIds) guildFolders.push({guildIds:[guildid]}); } else guildFolders.push(oldGuildFolders[i]); } for (let i in guildFolders) for (let guildid of guildFolders[i].guildIds) guildPositions.push(guildid); BDFDB.LibraryModules.SettingsUtils.updateRemoteSettings({guildPositions, guildFolders}); this.toggleFolderContent(); } addGuildToFolder (folderid, guildid) { let oldGuildFolders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders); let guildFolders = [], guildPositions = []; for (let i in oldGuildFolders) { if (oldGuildFolders[i].folderId) { let newFolder = Object.assign({}, oldGuildFolders[i]); if (oldGuildFolders[i].folderId == folderid) newFolder.guildIds.push(guildid); else BDFDB.ArrayUtils.remove(newFolder.guildIds, guildid); guildFolders.push(newFolder); } else if (oldGuildFolders[i].guildIds[0] != guildid) guildFolders.push(oldGuildFolders[i]); } for (let i in guildFolders) for (let guildid of guildFolders[i].guildIds) guildPositions.push(guildid); BDFDB.LibraryModules.SettingsUtils.updateRemoteSettings({guildPositions, guildFolders}); } removeGuildFromFolder (folderid, guildid) { BDFDB.DOMUtils.remove(this.foldercontentguilds.querySelector(`${BDFDB.dotCN.guildouter}[folderid="${folderid}"][guildid="${guildid}"]`)); let sameFolderEles = this.foldercontentguilds.querySelectorAll(`[folderid="${folderid}"]`); if (sameFolderEles.length == 1 && BDFDB.DOMUtils.containsClass(sameFolderEles[0], "folderseparatorouter")) BDFDB.DOMUtils.remove(sameFolderEles[0]); let oldGuildFolders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders); let guildFolders = [], guildPositions = []; for (let i in oldGuildFolders) { if (oldGuildFolders[i].folderId == folderid) { let newFolder = Object.assign({}, oldGuildFolders[i]); BDFDB.ArrayUtils.remove(newFolder.guildIds, guildid); guildFolders.push(newFolder); guildFolders.push({guildIds:[guildid]}); } else guildFolders.push(oldGuildFolders[i]); } for (let i in guildFolders) for (let guildid of guildFolders[i].guildIds) guildPositions.push(guildid); BDFDB.LibraryModules.SettingsUtils.updateRemoteSettings({guildPositions, guildFolders}); this.toggleFolderContent(); } createDragPreview (div, e) { if (!Node.prototype.isPrototypeOf(div)) return; let dragpreview = div.cloneNode(true); BDFDB.DOMUtils.addClass(dragpreview, "serverfolders-dragpreview"); BDFDB.DOMUtils.hide(dragpreview); dragpreview.style.setProperty("pointer-events", "none", "important"); dragpreview.style.setProperty("left", e.clientX - 25 + "px", "important"); dragpreview.style.setProperty("top", e.clientY - 25 + "px", "important"); document.querySelector(BDFDB.dotCN.appmount).appendChild(dragpreview); return dragpreview; } updateDragPreview (dragpreview, e) { if (!Node.prototype.isPrototypeOf(dragpreview)) return; BDFDB.DOMUtils.show(dragpreview); dragpreview.style.setProperty("left", e.clientX - 25 + "px", "important"); dragpreview.style.setProperty("top", e.clientY - 25 + "px", "important"); } setLabelsByLanguage () { switch (BDFDB.LanguageUtils.getLanguage().id) { case "hr": //croatian return { servercontext_serverfolders_text: "Poslužitelj mapu", serversubmenu_createfolder_text: "Izradi mapu", serversubmenu_addtofolder_text: "Dodaj poslužitelj u mapu", serversubmenu_removefromfolder_text: "Ukloni poslužitelj iz mapu", foldercontext_autoreadfolder_text: "Auto: Označite kao pročitano", foldercontext_mutefolder_text: "Isključite mapu", foldercontext_removefolder_text: "Izbriši mapu", modal_tabheader1_text: "Mape", modal_tabheader2_text: "Boja mape", modal_tabheader3_text: "Boja tooltip", modal_tabheader4_text: "Prilagođeni ikona", modal_iconpicker_text: "Odabir mape", modal_usecloseicon_text: "Koristite zatvorenu ikonu umjesto minisevera", modal_copytooltipcolor_text: "Koristite iste boje za poslužitelj u mapi", modal_colorpicker1_text: "Boja primarne mape", modal_colorpicker2_text: "Boja sekundarne mape", modal_colorpicker3_text: "Boja tooltip", modal_colorpicker4_text: "Boja fonta", modal_customopen_text: "Otvori ikona", modal_customclosed_text: "Zatvorena ikona", modal_custompreview_text: "Pregled ikona" }; case "da": //danish return { servercontext_serverfolders_text: "Servermapper", serversubmenu_createfolder_text: "Opret mappe", serversubmenu_addtofolder_text: "Tilføj server til mappe", serversubmenu_removefromfolder_text: "Fjern server fra mappe", foldercontext_autoreadfolder_text: "Auto: Markér som læst", foldercontext_mutefolder_text: "Dæmp mappe", foldercontext_removefolder_text: "Slet mappe", modal_tabheader1_text: "Mappe", modal_tabheader2_text: "Mappefarve", modal_tabheader3_text: "Tooltipfarve", modal_tabheader4_text: "Brugerdefinerede ikoner", modal_iconpicker_text: "Mappevalg", modal_usecloseicon_text: "Brug et lukket ikon i stedet for miniserverne", modal_copytooltipcolor_text: "Brug de samme farver til server på mappen", modal_colorpicker1_text: "Primær mappefarve", modal_colorpicker2_text: "Sekundær mappefarve", modal_colorpicker3_text: "Tooltipfarve", modal_colorpicker4_text: "Skriftfarve", modal_customopen_text: "Åbn ikon", modal_customclosed_text: "Lukket ikon", modal_custompreview_text: "Ikon forhåndsvisning" }; case "de": //german return { servercontext_serverfolders_text: "Serverordner", serversubmenu_createfolder_text: "Ordner erzeugen", serversubmenu_addtofolder_text: "Server zum Ordner hinzufügen", serversubmenu_removefromfolder_text: "Server aus Ordner entfernen", foldercontext_autoreadfolder_text: "Auto: Als gelesen markieren", foldercontext_mutefolder_text: "Ordner stummschalten", foldercontext_removefolder_text: "Ordner löschen", modal_tabheader1_text: "Ordner", modal_tabheader2_text: "Ordnerfarbe", modal_tabheader3_text: "Tooltipfarbe", modal_tabheader4_text: "Eigene Icons", modal_iconpicker_text: "Ordnerauswahl", modal_usecloseicon_text: "Verwende anstelle der Miniserver ein geschlossenes Symbol", modal_copytooltipcolor_text: "Verwende dieselbe Farbe für alle Server eines Ordners", modal_colorpicker1_text: "Primäre Ordnerfarbe", modal_colorpicker2_text: "Sekundäre Ordnerfarbe", modal_colorpicker3_text: "Tooltipfarbe", modal_colorpicker4_text: "Schriftfarbe", modal_customopen_text: "Geöffnetes Icon", modal_customclosed_text: "Geschlossenes Icon", modal_custompreview_text: "Iconvorschau" }; case "es": //spanish return { servercontext_serverfolders_text: "Carpetas de servidor", serversubmenu_createfolder_text: "Crear carpeta", serversubmenu_addtofolder_text: "Añadir servidor a la carpeta", serversubmenu_removefromfolder_text: "Eliminar servidor de la carpeta", foldercontext_autoreadfolder_text: "Auto: Marcar como leído", foldercontext_mutefolder_text: "Silenciar carpeta", foldercontext_removefolder_text: "Eliminar carpeta", modal_tabheader1_text: "Carpeta", modal_tabheader2_text: "Color de carpeta", modal_tabheader3_text: "Color de tooltip", modal_tabheader4_text: "Iconos personalizados", modal_iconpicker_text: "Selección de carpeta", modal_usecloseicon_text: "Use un icono cerrado en lugar de los miniservidores", modal_copytooltipcolor_text: "Usa los mismos colores para el servidor de la carpeta", modal_colorpicker1_text: "Color primaria de carpeta", modal_colorpicker2_text: "Color secundario de la carpeta", modal_colorpicker3_text: "Color de tooltip", modal_colorpicker4_text: "Color de fuente", modal_customopen_text: "Ícono abierto", modal_customclosed_text: "Icono cerrado", modal_custompreview_text: "Vista previa del icono" }; case "fr": //french return { servercontext_serverfolders_text: "Dossiers du serveur", serversubmenu_createfolder_text: "Créer le dossier", serversubmenu_addtofolder_text: "Ajouter le serveur à un dossier", serversubmenu_removefromfolder_text: "Supprimer le serveur du dossier", foldercontext_autoreadfolder_text: "Auto: Marquer comme lu", foldercontext_mutefolder_text: "Rendre muet le dossier", foldercontext_removefolder_text: "Supprimer le dossier", modal_tabheader1_text: "Dossier", modal_tabheader2_text: "Couleur du dossier", modal_tabheader3_text: "Couleur de tooltip", modal_tabheader4_text: "Icônes personnalisées", modal_iconpicker_text: "Choix du dossier", modal_usecloseicon_text: "Utilisez une icône fermée à la place des mini-serveurs", modal_copytooltipcolor_text: "Utilisez les mêmes couleurs pour le serveur du dossier", modal_colorpicker1_text: "Couleur primaire du dossier", modal_colorpicker2_text: "Couleur secondaire du dossier", modal_colorpicker3_text: "Couleur de tooltip", modal_colorpicker4_text: "Couleur de la police", modal_customopen_text: "Icône ouverte", modal_customclosed_text: "Icône fermée", modal_custompreview_text: "Aperçu de l'icône" }; case "it": //italian return { servercontext_serverfolders_text: "Cartelle del server", serversubmenu_addtofolder_text: "Aggiungi il server alla cartella", serversubmenu_createfolder_text: "Creare una cartella", serversubmenu_removefromfolder_text: "Rimuovi il server dalla cartella", foldercontext_autoreadfolder_text: "Auto: Contrassegna come letto", foldercontext_mutefolder_text: "Disattiva cartella", foldercontext_removefolder_text: "Elimina cartella", modal_tabheader1_text: "Cartella", modal_tabheader2_text: "Colore della cartella", modal_tabheader3_text: "Colore della tooltip", modal_tabheader4_text: "Icone personalizzate", modal_iconpicker_text: "Selezione della cartella", modal_usecloseicon_text: "Utilizzare un'icona chiusa anziché i mini server", modal_copytooltipcolor_text: "Usa gli stessi colori per il server della cartella", modal_colorpicker1_text: "Colore primaria della cartella", modal_colorpicker2_text: "Colore secondaria della cartella", modal_colorpicker3_text: "Colore della tooltip", modal_colorpicker4_text: "Colore del carattere", modal_customopen_text: "Icona aperta", modal_customclosed_text: "Icona chiusa", modal_custompreview_text: "Icona anteprima" }; case "nl": //dutch return { servercontext_serverfolders_text: "Servermappen", serversubmenu_addtofolder_text: "Voeg server toe aan de map", serversubmenu_createfolder_text: "Map aanmaken", serversubmenu_removefromfolder_text: "Verwijder de server uit de map", foldercontext_autoreadfolder_text: "Auto: Markeren als gelezen", foldercontext_mutefolder_text: "Demp map", foldercontext_removefolder_text: "Verwijder map", modal_tabheader1_text: "Map", modal_tabheader2_text: "Mapkleur", modal_tabheader3_text: "Tooltipkleur", modal_tabheader4_text: "Aangepaste keuze", modal_iconpicker_text: "Map keuze", modal_usecloseicon_text: "Gebruik een gesloten keuze in plaats van de miniservers", modal_copytooltipcolor_text: "Gebruik dezelfde kleuren voor de server van de map", modal_colorpicker1_text: "Primaire mapkleur", modal_colorpicker2_text: "Tweede mapkleur", modal_colorpicker3_text: "Tooltipkleur", modal_colorpicker4_text: "Doopvontkleur", modal_customopen_text: "Geopende keuze", modal_customclosed_text: "Gesloten keuze", modal_custompreview_text: "Voorbeeld van keuze" }; case "no": //norwegian return { servercontext_serverfolders_text: "Servermapper", serversubmenu_addtofolder_text: "Legg til server i mappe", serversubmenu_createfolder_text: "Lag mappe", serversubmenu_removefromfolder_text: "Fjern server fra mappe", foldercontext_autoreadfolder_text: "Auto: Merk som les", foldercontext_mutefolder_text: "Demp mappe", foldercontext_removefolder_text: "Slett mappe", modal_tabheader1_text: "Mappe", modal_tabheader2_text: "Mappefarge", modal_tabheader3_text: "Tooltipfarge", modal_tabheader4_text: "Tilpassede ikoner", modal_iconpicker_text: "Mappevalg", modal_usecloseicon_text: "Bruk et lukket ikon i stedet for minitjenerne", modal_copytooltipcolor_text: "Bruk de samme fargene til serveren til mappen", modal_colorpicker1_text: "Primær mappefarge", modal_colorpicker2_text: "Sekundær mappefarge", modal_colorpicker3_text: "Tooltipfarge", modal_colorpicker4_text: "Skriftfarge", modal_customopen_text: "Åpnet ikon", modal_customclosed_text: "Lukket ikon", modal_custompreview_text: "Ikon forhåndsvisning" }; case "pl": //polish return { servercontext_serverfolders_text: "Foldery serwera", serversubmenu_addtofolder_text: "Dodaj serwer do folderu", serversubmenu_createfolder_text: "Utwórz folder", serversubmenu_removefromfolder_text: "Usuń serwer z folderu", foldercontext_autoreadfolder_text: "Auto: Oznacz jako przeczytane", foldercontext_mutefolder_text: "Wycisz folder", foldercontext_removefolder_text: "Usuń folder", modal_tabheader1_text: "Folder", modal_tabheader2_text: "Kolor folderu", modal_tabheader3_text: "Kolor podpowiedzi", modal_tabheader4_text: "Niestandardowe ikony", modal_iconpicker_text: "Wybór folderu", modal_usecloseicon_text: "Użyj zamkniętej ikony zamiast mini serwerów", modal_copytooltipcolor_text: "Użyj tych samych kolorów dla serwera folderu", modal_colorpicker1_text: "Podstawowy kolor folderu", modal_colorpicker2_text: "Drugorzędny kolor folderu", modal_colorpicker3_text: "Kolor podpowiedzi", modal_colorpicker4_text: "Kolor czcionki", modal_customopen_text: "Otwarta ikona", modal_customclosed_text: "Zamknięta ikona", modal_custompreview_text: "Podgląd ikony" }; case "pt-BR": //portuguese (brazil) return { servercontext_serverfolders_text: "Pastas de servidores", serversubmenu_addtofolder_text: "Adicionar servidor à pasta", serversubmenu_createfolder_text: "Criar pasta", serversubmenu_removefromfolder_text: "Remover servidor da pasta", foldercontext_autoreadfolder_text: "Auto: Marcar como lido", foldercontext_mutefolder_text: "Silenciar pasta", foldercontext_removefolder_text: "Excluir pasta", modal_tabheader1_text: "Pasta", modal_tabheader2_text: "Cor da pasta", modal_tabheader3_text: "Cor da tooltip", modal_tabheader4_text: "Ícones personalizados", modal_iconpicker_text: "Escolha da pasta", modal_usecloseicon_text: "Use um ícone fechado em vez dos mini servidores", modal_copytooltipcolor_text: "Use as mesmas cores para o servidor da pasta", modal_colorpicker1_text: "Cor primária da pasta", modal_colorpicker2_text: "Cor secundária da pasta", modal_colorpicker3_text: "Cor da tooltip", modal_colorpicker4_text: "Cor da fonte", modal_customopen_text: "Ícone aberto", modal_customclosed_text: "Ícone fechado", modal_custompreview_text: "Pré-visualização de ícones" }; case "fi": //finnish return { servercontext_serverfolders_text: "Palvelinkansiot", serversubmenu_addtofolder_text: "Lisää palvelin kansioon", serversubmenu_createfolder_text: "Luo kansio", serversubmenu_removefromfolder_text: "Poista palvelin kansioon", foldercontext_autoreadfolder_text: "Auto: merkitse luettavaksi", foldercontext_mutefolder_text: "Mykistä kansio", foldercontext_removefolder_text: "Poista kansio", modal_tabheader1_text: "Kansio", modal_tabheader2_text: "Kansionväri", modal_tabheader3_text: "Tooltipväri", modal_tabheader4_text: "Mukautetut kuvakkeet", modal_iconpicker_text: "Kansion valinta", modal_usecloseicon_text: "Käytä suljettua kuvaketta minipalvelimien sijasta", modal_copytooltipcolor_text: "Käytä samoja värejä kansion palvelimelle", modal_colorpicker1_text: "Ensisijainen kansionväri", modal_colorpicker2_text: "Toissijainen kansionväri", modal_colorpicker3_text: "Tooltipväri", modal_colorpicker4_text: "Fontinväri", modal_customopen_text: "Avattu kuvake", modal_customclosed_text: "Suljettu kuvake", modal_custompreview_text: "Kuvakkeen esikatselu" }; case "sv": //swedish return { servercontext_serverfolders_text: "Servermappar", serversubmenu_addtofolder_text: "Lägg till server i mapp", serversubmenu_createfolder_text: "Skapa mapp", serversubmenu_removefromfolder_text: "Ta bort servern från mappen", foldercontext_autoreadfolder_text: "Auto: Markera som Läs", foldercontext_mutefolder_text: "Stäng mapp", foldercontext_removefolder_text: "Ta bort mapp", modal_tabheader1_text: "Mapp", modal_tabheader2_text: "Mappfärg", modal_tabheader3_text: "Tooltipfärg", modal_tabheader4_text: "Anpassade ikoner", modal_iconpicker_text: "Mappval", modal_usecloseicon_text: "Använd en stängd ikon istället för miniservrarna", modal_copytooltipcolor_text: "Använd samma färger för mappen på mappen", modal_colorpicker1_text: "Primär mappfärg", modal_colorpicker2_text: "Sekundär mappfärg", modal_colorpicker3_text: "Tooltipfärg", modal_colorpicker4_text: "Fontfärg", modal_customopen_text: "Öppnad ikon", modal_customclosed_text: "Closed Icon", modal_custompreview_text: "Ikon förhandsvisning" }; case "tr": //turkish return { servercontext_serverfolders_text: "Sunucu klasörleri", serversubmenu_addtofolder_text: "Klasöre sunucu ekle", serversubmenu_createfolder_text: "Klasör oluşturun", serversubmenu_removefromfolder_text: "Sunucuyu klasörden kaldır", foldercontext_autoreadfolder_text: "Oto: Okundu Olarak İşaretle", foldercontext_mutefolder_text: "Klasörü kapat", foldercontext_removefolder_text: "Klasörü sil", modal_tabheader1_text: "Klasör", modal_tabheader2_text: "Klasör rengi", modal_tabheader3_text: "Tooltip rengi", modal_tabheader4_text: "Özel simgeler", modal_iconpicker_text: "Klasör seçimi", modal_usecloseicon_text: "Mini sunucular yerine kapalı bir simge kullanın", modal_copytooltipcolor_text: "Klasörün sunucusu için aynı renkleri kullanın", modal_colorpicker1_text: "Birincil klasör rengi", modal_colorpicker2_text: "İkincil klasör rengi", modal_colorpicker3_text: "Tooltip rengi", modal_colorpicker4_text: "Yazı rengi", modal_customopen_text: "Açılmış simge", modal_customclosed_text: "Kapalı simge", modal_custompreview_text: "Simge önizleme" }; case "cs": //czech return { servercontext_serverfolders_text: "Složky serveru", serversubmenu_addtofolder_text: "Přidat server do složky", serversubmenu_createfolder_text: "Vytvořit složky", serversubmenu_removefromfolder_text: "Odebrat server ze složky", foldercontext_autoreadfolder_text: "Auto: Označit jako přečtené", foldercontext_mutefolder_text: "Ztlumte složky", foldercontext_removefolder_text: "Smazat složky", modal_tabheader1_text: "Složky", modal_tabheader2_text: "Barva složky", modal_tabheader3_text: "Barva tooltip", modal_tabheader4_text: "Vlastní ikony", modal_iconpicker_text: "Volba složky", modal_usecloseicon_text: "Místo mini serverů použijte uzavřenou ikonu", modal_copytooltipcolor_text: "Použijte stejné barvy pro server složky", modal_colorpicker1_text: "Primární barva složky", modal_colorpicker2_text: "Sekundární barva složky", modal_colorpicker3_text: "Barva tooltip", modal_colorpicker4_text: "Barva fontu", modal_customopen_text: "Otevřená ikona", modal_customclosed_text: "Uzavřená ikona", modal_custompreview_text: "Náhled ikony" }; case "bg": //bulgarian return { servercontext_serverfolders_text: "Сървърни папки", serversubmenu_addtofolder_text: "Добавяне на сървър в папка", serversubmenu_createfolder_text: "Създай папка", serversubmenu_removefromfolder_text: "Премахване на сървър от папка", foldercontext_autoreadfolder_text: "Авто: Маркиране като четене", foldercontext_mutefolder_text: "Заглушаване на папката", foldercontext_removefolder_text: "Изтриване на папка", modal_tabheader1_text: "Папка", modal_tabheader2_text: "Цвят на папка", modal_tabheader3_text: "Цвят на подсказка", modal_tabheader4_text: "Персонализирани икони", modal_iconpicker_text: "Избор на папки", modal_usecloseicon_text: "Използвайте затворена икона вместо мини сървърите", modal_copytooltipcolor_text: "Използвайте същите цветове за сървъра на папката", modal_colorpicker1_text: "Цвят основнен на папка", modal_colorpicker2_text: "цвят вторичен на папка", modal_colorpicker3_text: "Цвят на подсказка", modal_colorpicker4_text: "Цвят на шрифта", modal_customopen_text: "Отворена икона", modal_customclosed_text: "Затворена икона", modal_custompreview_text: "Икона Преглед" }; case "ru": //russian return { servercontext_serverfolders_text: "Папки сервера", serversubmenu_addtofolder_text: "Добавить сервер в папку", serversubmenu_createfolder_text: "Создать папки", serversubmenu_removefromfolder_text: "Удалить сервер из папки", foldercontext_autoreadfolder_text: "Авто: Отметить как прочитанное", foldercontext_mutefolder_text: "Отключить папки", foldercontext_removefolder_text: "Удалить папки", modal_tabheader1_text: "Папка", modal_tabheader2_text: "Цвет папки", modal_tabheader3_text: "Цвет подсказка", modal_tabheader4_text: "Пользовательские значки", modal_iconpicker_text: "Выбор папки", modal_usecloseicon_text: "Используйте закрытую иконку вместо мини-серверов", modal_copytooltipcolor_text: "Используйте те же цвета для сервера папки", modal_colorpicker1_text: "Цвет основной папки", modal_colorpicker2_text: "Цвет вторичной папки", modal_colorpicker3_text: "Цвет подсказка", modal_colorpicker4_text: "Цвет шрифта", modal_customopen_text: "Открытая иконка", modal_customclosed_text: "Закрытая иконка", modal_custompreview_text: "Иконка Просмотр" }; case "uk": //ukrainian return { servercontext_serverfolders_text: "Папки сервера", serversubmenu_addtofolder_text: "Додати сервер до папки", serversubmenu_createfolder_text: "Створити папки", serversubmenu_removefromfolder_text: "Видалити папку з папки", foldercontext_autoreadfolder_text: "Авто: Позначити як прочитане", foldercontext_mutefolder_text: "Відключення папки", foldercontext_removefolder_text: "Видалити папки", modal_tabheader1_text: "Папки", modal_tabheader2_text: "Колір папки", modal_tabheader3_text: "Колір підказка", modal_tabheader4_text: "Користувальницькі іконки", modal_iconpicker_text: "Вибір папки", modal_usecloseicon_text: "Використовуйте закритий значок замість міні-серверів", modal_copytooltipcolor_text: "Використовуйте ті ж кольори для сервера папки", modal_colorpicker1_text: "Колір основної папки", modal_colorpicker2_text: "Колір вторинного папки", modal_colorpicker3_text: "Колір підказка", modal_colorpicker4_text: "Колір шрифту", modal_customopen_text: "Відкрита ікона", modal_customclosed_text: "Закрита ікона", modal_custompreview_text: "Піктограма попереднього перегляду" }; case "ja": //japanese return { servercontext_serverfolders_text: "サーバーフォルダ", serversubmenu_addtofolder_text: "サーバーをフォルダに追加する", serversubmenu_createfolder_text: "フォルダーを作る", serversubmenu_removefromfolder_text: "サーバーをフォルダから削除する", foldercontext_autoreadfolder_text: "自動: 読み取りとしてマークする", foldercontext_mutefolder_text: "ミュートフォルダー", foldercontext_removefolder_text: "フォルダを削除する", modal_tabheader1_text: "フォルダ", modal_tabheader2_text: "フォルダの色", modal_tabheader3_text: "ツールチップの色", modal_tabheader4_text: "カスタムアイコン", modal_iconpicker_text: "フォルダの選択", modal_usecloseicon_text: "ミニサーバーの代わりに閉じたアイコンを使用する", modal_copytooltipcolor_text: "フォルダのサーバーに同じ色を使う", modal_colorpicker1_text: "プライマリフォルダの色", modal_colorpicker2_text: "セカンダリフォルダの色", modal_colorpicker3_text: "ツールチップの色", modal_colorpicker4_text: "フォントの色", modal_customopen_text: "開いたアイコン", modal_customclosed_text: "クローズドアイコン", modal_custompreview_text: "アイコンのプレビュー" }; case "zh-TW": //chinese (traditional) return { servercontext_serverfolders_text: "服務器文件夾", serversubmenu_addtofolder_text: "添加服務器到文件夾", serversubmenu_createfolder_text: "創建文件夾", serversubmenu_removefromfolder_text: "從文件夾中刪除服務器", foldercontext_autoreadfolder_text: "自動: 標記為已讀", foldercontext_mutefolder_text: "靜音文件夾", foldercontext_removefolder_text: "刪除文件夾", modal_tabheader1_text: "夾", modal_tabheader2_text: "文件夾顏色", modal_tabheader3_text: "工具提示顏色", modal_tabheader4_text: "自定義圖標", modal_iconpicker_text: "文件夾選擇", modal_usecloseicon_text: "使用關閉的圖標代替迷你服務器", modal_copytooltipcolor_text: "對文件夾的服務器使用相同的顏色", modal_colorpicker1_text: "主文件夾顏色", modal_colorpicker2_text: "輔助文件夾顏色", modal_colorpicker3_text: "工具提示顏色", modal_colorpicker4_text: "字體顏色", modal_customopen_text: "打開的圖標", modal_customclosed_text: "封閉的圖標", modal_custompreview_text: "圖標預覽" }; case "ko": //korean return { servercontext_serverfolders_text: "서버 폴더", serversubmenu_addtofolder_text: "폴더에 서버 추가", serversubmenu_createfolder_text: "폴더 만들기", serversubmenu_removefromfolder_text: "폴더에서 서버 제거", foldercontext_autoreadfolder_text: "자동: 읽은 상태로 표시", foldercontext_mutefolder_text: "폴더 음소거", foldercontext_removefolder_text: "폴더 삭제", modal_tabheader1_text: "폴더", modal_tabheader2_text: "폴더 색", modal_tabheader3_text: "툴팁 색깔", modal_tabheader4_text: "사용자 정의 아이콘", modal_iconpicker_text: "폴더 선택", modal_usecloseicon_text: "미니 서버 대신 닫힌 아이콘을 사용하십시오", modal_copytooltipcolor_text: "폴더의 서버에 대해 동일한 색상을 사용하십시오.", modal_colorpicker1_text: "기본 폴더 색", modal_colorpicker2_text: "보조 폴더 색", modal_colorpicker3_text: "툴팁 색깔", modal_colorpicker4_text: "글꼴 색깔", modal_customopen_text: "열린 아이콘", modal_customclosed_text: "닫힌 아이콘", modal_custompreview_text: "아이콘 미리보기" }; default: //default: english return { servercontext_serverfolders_text: "Serverfolders", serversubmenu_addtofolder_text: "Add Server to Folder", serversubmenu_createfolder_text: "Create Folder", serversubmenu_removefromfolder_text: "Remove Server from Folder", foldercontext_autoreadfolder_text: "Auto: Mark As Read", foldercontext_mutefolder_text: "Mute Folder", foldercontext_removefolder_text: "Delete Folder", modal_tabheader1_text: "Folder", modal_tabheader2_text: "Foldercolor", modal_tabheader3_text: "Tooltipcolor", modal_tabheader4_text: "Custom Icons", modal_iconpicker_text: "Folderchoice", modal_usecloseicon_text: "Use a closed Icon instead of the Mini-Servers", modal_copytooltipcolor_text: "Use same Colors for Servers of the Folder", modal_colorpicker1_text: "Primary Foldercolor", modal_colorpicker2_text: "Secondary Foldercolor", modal_colorpicker3_text: "Tooltipcolor", modal_colorpicker4_text: "Fontcolor", modal_customopen_text: "Open Icon", modal_customclosed_text: "Closed Icon", modal_custompreview_text: "Iconpreview" }; } } }