//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.5.7";} 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 = { "improved":[["Native Folder Support","Yes, it's here finally. ServerFolders now uses native Folders to emulate the old ServerFolders behaviour. This means you can now finally organize your Servers in Folders the old way without loosing the support on your phone. Everything should be working as it's used to. Below is a list of stuff that is NEW"],["Folder Creation","Instead of creating a Folder with the targeted Server, a menu now opens that let's you select which Servers you want to add to the Folder before you create it"]], "fixed":[["Fixed?","Added back the option to create a Folder via the contextmenu, the amount of people which won't know how to create native Folders is worrying"],["Theme Issues","Fixed some theme issues with themes like ClearVision"],["Settings","Some fixes with the closing behaviour settings"]] }; this.labels = {}; 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.getAllData(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.htmlToElement(settingshtml); BDFDB.initElements(settingspanel, this); BDFDB.addEventListener(this, settingspanel, "click", ".removecustom-button", () => { BDFDB.openConfirmModal(this, "Are you sure you want to remove all custom icons?", () => { BDFDB.removeAllData(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.js"); libraryScript.setAttribute("date", performance.now()); libraryScript.addEventListener("load", () => {this.initialize();}); document.head.appendChild(libraryScript); this.libLoadTimeout = setTimeout(() => { libraryScript.remove(); BDFDB.LibraryRequires.request("https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js", (error, response, body) => { if (body) { libraryScript = document.createElement("script"); libraryScript.setAttribute("id", "BDFDBLibraryScript"); libraryScript.setAttribute("type", "text/javascript"); libraryScript.setAttribute("date", performance.now()); libraryScript.innerText = body; document.head.appendChild(libraryScript); } this.initialize(); }); }, 15000); } else if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) this.initialize(); this.startTimeout = setTimeout(() => {this.initialize();}, 30000); } initialize () { if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) { if (this.started) return; BDFDB.loadMessage(this); // REMOVE 08.10.2019 let foldersdata = BDFDB.sortObject(BDFDB.loadAllData(this, "folders"), "position"); let folders = Object.keys(foldersdata).filter(n => n.indexOf("folder") == 0); if (folders.length) BDFDB.openConfirmModal(this, `Old ServerFolders data detected!\nFound ${folders.length} old custom folders in the ServerFolders.config.json.\nPress the '${BDFDB.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.colorCONVERT(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.removeAllData(this, "folders"); BDFDB.saveAllData(newfoldersdata, this, "folders"); }); BDFDB.WebModules.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) { BDFDB.removeEles(this.foldercontent, BDFDB.dotCN.guildswrapper + ".foldercontent"); let modal = document.querySelector(`.${this.name}-modal`); if (modal) { BDFDB.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.removeEles(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.unloadMessage(this); } } onSwitch () { if (typeof BDFDB === "object" && BDFDB.getData("forceOpenFolder", this, "settings")) { 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.saveData(folderid, data, this, "folders"); } let [children, index] = BDFDB.getContextMenuGroupAndIndex(returnvalue, "GuildFolderMarkReadItem"); const autoreaditem = BDFDB.React.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.saveData(folderid, data, this, "folders"); } }); if (index > -1) children.splice(index + 1, 0, autoreaditem); else children.push(autoreaditem); const muteGroup = BDFDB.React.createElement(BDFDB.LibraryComponents.ContextMenuItemGroup, { className: `BDFDB-contextMenuItemGroup ${this.name}-contextMenuItemGroup`, children: BDFDB.React.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.saveData(folderid, data, this, "folders"); 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.React.createElement(BDFDB.LibraryComponents.ContextMenuItemGroup, { className: `BDFDB-contextMenuItemGroup ${this.name}-contextMenuItemGroup`, children: BDFDB.React.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.closeContextMenu(BDFDB.getParentEle(BDFDB.dotCN.contextmenu, e.target)); BDFDB.openConfirmModal(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.React.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.closeContextMenu(menu); this.addGuildToFolder(folders[i].folderId, guildid); } })); let [children, index] = BDFDB.getContextMenuGroupAndIndex(returnvalue, ["FluxContainer(MessageDeveloperModeGroup)", "DeveloperModeGroup"]); const addType = !addtofolderitems.length ? "contextMenuItem" : "contextMenuSubItem"; const itemgroup = BDFDB.React.createElement(BDFDB.LibraryComponents.ContextMenuItemGroup, { className: `BDFDB-contextMenuItemGroup ${this.name}-contextMenuItemGroup`, children: [ BDFDB.React.createElement(BDFDB.LibraryComponents.ContextMenuSubItem, { label: this.labels.servercontext_serverfolders_text, className: `BDFDB-contextMenuSubItem ${this.name}-contextMenuSubItem ${this.name}-guild-contextMenuSubItem`, render: folder ? [ BDFDB.React.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.closeContextMenu(menu); this.removeGuildFromFolder(folder.folderId, guildid); } }) ] : [ BDFDB.React.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.closeContextMenu(menu); this.openFolderCreationMenu(openguilds, guildid); } }), BDFDB.React.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.removeEles(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.htmlToElement(this.folderContentMarkup); 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 setTimeout(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)) { clearTimeout(this.folderReads[state.folderId]); this.folderReads[state.folderId] = setTimeout(() => { BDFDB.markGuildAsRead(instance.props.guildIds); }, 10000); } if (state.expanded) setImmediate(() => { for (let guildid of instance.props.guildIds) this.updateGuildInFolderContent(state.folderId, guildid); if (this.clickedFolder == state.folderId && BDFDB.getData("closeOtherFolders", this, "settings")) for (let openFolderId of BDFDB.LibraryModules.FolderUtils.getExpandedFolders()) if (openFolderId != state.folderId) { BDFDB.removeEles(this.foldercontent.querySelectorAll(`${BDFDB.dotCN.guildouter}[folderid="${openFolderId}"]`)); BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId); } this.addSeparator(state.folderId); this.toggleFolderContent(); }); else setTimeout(() => { BDFDB.removeEles(this.foldercontent.querySelectorAll(`${BDFDB.dotCN.guildouter}[folderid="${state.folderId}"]`)); if (BDFDB.containsClass(this.foldercontentguilds.firstElementChild, "folderseparatorouter")) BDFDB.removeEles(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.addEventListener(this, wrapper, "click", () => {setImmediate(() => { let folder = this.getFolderOfGuildId(instance.props.guild.id); let folderid = folder ? folder.folderId : null; let settings = BDFDB.getAllData(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.addClass(root, "BDFDB-modal", `${this.name}-modal`, BDFDB.disCN.layermodalmedium); BDFDB.removeClass(root, BDFDB.disCN.layermodalsmall); if (header) { clearInterval(this.settingsModalWait); header.parentElement.insertBefore(BDFDB.htmlToElement(`
${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.addClass(form, "tab-content", BDFDB.disCN.marginbottom8); for (let child of form.childNodes) if (form.firstElementChild != child) BDFDB.toggleEles(child, false); form.appendChild(BDFDB.htmlToElement(`
${this.labels.modal_iconpicker_text}
`)); form.appendChild(BDFDB.htmlToElement(`

${this.labels.modal_usecloseicon_text}

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

${this.labels.modal_copytooltipcolor_text}

`)); form.parentElement.appendChild(BDFDB.htmlToElement(`
${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.addChildEventListener(root, "change", "input[type='file'][option]", e => { let input = e.currentTarget, file = input.files[0]; if (file) setImmediate(() => {this.fetchCustomIcon(root, input.getAttribute("option"))}); }); BDFDB.addChildEventListener(root, "keyup", "input[type='text'][option]", e => { if (e.which == 13) this.fetchCustomIcon(root, e.currentTarget.getAttribute("option")); }); BDFDB.addChildEventListener(root, "click", ".btn-addcustom", () => { this.saveCustomIcon(root); }); BDFDB.addChildEventListener(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.getSwatchColor(root, 1); data.color2 = BDFDB.getSwatchColor(root, 2); data.color3 = BDFDB.getSwatchColor(root, 3); data.color4 = BDFDB.getSwatchColor(root, 4); if (!BDFDB.equals(olddata, data)) { let folderIcons = this.loadAllIcons(); let isCustom = BDFDB.containsClass(selectedIcon, "custom"); data.icons.openicon = folderIcons[data.iconID] ? (!isCustom ? this.createBase64SVG(folderIcons[data.iconID].openicon, data.color1, data.color2) : folderIcons[data.iconID].openicon) : null; data.icons.closedicon = folderIcons[data.iconID] ? (!isCustom ? this.createBase64SVG(folderIcons[data.iconID].closedicon, data.color1, data.color2) : folderIcons[data.iconID].closedicon) : null; BDFDB.saveData(folderid, data, this, "folders"); instance.handleColorChange(data.color1 ? parseInt(BDFDB.colorCONVERT(data.color1 && BDFDB.isObject(data.color1) ? data.color1[Object.keys(data.color1)[0]] : data.color1, "HEX").slice(1), 16) : null); this.changeFolder(folderid); } }); } BDFDB.initElements(wrapper); } } processStandardSidebarView (instance, wrapper, returnvalue) { if (this.SettingsUpdated && this.foldercontent) { delete this.SettingsUpdated; this.folderStates = {}; BDFDB.WebModules.forceAllUpdates(this, "GuildFolder"); } } loadAllIcons () { let icons = {}; this.folderIcons.forEach((array,i) => {icons[i] = {"openicon":array.openicon,"closedicon":array.closedicon,"customID":null};}); Object.assign(icons, BDFDB.loadAllData(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.showToast("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.showToast("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.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.containsClass(iconpreviewopen, "nopic") && !BDFDB.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.removeClass(iconpreviewswitching, "nopic"); iconpreviewswitchinginner.style.setProperty("background-image", iconpreviewopenimage); let switching = true; iconpreviewswitching.switchInterval = setInterval(() => { 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.containsClass(iconpreviewopen, "nopic") && !BDFDB.containsClass(iconpreviewclosed, "nopic") && !BDFDB.containsClass(iconpreviewswitching, "nopic")) { let customID = this.generateID("customicon"); BDFDB.saveData(customID, {"openicon":iconpreviewopen.url,"closedicon":iconpreviewclosed.url,customID}, this, "customicons"); 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.addClass(iconpreviewopen, "nopic"); iconpreviewopeninner.style.removeProperty("background-image"); BDFDB.addClass(iconpreviewclosed, "nopic"); iconpreviewclosedinner.style.removeProperty("background-image"); BDFDB.addClass(iconpreviewswitching, "nopic"); iconpreviewswitchinginner.style.removeProperty("background-image"); clearInterval(iconpreviewswitching.switchInterval); BDFDB.showToast(`Custom Icon was added to selection.`, {type:"success"}); this.setIcons(modal, modal.querySelector(".ui-icon-picker-icon.selected").getAttribute("value")); } else { BDFDB.showToast(`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.loadAllData(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.removeEles(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.htmlToElement(`
${Object.getOwnPropertyNames(folderIcons).map(id => `
${folderIcons[id].customID ? '
' : ''}
`).join("")}
`)); setIcon(wrapper.querySelector(`.ui-icon-picker-icon[value="${folderIcons[selection] ? selection : -1}"]`), false, true); BDFDB.addChildEventListener(wrapper, "click", ".ui-icon-picker-icon", e => { if (BDFDB.containsClass(e.target, BDFDB.disCN.hovercardbutton)) return; setIcon(wrapper.querySelector(".ui-icon-picker-icon.selected"), false, false); setIcon(e.currentTarget, true, true); }); BDFDB.addChildEventListener(wrapper, "click", BDFDB.dotCN.hovercardbutton, e => { if (BDFDB.containsClass(e.currentTarget.parentElement, "selected")) return; BDFDB.removeData(e.currentTarget.getAttribute("value"), this, "customicons"); e.currentTarget.parentElement.remove(); BDFDB.showToast(`Custom Icon was deleted.`, {type:"success"}); }); BDFDB.addChildEventListener(wrapper, "mouseenter", ".ui-icon-picker-icon", e => { setIcon(e.currentTarget, true); if (e.currentTarget.getAttribute("value") == -1) BDFDB.createTooltip(BDFDB.LanguageStrings.DEFAULT, e.currentTarget, {type:"top"}); }); BDFDB.addChildEventListener(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.toggleClass(icon, "selected", enable); if (hover) { if (folderIcons[id]) icon.querySelector(".ui-picker-inner").style.setProperty("background-image", `url(${folderIcons[id].openicon})`); if (BDFDB.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.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 config = BDFDB.loadData(folderid, this, "folders") || { iconID: "-1", icons: {openicon: null, closedicon: null}, muteFolder: false, autoRead: false, copyTooltipColor: false, useCloseIcon: true, color1: null, color2: ["255","255","255"], color3: null, color4: null }; if (!config.color1) config.color1 = BDFDB.colorCONVERT(folder.folderColor, "RGBCOMP") || ["0","0","0"]; return config; } toggleFolderContent (forceOpenClose) { if (!this.foldercontentguilds) return; forceOpenClose = forceOpenClose === undefined ? BDFDB.LibraryModules.FolderUtils.getExpandedFolders().size > 0 : forceOpenClose; BDFDB.toggleClass(this.foldercontent, "foldercontentopen", forceOpenClose); BDFDB.toggleClass(this.foldercontent, "foldercontentclosed", !forceOpenClose); BDFDB.toggleClass(document.body, "foldercontentopened", forceOpenClose); } changeFolder (folderid, wrapper) { wrapper = wrapper || BDFDB.getFolderDiv(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.removeEles(folderinner.querySelectorAll(`${BDFDB.dotCN.guildupperbadge}.count`)); foldericon.parentElement.parentElement.style.removeProperty("-webkit-mask"); if (BDFDB.getData("showCountBadge", this, "settings")) { folderinner.appendChild(BDFDB.htmlToElement(`
${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(``)})`); } let icontype = BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folderid) ? "openicon" : "closedicon"; let icon = icontype != "closedicon" || data.useCloseIcon ? data.icons[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.isObject(data.color3); var isgradient4 = data.color4 && BDFDB.isObject(data.color4); var bgColor = data.color3 ? (!isgradient3 ? BDFDB.colorCONVERT(data.color3, "RGBA") : BDFDB.colorGRADIENT(data.color3)) : ""; var fontColor = data.color4 ? (!isgradient4 ? BDFDB.colorCONVERT(data.color4, "RGBA") : BDFDB.colorGRADIENT(data.color4)) : ""; var folderName = folder.folderName || BDFDB.getReactValue(wrapper, "return.stateNode.props.defaultFolderName"); folderinner.ServerFoldersTooltipListener = () => { BDFDB.createTooltip(isgradient4 ? `${BDFDB.encodeToHTML(folderName)}` : folderName, folderinner, {type:"right", selector:"ServerFolders-tooltip", style:`${isgradient4 ? '' : 'color: ' + fontColor + ' !important; '}background: ${bgColor} !important; border-color: ${isgradient3 ? BDFDB.colorCONVERT(data.color3[0], "RGBA") : bgColor} !important;`,css:`body ${BDFDB.dotCN.tooltip}:not(.ServerFolders-tooltip) {display: none !important;}`, html:isgradient3}); }; folderinner.addEventListener("mouseenter", folderinner.ServerFoldersTooltipListener); } folderinner.ServerFoldersClickListener = () => { clearTimeout(this.clickedFolderTimeout); this.clickedFolder = folderid; this.clickedFolderTimeout = setTimeout(() => { 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); if (guild) { let oldCopy = this.foldercontentguilds.querySelector(`.copy[guildid="${guildid}"]`); let newCopy = this.createCopyOfServer(folderid, guildid); if (!newCopy) return; else if (oldCopy) { this.foldercontentguilds.insertBefore(newCopy, oldCopy); BDFDB.removeEles(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.containsClass(this.foldercontentguilds.firstElementChild, "folderseparatorouter")) BDFDB.removeEles(this.foldercontentguilds.firstElementChild); } } addSeparator (folderid) { if (!this.foldercontentguilds) return; if (!this.foldercontent.querySelector(`.folderseparatorouter[folderid="${folderid}"]`) && BDFDB.getData("addSeparators", this, "settings")) this.foldercontentguilds.insertBefore(BDFDB.htmlToElement(`
`), this.foldercontentguilds.querySelectorAll(`[folderid="${folderid}"]`)[0]); if (BDFDB.containsClass(this.foldercontentguilds.firstElementChild, "folderseparatorouter")) BDFDB.removeEles(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.colorCONVERT(color1, "RGBA")).replace("REPLACE_FILL2", isgradient2 ? "url(#grad2)" : BDFDB.colorCONVERT(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.getServerDiv(guildid); let props = BDFDB.getReactValue(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.htmlToElement(`
`); 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.addClass(guildcopy, "copy"); BDFDB.toggleEles(guildcopy, true); 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", () => { let EditServers = BDFDB.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.loadData(folderid, this, "folders") || {}; let color3 = folderData.copyTooltipColor ? folderData.color3 : null; let color4 = folderData.copyTooltipColor ? folderData.color4 : null; let isgradient3 = color3 && BDFDB.isObject(color3); let isgradient4 = color4 && BDFDB.isObject(color4); let bgColor = color3 ? (!isgradient3 ? BDFDB.colorCONVERT(color3, "RGBA") : BDFDB.colorGRADIENT(color3)) : ""; let fontColor = color4 ? (!isgradient4 ? BDFDB.colorCONVERT(color4, "RGBA") : BDFDB.colorGRADIENT(color4)) : ""; BDFDB.createTooltip(isgradient4 ? `${BDFDB.encodeToHTML(guild.name)}` : guild.name, guildcopyinner, {type:"right", selector:"guild-folder-tooltip", style:`${isgradient4 ? '' : 'color: ' + fontColor + ' !important; '}background: ${bgColor} !important; border-color: ${isgradient3 ? BDFDB.colorCONVERT(color3[0], "RGBA") : bgColor} !important;`, html:isgradient3}); } 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.getReactValue(BDFDB.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.stopEvent(e); if (BDFDB.pressedKeys.includes(46)) this.removeGuildFromFolder(folderid, guildid); else { BDFDB.LibraryModules.GuildUtils.transitionToGuildSync(guild.id); let settings = BDFDB.getAllData(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.openGuildContextMenu(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.htmlToElement(this.dragPlaceholderMarkup); let dragpreview = this.createDragPreview(guilddiv, e); let dragging = e3 => { BDFDB.removeEles(placeholder); BDFDB.toggleEles(guildcopy, false); this.updateDragPreview(dragpreview, e3); if (this.foldercontent.contains(e3.target)) { hovcopy = BDFDB.getParentEle(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.removeEles(placeholder, dragpreview); BDFDB.toggleEles(guildcopy, true); let dropfolderdiv = BDFDB.getParentEle(BDFDB.dotCN.guildfolderwrapper, e3.target); let newfolderid = dropfolderdiv ? BDFDB.getFolderID(dropfolderdiv) : null; if (newfolderid) { if (newfolderid != folderid) { BDFDB.removeEles(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.htmlToElement(`

${this.labels.serversubmenu_createfolder_text}

`); let targetedguildsids = {}; let container = modal.querySelector(".entries"); BDFDB.addChildEventListener(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.htmlToElement(`
`)); let entry = BDFDB.htmlToElement(`
${BDFDB.createServerDivCopy(guild.id, {size: 48}).outerHTML}

${BDFDB.encodeToHTML(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.removeData(folderid, this, "folders"); BDFDB.removeEles(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.removeFromArray(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.removeEles(this.foldercontentguilds.querySelector(`${BDFDB.dotCN.guildouter}[folderid="${folderid}"][guildid="${guildid}"]`)); let sameFolderEles = this.foldercontentguilds.querySelectorAll(`[folderid="${folderid}"]`); if (sameFolderEles.length == 1 && BDFDB.containsClass(sameFolderEles[0], "folderseparatorouter")) BDFDB.removeEles(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.removeFromArray(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.addClass(dragpreview, "serverfolders-dragpreview"); BDFDB.toggleEles(dragpreview, false); 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.toggleEles(dragpreview, true); dragpreview.style.setProperty("left", e.clientX - 25 + "px", "important"); dragpreview.style.setProperty("top", e.clientY - 25 + "px", "important"); } setLabelsByLanguage () { switch (BDFDB.getDiscordLanguage().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" }; } } }