/** * @name ServerFolders * @author DevilBro * @authorId 278543574059057154 * @version 7.2.1 * @description Changes Discord's Folders, Servers open in a new Container, also adds extra Features to more easily organize, customize and manage your Folders * @invite Jx3TjNS * @donate https://www.paypal.me/MircoWittrien * @patreon https://www.patreon.com/MircoWittrien * @website https://mwittrien.github.io/ * @source https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/ServerFolders/ * @updateUrl https://mwittrien.github.io/BetterDiscordAddons/Plugins/ServerFolders/ServerFolders.plugin.js */ module.exports = (_ => { const changeLog = { }; return !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class { constructor (meta) {for (let key in meta) this[key] = meta[key];} getName () {return this.name;} getAuthor () {return this.author;} getVersion () {return this.version;} getDescription () {return `The Library Plugin needed for ${this.name} is missing. Open the Plugin Settings to download it. \n\n${this.description}`;} downloadLibrary () { require("request").get("https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js", (e, r, b) => { if (!e && b && r.statusCode == 200) require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0BDFDB.plugin.js"), b, _ => BdApi.showToast("Finished downloading BDFDB Library", {type: "success"})); else BdApi.alert("Error", "Could not download BDFDB Library Plugin. Try again later or download it manually from GitHub: https://mwittrien.github.io/downloader/?library"); }); } load () { if (!window.BDFDB_Global || !Array.isArray(window.BDFDB_Global.pluginQueue)) window.BDFDB_Global = Object.assign({}, window.BDFDB_Global, {pluginQueue: []}); if (!window.BDFDB_Global.downloadModal) { window.BDFDB_Global.downloadModal = true; BdApi.showConfirmationModal("Library Missing", `The Library Plugin needed for ${this.name} is missing. Please click "Download Now" to install it.`, { confirmText: "Download Now", cancelText: "Cancel", onCancel: _ => {delete window.BDFDB_Global.downloadModal;}, onConfirm: _ => { delete window.BDFDB_Global.downloadModal; this.downloadLibrary(); } }); } if (!window.BDFDB_Global.pluginQueue.includes(this.name)) window.BDFDB_Global.pluginQueue.push(this.name); } start () {this.load();} stop () {} getSettingsPanel () { let template = document.createElement("template"); template.innerHTML = `
The Library Plugin needed for ${this.name} is missing.\nPlease click Download Now to install it.
`; template.content.firstElementChild.querySelector("a").addEventListener("click", this.downloadLibrary); return template.content.firstElementChild; } } : (([Plugin, BDFDB, meta]) => { var _this; var folderStates, folderReads, guildStates, currentGuild, forceCloseTimeout; var folderConfigs = {}, customIcons = {}; const folderIcons = [ {openicon: ``, closedicon: ``}, {openicon: ``, closedicon: ``}, {openicon: ``, closedicon: ``}, {openicon: ``, closedicon: ``}, {openicon: ``, closedicon: ``}, {openicon: ``, closedicon: ``}, {openicon: ``, closedicon: ``} ]; var folderGuildContent = null; const FolderGuildContentComponent = class FolderGuildContent extends BdApi.React.Component { componentDidMount() { folderGuildContent = this; } render() { let closing = this.props.closing; delete this.props.closing; let folders = Array.from(BDFDB.LibraryStores.ExpandedGuildFolderStore.getExpandedFolders()).map(folderId => BDFDB.LibraryStores.SortedGuildStore.getGuildFolderById(folderId)).filter(folder => folder && folder.guildIds); this.props.folders = folders.length || closing ? folders : (this.props.folders || []); BDFDB.TimeUtils.clear(this._rerenderTimeout); if (!folders.length && this.props.folders.length && !closing) this._rerenderTimeout = BDFDB.TimeUtils.timeout(_ => { this.props.closing = true; BDFDB.ReactUtils.forceUpdate(this); }, 300); BDFDB.DOMUtils.toggleClass(document.body, BDFDB.disCN._serverfoldersfoldercontentisopen, !(!folders.length || closing)); return BDFDB.ReactUtils.createElement("nav", { className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.guildswrapper, BDFDB.disCN.guilds, this.props.isAppFullscreen && BDFDB.disCN.guildswrapperhidden, this.props.themeOverride && BDFDB.disCN.themedark, BDFDB.disCN._serverfoldersfoldercontent, (!folders.length || closing) && BDFDB.disCN._serverfoldersfoldercontentclosed), children: BDFDB.ReactUtils.createElement("ul", { role: "tree", tabindex: 0, "data-list-id": "guildfoldersnav", className: BDFDB.disCN.guildstree, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Scrollers.None, { className: BDFDB.disCN.guildsscroller, children: BDFDB.ReactUtils.createElement("div", { "aria-label": BDFDB.LanguageUtils.LanguageStrings.SERVERS, children: BDFDB.LibraryComponents.GuildItem && this.props.folders.map(folder => { let data = _this.getFolderConfig(folder.folderId); let folderIcon = null; if (_this.settings.general.addFolderIcon) { let folderIcons = _this.loadAllIcons(); folderIcon = folderIcons[data.iconID] ? (!folderIcons[data.iconID].customID ? _this.createBase64SVG(folderIcons[data.iconID].openicon, data.color1, data.color2) : folderIcons[data.iconID].openicon) : null; folderIcon = folderIcon ? BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildfoldericonwrapper, style: {background: `url(${folderIcon}) center/cover no-repeat`} }) : BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildfoldericonwrapper, children: BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildfoldericonwrapperexpanded, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, { name: BDFDB.LibraryComponents.SvgIcon.Names.FOLDER, style: {color: BDFDB.ColorUtils.convert(folder.folderColor || BDFDB.DiscordConstants.Colors.BRAND, "RGB")} }) }) }); } return BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildfolderwrapper, style: {"--folder-color": folder.folderColor ? BDFDB.ColorUtils.convert(folder.folderColor, "RGB") : null}, children: [ _this.settings.general.addFolderBackground && BDFDB.ReactUtils.createElement("span", { className: BDFDB.disCN.guildfolderexpandedbackground }), folderIcon && BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildouter, children: BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildfolder, "data-folder-name": folder.folderName || BDFDB.LanguageUtils.LanguageStrings.SERVER_FOLDER_PLACEHOLDER, children: folderIcon }) }), BDFDB.ReactUtils.createElement("ul", { role: "group", children: folder.guildIds.map(guildId => { let guildIstance; return [ this.draggedGuild == guildId ? null : BDFDB.ReactUtils.createElement("div", { ref: instance => guildIstance = instance, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.GuildItem, { guildNode: { children: [], id: guildId, parentId: folder.folderId, type: "guild", unavailable: false } }), onClick: event => { if (BDFDB.ListenerUtils.isPressed(46)) { BDFDB.ListenerUtils.stopEvent(event); _this.removeGuildFromFolder(folder.folderId, guildId); } else { if (_this.settings.general.closeAllFolders) { for (let openFolderId of BDFDB.LibraryStores.ExpandedGuildFolderStore.getExpandedFolders()) if (openFolderId != folder.folderId || !_this.settings.general.forceOpenFolder) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId); } else if (_this.settings.general.closeTheFolder && !_this.settings.general.forceOpenFolder && BDFDB.LibraryStores.ExpandedGuildFolderStore.isFolderExpanded(folder.folderId)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folder.folderId); else BDFDB.ReactUtils.forceUpdate(this); } }, onMouseDown: event => { event = event.nativeEvent || event; let mouseMove = event2 => { if (Math.sqrt((event.pageX - event2.pageX)**2) > 20 || Math.sqrt((event.pageY - event2.pageY)**2) > 20) { BDFDB.ListenerUtils.stopEvent(event); this.draggedGuild = guildId; let dragPreview = _this.createDragPreview(BDFDB.ReactUtils.findDOMNode(guildIstance).cloneNode(true), event2); BDFDB.ReactUtils.forceUpdate(this); document.removeEventListener("mousemove", mouseMove); document.removeEventListener("mouseup", mouseUp); let dragging = event3 => { _this.updateDragPreview(dragPreview, event3); let placeholder = BDFDB.DOMUtils.getParent(BDFDB.dotCN._serverfoldersguildplaceholder, event3.target); let hoveredGuild = (BDFDB.ReactUtils.findValue(BDFDB.DOMUtils.getParent(BDFDB.dotCNS._serverfoldersfoldercontent + BDFDB.dotCN.guildouter, placeholder ? placeholder.previousSibling : event3.target), "guild", {up: true}) || {}).id; if (hoveredGuild) { let hoveredGuildFolder = BDFDB.GuildUtils.getFolder(hoveredGuild); if (!hoveredGuildFolder || hoveredGuildFolder.folderId != folder.folderId) hoveredGuild = null; } let update = hoveredGuild != this.hoveredGuild; if (hoveredGuild) this.hoveredGuild = hoveredGuild; else delete this.hoveredGuild; if (update) BDFDB.ReactUtils.forceUpdate(this); }; let releasing = event3 => { BDFDB.ListenerUtils.stopEvent(event3); BDFDB.DOMUtils.remove(dragPreview); if (this.hoveredGuild) { let guildIds = [].concat(folder.guildIds); BDFDB.ArrayUtils.remove(guildIds, this.draggedGuild, true); guildIds.splice(guildIds.indexOf(this.hoveredGuild) + 1, 0, this.draggedGuild); _this.updateFolder(Object.assign({}, folder, {guildIds})); } delete this.draggedGuild; delete this.hoveredGuild; BDFDB.ReactUtils.forceUpdate(this); document.removeEventListener("mousemove", dragging); document.removeEventListener("mouseup", releasing); }; document.addEventListener("mousemove", dragging); document.addEventListener("mouseup", releasing); } }; let mouseUp = _ => { document.removeEventListener("mousemove", mouseMove); document.removeEventListener("mouseup", mouseUp); }; document.addEventListener("mousemove", mouseMove); document.addEventListener("mouseup", mouseUp); } }), this.hoveredGuild != guildId ? null : BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCNS.guildouter + BDFDB.disCN._serverfoldersguildplaceholder, children: BDFDB.ReactUtils.createElement("div", { children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Mask, { mask: BDFDB.LibraryComponents.Mask.Masks.SQUIRCLE, className: BDFDB.disCN.guildplaceholdermask, width: 48, height: 48, style: {display:"block"}, children: BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildplaceholder }) }) }) }) ] }) }) ] }) }).filter(n => n).reduce((r, a) => r.concat(a, _this.settings.general.addSeparators ? BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildouter, children: BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildseparator }) }) : null), [0]).slice(1, -1).flat(10).filter(n => n) }) }) }) }); } }; const FolderIconPickerComponent = class FolderIconPicker extends BdApi.React.Component { render() { 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); } folderIcons["-1"] = {}; return BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { wrap: BDFDB.LibraryComponents.Flex.Wrap.WRAP, children: Object.keys(folderIcons).sort().map(id => { return BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Card, { className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN._serverfoldersiconswatch, this.props.selectedIcon == id && BDFDB.disCN._serverfoldersiconswatchselected), backdrop: false, iconID: id, grow: 0, shrink: 0, noRemove: !folderIcons[id].customID || this.props.selectedIcon == id, onMouseEnter: _ => { this.props.hoveredIcon = id; BDFDB.ReactUtils.forceUpdate(this); }, onMouseLeave: _ => { delete this.props.hoveredIcon; BDFDB.ReactUtils.forceUpdate(this); }, onClick: _ => { this.props.selectedIcon = id; this.props.onSelect(this.props.selectedIcon); BDFDB.ReactUtils.forceUpdate(this); }, onRemove: _ => { delete customIcons[id]; BDFDB.DataUtils.save(customIcons, _this, "customicons"); BDFDB.ReactUtils.forceUpdate(this); }, children: folderIcons[id].closedicon ? BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN._serverfoldersiconswatchinner, style: {background: `url(${this.props.hoveredIcon == id ? folderIcons[id].openicon : folderIcons[id].closedicon}) center/cover no-repeat`} }) : BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, { className: BDFDB.disCN._serverfoldersiconswatchinner, name: BDFDB.LibraryComponents.SvgIcon.Names.FOLDER, style: {color: "rbg(0, 0, 0)"} }) }); }) }) } }; const FolderIconCustomPreviewComponent = class FolderIconCustomPreview extends BdApi.React.Component { componentDidMount() { this._previewInterval = BDFDB.TimeUtils.interval(_ => { this.props.tick = !this.props.tick; if (this.props.open || this.props.closed) BDFDB.ReactUtils.forceUpdate(this); }, 2000); } componentWillUnmount () { BDFDB.TimeUtils.clear(this._previewInterval); } checkImage(base64OrUrl, callback) { if (base64OrUrl.indexOf("https://") == 0 || base64OrUrl.indexOf("http://") == 0) BDFDB.LibraryRequires.request(base64OrUrl.trim(), (error, response, body) => { if (response && response.headers["content-type"] && response.headers["content-type"].indexOf("image") != -1 && response.headers["content-type"] != "image/gif") { this.resizeImage("data:" + response.headers["content-type"] + ";base64," + btoa(body), callback); } else callback(base64OrUrl); }); else this.resizeImage(base64OrUrl, callback); } resizeImage(base64, callback) { let type = base64.split("data:").slice(1).join(" ").split(";")[0]; if (type == "image/gif") callback(base64); else { let img = new Image(); img.onload = function() { let width = 0, height = 0; if (this.width >= this.height) { width = (128 / this.height) * this.width; height = 128; } else { width = 128; height = (128 / this.width) * this.height; } let canvas = document.createElement("canvas"); let ctx = canvas.getContext("2d"); ctx.canvas.width = width; ctx.canvas.height = height; ctx.drawImage(img, 0, 0, width, height); callback(canvas.toDataURL(type)); }; img.onerror = function() { callback(base64); }; img.src = base64; } } render() { let openInput, closeInput; return [ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { title: _this.labels.modal_customopen, className: BDFDB.disCN.marginbottom20, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { type: "file", filter: "image", value: this.props.open, ref: instance => {if (instance) openInput = instance;}, onChange: value => { this.props.open = value; BDFDB.ReactUtils.forceUpdate(this); } }) }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { title: _this.labels.modal_customclosed, className: BDFDB.disCN.marginbottom20, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { type: "file", filter: "image", value: this.props.closed, ref: instance => {if (instance) closeInput = instance;}, onChange: value => { this.props.closed = value; BDFDB.ReactUtils.forceUpdate(this); } }) }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { title: _this.labels.modal_custompreview, className: BDFDB.disCN.marginbottom20, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { justify: BDFDB.LibraryComponents.Flex.Justify.BETWEEN, align: BDFDB.LibraryComponents.Flex.Align.CENTER, children: [ BDFDB.ReactUtils.createElement("div", { className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN._serverfoldersiconswatch, BDFDB.disCN._serverfoldersiconswatchpreview, !this.props.open && BDFDB.disCN._serverfoldersiconswatchnopreview), children: BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN._serverfoldersiconswatchinner, style: this.props.open && {background: `url(${this.props.open}) center/cover no-repeat`} || {} }) }), BDFDB.ReactUtils.createElement("div", { className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN._serverfoldersiconswatch, BDFDB.disCN._serverfoldersiconswatchpreview, !this.props.closed && BDFDB.disCN._serverfoldersiconswatchnopreview), children: BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN._serverfoldersiconswatchinner, style: this.props.closed && {background: `url(${this.props.closed}) center/cover no-repeat`} || {} }) }), BDFDB.ReactUtils.createElement("div", { className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN._serverfoldersiconswatch, BDFDB.disCN._serverfoldersiconswatchpreview, !(this.props.tick ? this.props.open : this.props.closed) && BDFDB.disCN._serverfoldersiconswatchnopreview), children: BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN._serverfoldersiconswatchinner, style: (this.props.tick ? this.props.open : this.props.closed) && {background: `url(${(this.props.tick ? this.props.open : this.props.closed)}) center/cover no-repeat`} || {} }) }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Button, { children: BDFDB.LanguageUtils.LanguageStrings.ADD, onClick: _ => { if (openInput.props.value && closeInput.props.value) { this.checkImage(openInput.props.value, openIcon => { this.checkImage(closeInput.props.value, closedIcon => { customIcons[_this.generateId("customicon")] = {openicon: openIcon, closedicon: closedIcon}; BDFDB.DataUtils.save(customIcons, _this, "customicons"); this.props.open = null; this.props.closed = null; BDFDB.PatchUtils.forceAllUpdates(_this, "FolderSettingsModal"); BDFDB.NotificationUtils.toast("Custom Icon was added to Selection", {type: "success"}); }); }) } else BDFDB.NotificationUtils.toast("Add an Image for the open and closed Icon", {type: "danger"}); } }) ] }) }) ] } }; return class ServerFolders extends Plugin { onLoad () { _this = this; folderStates = {}; folderReads = {}; guildStates = {}; this.defaults = { general: { closeOtherFolders: {value: false, description: "Closes other Folders when opening a Folder"}, closeTheFolder: {value: false, description: "Closes the Folder when selecting a Server"}, closeAllFolders: {value: false, description: "Closes all Folders when selecting a Server"}, forceOpenFolder: {value: false, description: "Forces a Folder to open when switching to a Server of that Folder"}, showCountBadge: {value: true, description: "Displays Badge for Amount of Servers in a Folder"}, extraColumn: {value: true, description: "Moves the Servers from opened Folders into an extra Column"}, addSeparators: {value: true, description: "Adds Separators between Servers of different Folders in extra Column"}, addFolderIcon: {value: false, description: "Adds the Folder Icon on the top of the Server List in the extra Column"}, addFolderBackground: {value: false, description: "Adds a Folder Background behind a Group of Servers in the extra Column"} } }; this.modulePatches = { before: [ "FolderItem", "FolderSettingsModal", "GuildsBar", "ModalRoot", "TooltipContainer" ], after: [ "FolderHeader", "FolderSettingsModal", "GuildItem", "GuildsBar" ], componentDidMount: [ "FolderSettingsModal" ] }; this.css = ` ${BDFDB.dotCN._serverfoldersiconswatch} { position: relative; margin: 3px 3px; padding: 3px 3px; width: 55px; height: 55px; border-radius: 12px; cursor: pointer; } ${BDFDB.dotCN._serverfoldersiconswatch + BDFDB.dotCN._serverfoldersiconswatchpreview} { width: 95px; height: 95px; cursor: default; } ${BDFDB.dotCN._serverfoldersiconswatch}:hover { background-color: var(--background-modifier-hover); } ${BDFDB.dotCN._serverfoldersiconswatch + BDFDB.dotCN._serverfoldersiconswatchselected} { background-color: var(--background-modifier-selected); } ${BDFDB.dotCNS._serverfoldersiconswatch + BDFDB.dotCN._serverfoldersiconswatchinner} { width: 100%; height: 100%; border-radius: 12px; background-position: center; background-size: cover; background-repeat: no-repeat; } ${BDFDB.dotCN._serverfoldersiconswatchnopreview}, ${BDFDB.dotCN._serverfoldersiconswatchnopreview}:hover { background-color: transparent; } ${BDFDB.dotCNS._serverfoldersiconswatchnopreview + BDFDB.dotCN._serverfoldersiconswatchinner} { background-image: url('data:image/svg+xml; utf8, '); } ${BDFDB.dotCN._serverfoldersiconswatch} svg${BDFDB.dotCN._serverfoldersiconswatchinner} { transform: translateY(-2px) scale(0.8); } ${BDFDB.dotCNS._serverfoldersiconswatch + BDFDB.dotCN.hovercardbutton} { position: absolute; top: -10px; right: -10px; } ${BDFDB.dotCN._serverfoldersdragpreview} { pointer-events: none !important; position: absolute !important; opacity: 0.5 !important; z-index: 10000 !important; } ${BDFDB.dotCN._serverfoldersfoldercontent + BDFDB.notCN.guildswrapperhidden} { transition: width 0.25s cubic-bezier(.44,1.04,1,1.01) !important; } ${BDFDB.dotCN.guildswrapper}[style*="width: 0px"] ~ ${BDFDB.dotCN._serverfoldersfoldercontent}, ${BDFDB.dotCN._serverfoldersfoldercontent + BDFDB.dotCN._serverfoldersfoldercontentclosed} { width: 0 !important; } ${BDFDB.dotCNS._serverfoldershassidebar + BDFDB.dotCN.guildfolderwrapper} > [role="group"], ${BDFDB.dotCNS._serverfoldershassidebar + BDFDB.dotCN.guildfolderexpandedbackground} { display: none !important; } ${BDFDB.dotCNS._serverfoldersfoldercontent + BDFDB.dotCN.guildfolder} { cursor: default; border-radius: 100%; } `; } onStart () { currentGuild = BDFDB.LibraryStores.SelectedGuildStore.getGuildId(); let forceClosing = false; BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.GuildUtils, "toggleGuildFolderExpand", {after: e => { if (this.settings.general.closeOtherFolders && !forceClosing) { forceClosing = true; for (let openFolderId of BDFDB.LibraryStores.ExpandedGuildFolderStore.getExpandedFolders()) if (openFolderId != e.methodArguments[0]) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId); forceClosing = false; } }}); this.forceUpdateAll(); } onStop () { this.forceUpdateAll(); BDFDB.DOMUtils.removeClassFromDOM(BDFDB.disCN._serverfoldersfoldercontentisopen); } onSwitch () { if (typeof BDFDB === "object" && BDFDB.loaded && this.settings.general.forceOpenFolder) { let folder = BDFDB.GuildUtils.getFolder(BDFDB.LibraryStores.SelectedGuildStore.getGuildId()); if (folder && !BDFDB.LibraryStores.ExpandedGuildFolderStore.isFolderExpanded(folder.folderId)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folder.folderId); } } getSettingsPanel (collapseStates = {}) { let settingsPanel; return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, { collapseStates: collapseStates, children: _ => { let settingsItems = []; for (let key in this.defaults.general) settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, { type: "Switch", plugin: this, keys: ["general", key], label: this.defaults.general[key].description, value: this.settings.general[key] })); settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { type: "Button", color: BDFDB.LibraryComponents.Button.Colors.RED, label: "Reset all Folders", onClick: _ => BDFDB.ModalUtils.confirm(this, "Are you sure you want to reset all Folders?", _ => BDFDB.DataUtils.remove(this, "folders")), children: BDFDB.LanguageUtils.LanguageStrings.RESET })); settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { type: "Button", color: BDFDB.LibraryComponents.Button.Colors.RED, label: "Remove all custom Icons", onClick: _ => BDFDB.ModalUtils.confirm(this, "Are you sure you want to remove all custom Icons?", _ => BDFDB.DataUtils.remove(this, "customicons")), children: BDFDB.LanguageUtils.LanguageStrings.REMOVE })); return settingsItems; } }); } onSettingsClosed () { if (this.SettingsUpdated) { delete this.SettingsUpdated; folderStates = {}; this.forceUpdateAll(); } } forceUpdateAll () { folderConfigs = BDFDB.DataUtils.load(this, "folders"); customIcons = BDFDB.DataUtils.load(this, "customicons"); BDFDB.ReactUtils.forceUpdate(folderGuildContent); BDFDB.PatchUtils.forceAllUpdates(this); BDFDB.DiscordUtils.rerenderAll(); } onGuildContextMenu (e) { if (document.querySelector(BDFDB.dotCN.modalwrapper)) return; if (e.instance.props.guild) { let folders = BDFDB.LibraryStores.SortedGuildStore.getGuildFolders().filter(n => n.folderId); let folder = BDFDB.GuildUtils.getFolder(e.instance.props.guild.id); let unfolderedGuilds = BDFDB.LibraryStores.SortedGuildStore.getGuildFolders().filter(n => !n.folderId).map(n => BDFDB.LibraryStores.GuildStore.getGuild(n.guildIds[0])); let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "devmode-copy-id", group: true}); children.splice(index > -1 ? index : children.length, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { label: this.labels.servercontext_serverfolders, id: BDFDB.ContextMenuUtils.createItemId(this.name, "submenu-add"), children: folder ? [ BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { label: this.labels.serversubmenu_removefromfolder, id: BDFDB.ContextMenuUtils.createItemId(this.name, "remove-from-folder"), color: BDFDB.DiscordConstants.MenuItemColors.DANGER, action: _ => this.removeGuildFromFolder(folder.folderId, e.instance.props.guild.id) }) ] : [ BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { label: this.labels.serversubmenu_createfolder, id: BDFDB.ContextMenuUtils.createItemId(this.name, "create-folder"), disabled: !unfolderedGuilds.length, action: _ => this.openFolderCreationMenu(unfolderedGuilds, e.instance.props.guild.id) }), BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { label: this.labels.serversubmenu_addtofolder, id: BDFDB.ContextMenuUtils.createItemId(this.name, "submenu-add-to-folder"), disabled: !folders.length, children: folders.map((folder, i) => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { label: folder.folderName || `${BDFDB.LanguageUtils.LanguageStrings.SERVER_FOLDER_PLACEHOLDER} #${i + 1}`, id: BDFDB.ContextMenuUtils.createItemId(this.name, "add-to-folder", i + 1), action: _ => this.addGuildToFolder(folder.folderId, e.instance.props.guild.id) })) }) ] }) })); } if (e.instance.props.target && e.instance.props.folderId) { let folder = BDFDB.LibraryStores.SortedGuildStore.getGuildFolderById(e.instance.props.folderId); let data = this.getFolderConfig(e.instance.props.folderId); let muted = data.muteFolder && folder.guildIds.every(guildid => BDFDB.LibraryStores.UserGuildSettingsStore.isGuildOrCategoryOrChannelMuted(guildid)); if (data.muteFolder != muted) { data.muteFolder = muted; BDFDB.DataUtils.save(data, this, "folders", e.instance.props.folderId); } let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "mark-folder-read"}); children.splice(index > -1 ? index + 1 : children.length, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuCheckboxItem, { label: this.labels.foldercontext_autoreadfolder, id: BDFDB.ContextMenuUtils.createItemId(this.name, "auto-read-folder"), checked: data.autoRead, action: state => { data.autoRead = state; BDFDB.DataUtils.save(data, this, "folders", e.instance.props.folderId); } })); e.returnvalue.props.children.splice(e.returnvalue.props.children.length - 1, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuCheckboxItem, { label: this.labels.foldercontext_mutefolder, id: BDFDB.ContextMenuUtils.createItemId(this.name, "mute-folder"), checked: muted, action: state => { data.muteFolder = state; BDFDB.DataUtils.save(data, this, "folders", e.instance.props.folderId); for (let guildId of folder.guildIds) if (BDFDB.LibraryStores.UserGuildSettingsStore.isGuildOrCategoryOrChannelMuted(guildId) != state) BDFDB.LibraryModules.GuildNotificationsUtils.updateGuildNotificationSettings(guildId, {muted: state, suppress_everyone: state, suppress_roles: state}); } }) })); e.returnvalue.props.children.push(BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, { children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, { label: this.labels.foldercontext_removefolder, id: BDFDB.ContextMenuUtils.createItemId(this.name, "remove-folder"), color: BDFDB.DiscordConstants.MenuItemColors.DANGER, action: event => { BDFDB.ModalUtils.confirm(this, this.labels.foldercontext_removefolder_confirm.replace("{{var0}}", folder.folderName ? `"${folder.folderName}"` : "").trim(), _ => { this.removeFolder(e.instance.props.folderId); }); } }) })); } } processGuildsBar (e) { if (!this.settings.general.extraColumn) return; if (!e.returnvalue) e.instance.props.className = BDFDB.DOMUtils.formatClassName(e.instance.props.className, BDFDB.disCN._serverfoldershassidebar); else { let fullscreen = BDFDB.LibraryStores.ChannelRTCStore.isFullscreenInContext(); if (folderGuildContent && (fullscreen != folderGuildContent.props.isAppFullscreen || e.instance.props.themeOverride != folderGuildContent.props.themeOverride)) { folderGuildContent.props.isAppFullscreen = fullscreen; folderGuildContent.props.themeOverride = e.instance.props.themeOverride; BDFDB.ReactUtils.forceUpdate(folderGuildContent); } let topBar = BDFDB.ReactUtils.findChild(e.returnvalue, {props: [["className", BDFDB.disCN.guildswrapperunreadmentionsbartop]]}); if (topBar) { let topIsVisible = topBar.props.isVisible; topBar.props.isVisible = BDFDB.TimeUtils.suppress((...args) => { let ids = BDFDB.LibraryStores.SortedGuildStore.getGuildFolders().filter(n => n.folderId).map(n => n.guildIds).flat(10); args[2] = args[2].filter(id => !ids.includes(id)); return topIsVisible(...args) || ids.includes(args[0]) && BDFDB.LibraryStores.GuildReadStateStore.getMentionCount(args[0]) == 0; }, "Error in isVisible of Top Bar in Guild List!"); } let bottomBar = BDFDB.ReactUtils.findChild(e.returnvalue, {props: [["className", BDFDB.disCN.guildswrapperunreadmentionsbarbottom]]}); if (bottomBar) { let bottomIsVisible = bottomBar.props.isVisible; bottomBar.props.isVisible = BDFDB.TimeUtils.suppress((...args) => { let ids = BDFDB.LibraryStores.SortedGuildStore.getGuildFolders().filter(n => n.folderId).map(n => n.guildIds).flat(10); args[2] = args[2].filter(id => !ids.includes(id)); return bottomIsVisible(...args) || ids.includes(args[0]) && BDFDB.LibraryStores.GuildReadStateStore.getMentionCount(args[0]) == 0; }, "Error in isVisible of Bottom Bar in Guild List!"); } e.returnvalue = [ e.returnvalue, BDFDB.ReactUtils.createElement(FolderGuildContentComponent, { isAppFullscreen: BDFDB.LibraryStores.ChannelRTCStore.isFullscreenInContext(), themeOverride: BDFDB.LibraryStores.ThemeStore.darkSidebar }, true) ].flat(10); } } processFolderItem (e) { if (!e.instance.props.folderNode) return; let data = this.getFolderConfig(e.instance.props.folderNode.id); if (data.muteFolder) for (let guildId of e.instance.props.folderNode.children.map(n => n.id)) if (!BDFDB.LibraryStores.UserGuildSettingsStore.isGuildOrCategoryOrChannelMuted(guildId)) BDFDB.LibraryModules.GuildNotificationsUtils.updateGuildNotificationSettings(guildId, {muted: true, suppress_everyone: true}); let state = this.getState(e.instance); if (folderStates[e.instance.props.folderNode.id] && !BDFDB.equals(state, folderStates[e.instance.props.folderNode.id])) { if (data.autoRead && (state.unread || state.badge > 0)) { BDFDB.TimeUtils.clear(folderReads[e.instance.props.folderNode.id]); folderReads[e.instance.props.folderNode.id] = BDFDB.TimeUtils.timeout(_ => { BDFDB.GuildUtils.markAsRead(e.instance.props.folderNode.children.map(n => n.id)); }, 10000); } BDFDB.ReactUtils.forceUpdate(folderGuildContent); } folderStates[e.instance.props.folderNode.id] = state; } processFolderHeader (e) { if (!e.instance.props.folderNode) return; let data = this.getFolderConfig(e.instance.props.folderNode.id); let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: "FolderIcon"}); if (index > -1) { if (parseInt(data.iconID) == -1 && (e.instance.props.expanded || data.useClosedIcon && !e.instance.props.expanded)) children[index] = BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildfoldericonwrapper, children: BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildfoldericonwrapperexpanded, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, { name: BDFDB.LibraryComponents.SvgIcon.Names.FOLDER, style: {color: BDFDB.ColorUtils.convert(data.color1 || BDFDB.DiscordConstants.Colors.BRAND, "RGB")} }) }) }); else if (e.instance.props.expanded || data.useClosedIcon) { let folderIcons = this.loadAllIcons(), iconType = e.instance.props.expanded ? "openicon" : "closedicon"; 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) children[index] = BDFDB.ReactUtils.createElement("div", { className: BDFDB.disCN.guildfoldericonwrapper, style: {background: `url(${icon}) center/cover no-repeat`} }); } if (this.settings.general.showCountBadge) { let mask = BDFDB.ReactUtils.findChild(e.returnvalue, {name: "BlobMask"}); if (mask) { mask.props.upperLeftBadgeWidth = BDFDB.LibraryComponents.Badges.NumberBadge.prototype.getBadgeWidthForValue(e.instance.props.folderNode.children.length); mask.props.upperLeftBadge = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Badges.NumberBadge, { count: e.instance.props.folderNode.children.length, style: {backgroundColor: "var(--bdfdb-blurple)"} }); } } } } processTooltipContainer (e) { if (!e.instance.props.tooltipClassName || e.instance.props.tooltipClassName.indexOf(BDFDB.disCN.guildlistitemtooltip) == -1) return; let child = e.instance.props.children({}); if (!child || !child.props || !child.props.children || !child.props.children.props || !child.props.children.props.folderNode) return; e.instance.props.shouldShow = false; let data = this.getFolderConfig(child.props.children.props.folderNode.id); let childrenRender = e.instance.props.children; e.instance.props.children = BDFDB.TimeUtils.suppress((...args) => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { text: child.props.children.props.folderNode.name || e.instance.props.text, tooltipConfig: { className: BDFDB.disCN.guildlistitemtooltip, type: "right", list: true, offset: 12, backgroundColor: data.color3, fontColor: data.color4 }, children: childrenRender(...args) }), "Error in children Render of Guild Folder Tooltip!"); } processGuildItem (e) { BDFDB.TimeUtils.clear(forceCloseTimeout); forceCloseTimeout = BDFDB.TimeUtils.timeout(_ => { let newCurrentGuild = BDFDB.LibraryStores.SelectedGuildStore.getGuildId(); if (newCurrentGuild != currentGuild && newCurrentGuild) { let folder = BDFDB.GuildUtils.getFolder(newCurrentGuild); if (this.settings.general.closeAllFolders) for (let openFolderId of BDFDB.LibraryStores.ExpandedGuildFolderStore.getExpandedFolders()) if (!folder || openFolderId != folder.folderId || !this.settings.general.forceOpenFolder) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId); else if (folder && this.settings.general.closeTheFolder && !this.settings.general.forceOpenFolder && BDFDB.LibraryStores.ExpandedGuildFolderStore.isFolderExpanded(folder.folderId)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folder.folderId); } currentGuild = newCurrentGuild; }, 1000); let folder = BDFDB.GuildUtils.getFolder(e.instance.props.guild.id); if (folder) { let state = this.getState(e.instance); if (guildStates[e.instance.props.guild.id] && !BDFDB.equals(state, guildStates[e.instance.props.guild.id])) { BDFDB.ReactUtils.forceUpdate(folderGuildContent); } guildStates[e.instance.props.guild.id] = state; if (e.returnvalue) { let data = this.getFolderConfig(folder.folderId); let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: ["GuildTooltip", "BDFDB_TooltipContainer"]}); if (index > -1) children[index] = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, { tooltipConfig: Object.assign({ type: "right", list: true, guild: e.instance.props.guild, offset: 12 }, data.copyTooltipColor && { backgroundColor: data.color3, fontColor: data.color4, }), children: children[index].props.children }); } } } processModalRoot (e) { if (e.instance.props["aria-label"] != BDFDB.LanguageUtils.LanguageStrings.SERVER_FOLDER_SETTINGS) return; e.instance.props.size = BDFDB.LibraryComponents.ModalComponents.ModalSize.LARGE; } processFolderSettingsModal (e) { let folder = BDFDB.LibraryStores.SortedGuildStore.getGuildFolderById(e.instance.props.folderId); let data = this.getFolderConfig(e.instance.props.folderId); let newData = Object.assign({}, data, {folderName: folder.folderName}); let tabs = {}; let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: "ModalHeader"}); if (index > -1) { children[index].props.className = BDFDB.DOMUtils.formatClassName(children[index].props.className, BDFDB.disCN.modalheaderhassibling), children.splice(index + 1, 0, BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { grow: 0, shrink: 0, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Flex, { className: BDFDB.disCN.tabbarcontainer, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TabBar, { className: BDFDB.disCN.tabbar, itemClassName: BDFDB.disCN.tabbaritem, type: BDFDB.LibraryComponents.TabBar.Types.TOP, items: [ {value: this.labels.modal_tabheader1}, {value: this.labels.modal_tabheader2}, {value: this.labels.modal_tabheader3}, {value: this.labels.modal_tabheader4} ], onItemSelect: (value, instance) => { let tabsArray = BDFDB.ObjectUtils.toArray(tabs); for (let ins of tabsArray) { if (ins.props.tab == value) ins.props.open = true; else delete ins.props.open; } BDFDB.ReactUtils.forceUpdate(tabsArray); } }) }) })); } [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {filter: n => n && n.props && n.props.children && n.props.children.type == "form"}); if (index > -1) children[index].props.children = [ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, { tab: this.labels.modal_tabheader1, open: true, ref: instance => {if (instance) tabs[this.labels.modal_tabheader1] = instance;}, children: [ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { title: BDFDB.LanguageUtils.LanguageStrings.GUILD_FOLDER_NAME, className: BDFDB.disCN.marginbottom20, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextInput, { value: folder.folderName, placeholder: folder.folderName || BDFDB.LanguageUtils.LanguageStrings.SERVER_FOLDER_PLACEHOLDER, autoFocus: true, onChange: value => newData.folderName = value }) }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { title: this.labels.modal_iconpicker, className: BDFDB.disCN.marginbottom20, children: BDFDB.ReactUtils.createElement(FolderIconPickerComponent, { selectedIcon: data.iconID, onSelect: value => newData.iconID = value }, true) }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { type: "Switch", margin: 20, label: this.labels.modal_useclosedicon, tag: BDFDB.LibraryComponents.FormComponents.FormTags.H5, value: data.useClosedIcon, onChange: value => newData.useClosedIcon = value }) ] }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, { tab: this.labels.modal_tabheader2, ref: instance => {if (instance) tabs[this.labels.modal_tabheader2] = instance;}, children: [ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { title: this.labels.modal_colorpicker1, className: BDFDB.disCN.marginbottom20, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { color: data.color1, defaultFallback: !data.color1 && !data.swapColors, onColorChange: value => newData.color1 = value }) }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { title: this.labels.modal_colorpicker2, className: BDFDB.disCN.marginbottom20, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { color: data.color2, defaultFallback: !data.color2 && data.swapColors, onColorChange: value => newData.color2 = value }) }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { type: "Switch", margin: 20, label: this.labels.modal_swapcolor, tag: BDFDB.LibraryComponents.FormComponents.FormTags.H5, value: data.swapColors, onChange: value => newData.swapColors = value }) ] }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, { tab: this.labels.modal_tabheader3, ref: instance => {if (instance) tabs[this.labels.modal_tabheader3] = instance;}, children: [ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { title: this.labels.modal_colorpicker3, className: BDFDB.disCN.marginbottom20, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { color: data.color3, onColorChange: value => newData.color3 = value }) }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, { title: this.labels.modal_colorpicker4, className: BDFDB.disCN.marginbottom20, children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ColorSwatches, { color: data.color4, onColorChange: value => newData.color4 = value }) }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, { type: "Switch", margin: 20, label: this.labels.modal_copytooltipcolor, tag: BDFDB.LibraryComponents.FormComponents.FormTags.H5, value: data.copyTooltipColor, onChange: value => newData.copyTooltipColor = value }) ] }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, { tab: this.labels.modal_tabheader4, ref: instance => {if (instance) tabs[this.labels.modal_tabheader4] = instance;}, children: BDFDB.ReactUtils.createElement(FolderIconCustomPreviewComponent, {}, true) }) ]; [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: "ModalFooter"}); if (index > -1) children[index].props.children = [ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Button, { children: BDFDB.LanguageUtils.LanguageStrings.SAVE, onClick: _ => { let folderColor = newData[newData.swapColors ? "color2" : "color1"]; this.updateFolder({ folderId: e.instance.props.folderId, folderName: newData.folderName, folderColor: folderColor ? BDFDB.ColorUtils.convert(folderColor && BDFDB.ObjectUtils.is(folderColor) ? folderColor[Object.keys(folderColor)[0]] : folderColor, "INT") : null }); if (!BDFDB.equals(newData, data)) { BDFDB.DataUtils.save(newData, this, "folders", e.instance.props.folderId); this.forceUpdateAll(); } e.instance.close(); } }) ]; } loadAllIcons () { let icons = {}; folderIcons.forEach((array, i) => { icons[i] = { openicon: array.openicon, closedicon: array.closedicon, customID: null }; }); for (let id in customIcons) icons[id] = Object.assign({customID: id}, customIcons[id]); return icons; } generateId (prefix) { if (prefix == "folder") { let id = Math.floor(Math.random() * 4294967296); return BDFDB.LibraryStores.SortedGuildStore.getGuildFolders().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; } } 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; else if (key == "mediaState") Object.assign(state, instance.props[key]); } return state; } getFolderConfig (folderId) { let folder = BDFDB.LibraryStores.SortedGuildStore.getGuildFolderById(folderId) || {}; let data = folderConfigs[folderId] || { iconID: "-1", muteFolder: false, autoRead: false, useClosedIcon: false, swapColors: false, copyTooltipColor: false, color1: null, color2: ["255","255","255"], color3: null, color4: null }; let nativeColor = data.swapColors ? "color2" : "color1"; if (!data[nativeColor]) data[nativeColor] = BDFDB.ColorUtils.convert(folder.folderColor, "RGBCOMP"); else if (folder.folderColor && !BDFDB.ColorUtils.compare(folder.folderColor, BDFDB.ColorUtils.convert(BDFDB.ObjectUtils.is(data[nativeColor]) ? data[nativeColor][Object.keys(data[nativeColor])[0]] : data[nativeColor], "INT"))) { data[nativeColor] = BDFDB.ColorUtils.convert(folder.folderColor, "RGBCOMP"); BDFDB.DataUtils.save(data, this, "folders", folderId); } folderConfigs[folderId] = data; return data; } createBase64SVG (paths, color1 = "#000000", color2 = "#FFFFFF") { if (paths.indexOf("`; if (isGradient1) { color1 = BDFDB.ColorUtils.convert(color1, "RGBA"); svg += ``; for (let pos of Object.keys(color1).sort()) svg += ``; svg += ``; } if (isGradient2) { color2 = BDFDB.ColorUtils.convert(color2, "RGBA"); 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)}`; } openFolderCreationMenu (guilds, initGuildId) { let targetedGuildIds = [].concat(initGuildId || []); BDFDB.ModalUtils.open(this, { size: "MEDIUM", header: this.labels.serversubmenu_createfolder, subHeader: "", contentClassName: BDFDB.disCN.listscroller, children: guilds.map((guild, i) => { return [ i == 0 ? null : BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormDivider, { className: BDFDB.disCNS.margintop4 + BDFDB.disCN.marginbottom4 }), BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ListRow, { prefix: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.GuildIcon, { className: BDFDB.disCN.listavatar, guild: guild, size: BDFDB.LibraryComponents.GuildIcon.Sizes.MEDIUM }), label: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TextScroller, { children: guild.name }), suffix: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Switch, { value: targetedGuildIds.includes(guild.id), onChange: value => { if (value) targetedGuildIds.push(guild.id); else BDFDB.ArrayUtils.remove(targetedGuildIds, guild.id, true); } }) }) ]; }).flat(10).filter(n => n), buttons: [{ contents: BDFDB.LanguageUtils.LanguageStrings.DONE, color: "BRAND", close: true, onClick: (modal, instance) => { this.createFolder(BDFDB.ArrayUtils.removeCopies(targetedGuildIds)); } }] }); } updateFolder (folder) { let oldGuildFolders = [].concat(BDFDB.LibraryStores.SortedGuildStore.getGuildFolders()), guildFolders = [], guildPositions = []; for (let oldFolder of oldGuildFolders) { if (oldFolder.folderId == folder.folderId) guildFolders.push(Object.assign({}, oldFolder, folder)); else guildFolders.push(oldFolder); } for (let folder of guildFolders) for (let fGuildId of folder.guildIds) guildPositions.push(fGuildId); BDFDB.LibraryModules.FolderSettingsUtils.saveGuildFolders(guildFolders); } createFolder (guildIds) { if (!guildIds) return; guildIds = [guildIds].flat(10); if (!guildIds.length) return; let oldGuildFolders = [].concat(BDFDB.LibraryStores.SortedGuildStore.getGuildFolders()), guildFolders = [], guildPositions = [], added = false; for (let oldFolder of oldGuildFolders) { if (!oldFolder.folderId && guildIds.includes(oldFolder.guildIds[0])) { if (!added) { added = true; guildFolders.push({ guildIds: guildIds, folderId: this.generateId("folder") }); } } else guildFolders.push(oldFolder); } for (let folder of guildFolders) for (let fGuildId of folder.guildIds) guildPositions.push(fGuildId); BDFDB.LibraryModules.FolderSettingsUtils.saveGuildFolders(guildFolders); } removeFolder (folderId) { let oldGuildFolders = [].concat(BDFDB.LibraryStores.SortedGuildStore.getGuildFolders()), guildFolders = [], guildPositions = []; for (let oldFolder of oldGuildFolders) { if (oldFolder.folderId == folderId) { for (let guildId of oldFolder.guildIds) guildFolders.push({guildIds: [guildId]}); } else guildFolders.push(oldFolder); } for (let folder of guildFolders) for (let fGuildId of folder.guildIds) guildPositions.push(fGuildId); BDFDB.LibraryModules.FolderSettingsUtils.saveGuildFolders(guildFolders); } addGuildToFolder (folderId, guildId) { let oldGuildFolders = [].concat(BDFDB.LibraryStores.SortedGuildStore.getGuildFolders()), guildFolders = [], guildPositions = []; for (let oldFolder of oldGuildFolders) { if (oldFolder.folderId) { let newFolder = Object.assign({}, oldFolder); if (oldFolder.folderId == folderId) newFolder.guildIds.push(guildId); else BDFDB.ArrayUtils.remove(newFolder.guildIds, guildId); guildFolders.push(newFolder); } else if (oldFolder.guildIds[0] != guildId) guildFolders.push(oldFolder); } for (let folder of guildFolders) for (let fGuildId of folder.guildIds) guildPositions.push(fGuildId); BDFDB.LibraryModules.FolderSettingsUtils.saveGuildFolders(guildFolders); } removeGuildFromFolder (folderId, guildId) { let oldGuildFolders = [].concat(BDFDB.LibraryStores.SortedGuildStore.getGuildFolders()), guildFolders = [], guildPositions = []; for (let oldFolder of oldGuildFolders) { if (oldFolder.folderId == folderId) { let newFolder = Object.assign({}, oldFolder); BDFDB.ArrayUtils.remove(newFolder.guildIds, guildId); guildFolders.push(newFolder); guildFolders.push({guildIds: [guildId]}); } else guildFolders.push(oldFolder); } for (let folder of guildFolders) for (let fGuildId of folder.guildIds) guildPositions.push(fGuildId); BDFDB.LibraryModules.FolderSettingsUtils.saveGuildFolders(guildFolders); } createDragPreview (div, event) { if (!Node.prototype.isPrototypeOf(div)) return; let dragPreview = div.cloneNode(true); BDFDB.DOMUtils.addClass(dragPreview, BDFDB.disCN._serverfoldersdragpreview); BDFDB.DOMUtils.remove(dragPreview.querySelector(BDFDB.dotCNC.guildlowerbadge + BDFDB.dotCNC.guildupperbadge + BDFDB.dotCN.guildpillwrapper)); BDFDB.DOMUtils.hide(dragPreview); dragPreview.style.setProperty("pointer-events", "none", "important"); dragPreview.style.setProperty("left", event.clientX - 25 + "px", "important"); dragPreview.style.setProperty("top", event.clientY - 25 + "px", "important"); document.querySelector(BDFDB.dotCN.appmount).appendChild(dragPreview); return dragPreview; } updateDragPreview (dragPreview, event) { if (!Node.prototype.isPrototypeOf(dragPreview)) return; BDFDB.DOMUtils.show(dragPreview); dragPreview.style.setProperty("left", event.clientX - 25 + "px", "important"); dragPreview.style.setProperty("top", event.clientY - 25 + "px", "important"); } setLabelsByLanguage () { switch (BDFDB.LanguageUtils.getLanguage().id) { case "bg": // Bulgarian return { foldercontext_autoreadfolder: "Авто: Маркиране като прочетено", foldercontext_mutefolder: "Без звук папка", foldercontext_removefolder: "Изтриване на папка", foldercontext_removefolder_confirm: "Сигурни ли сте, че искате да изтриете папката {{var0}}", modal_colorpicker1: "Основен цвят на папката", modal_colorpicker2: "Вторичен цвят на папката", modal_colorpicker3: "Цвят на подсказка", modal_colorpicker4: "Цвят на шрифта", modal_copytooltipcolor: "Използвайте един и същи цвят за всички сървъри в папка", modal_customclosed: "Затворена икона", modal_customopen: "Отворете иконата", modal_custompreview: "Визуализация на иконата", modal_iconpicker: "Избор на папка", modal_swapcolor: "Използвайте втория цвят за оригиналната папка", modal_tabheader1: "Папка", modal_tabheader2: "Цвят на папката", modal_tabheader3: "Цвят на подсказка", modal_tabheader4: "Собствени символи", modal_useclosedicon: "Използвайте затворена икона вместо минисервъра", servercontext_serverfolders: "Папка на сървъра", serversubmenu_addtofolder: "Добавете сървъра към папката", serversubmenu_createfolder: "Създай папка", serversubmenu_removefromfolder: "Премахнете сървъра от папката" }; case "cs": // Czech return { foldercontext_autoreadfolder: "Auto: Označit jako přečtené", foldercontext_mutefolder: "Ztlumit složku", foldercontext_removefolder: "Smazat složku", foldercontext_removefolder_confirm: "Opravdu chcete smazat složku {{var0}}", modal_colorpicker1: "Barva primární složky", modal_colorpicker2: "Barva sekundární složky", modal_colorpicker3: "Barva popisku", modal_colorpicker4: "Barva fontu", modal_copytooltipcolor: "Použijte stejnou barvu pro všechny servery ve složce", modal_customclosed: "Uzavřená ikona", modal_customopen: "Otevřít ikonu", modal_custompreview: "Náhled ikony", modal_iconpicker: "Výběr složky", modal_swapcolor: "Pro původní složku použijte druhou barvu", modal_tabheader1: "Složka", modal_tabheader2: "Barva složky", modal_tabheader3: "Barva popisku", modal_tabheader4: "Vlastní ikony", modal_useclosedicon: "Místo miniserverů použijte uzavřenou ikonu", servercontext_serverfolders: "Složka serveru", serversubmenu_addtofolder: "Přidejte server do složky", serversubmenu_createfolder: "Vytvořit složku", serversubmenu_removefromfolder: "Odebrat server ze složky" }; case "da": // Danish return { foldercontext_autoreadfolder: "Auto: Marker som læst", foldercontext_mutefolder: "Dæmp mappe", foldercontext_removefolder: "Slet mappe", foldercontext_removefolder_confirm: "Er du sikker på, at du vil slette mappen {{var0}}", modal_colorpicker1: "Primær mappefarve", modal_colorpicker2: "Sekundær mappefarve", modal_colorpicker3: "Værktøjstipfarve", modal_colorpicker4: "Skriftfarve", modal_copytooltipcolor: "Brug den samme farve til alle servere i en mappe", modal_customclosed: "Lukket ikon", modal_customopen: "Åbn ikonet", modal_custompreview: "Eksempel på ikon", modal_iconpicker: "Mappevalg", modal_swapcolor: "Brug den anden farve til den originale mappe", modal_tabheader1: "Folder", modal_tabheader2: "Mappefarve", modal_tabheader3: "Værktøjstipfarve", modal_tabheader4: "Egne symboler", modal_useclosedicon: "Brug et lukket ikon i stedet for miniserver", servercontext_serverfolders: "Servermappe", serversubmenu_addtofolder: "Føj serveren til mappen", serversubmenu_createfolder: "Opret mappe", serversubmenu_removefromfolder: "Fjern serveren fra mappen" }; case "de": // German return { foldercontext_autoreadfolder: "Auto: Als gelesen markieren", foldercontext_mutefolder: "Ordner stummschalten", foldercontext_removefolder: "Ordner löschen", foldercontext_removefolder_confirm: "Möchtest du den Ordner {{var0}} wirklich löschen?", modal_colorpicker1: "Primäre Ordnerfarbe", modal_colorpicker2: "Sekundäre Ordnerfarbe", modal_colorpicker3: "Tooltipfarbe", modal_colorpicker4: "Schriftfarbe", modal_copytooltipcolor: "Dieselbe Farbe für alle Server eines Ordners verwenden", modal_customclosed: "Geschlossenes Icon", modal_customopen: "Geöffnetes Icon", modal_custompreview: "Symbolvorschau", modal_iconpicker: "Ordnerauswahl", modal_swapcolor: "Die zweite Farbe für den ursprünglichen Ordner verwenden", modal_tabheader1: "Ordner", modal_tabheader2: "Ordnerfarbe", modal_tabheader3: "Tooltipfarbe", modal_tabheader4: "Eigene Symbole", modal_useclosedicon: "Anstelle der Miniserver ein geschlossenes Symbol verwenden", servercontext_serverfolders: "Serverordner", serversubmenu_addtofolder: "Server zum Ordner hinzufügen", serversubmenu_createfolder: "Ordner erzeugen", serversubmenu_removefromfolder: "Server aus Ordner entfernen" }; case "el": // Greek return { foldercontext_autoreadfolder: "Αυτόματο: Επισήμανση ως αναγνωσμένου", foldercontext_mutefolder: "Σίγαση φακέλου", foldercontext_removefolder: "Διαγραφή φακέλου", foldercontext_removefolder_confirm: "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον φάκελο {{var0}}", modal_colorpicker1: "Κύριο χρώμα φακέλου", modal_colorpicker2: "Χρώμα δευτερεύοντος φακέλου", modal_colorpicker3: "Χρώμα επεξήγησης εργαλείου", modal_colorpicker4: "Χρώμα γραμματοσειράς", modal_copytooltipcolor: "Χρησιμοποιήστε το ίδιο χρώμα για όλους τους διακομιστές σε ένα φάκελο", modal_customclosed: "Κλειστό εικονίδιο", modal_customopen: "Άνοιγμα εικονιδίου", modal_custompreview: "Προεπισκόπηση εικονιδίου", modal_iconpicker: "Επιλογή φακέλου", modal_swapcolor: "Χρησιμοποιήστε το δεύτερο χρώμα για τον αρχικό φάκελο", modal_tabheader1: "Ντοσιέ", modal_tabheader2: "Χρώμα φακέλου", modal_tabheader3: "Χρώμα επεξήγησης εργαλείου", modal_tabheader4: "Ίδια σύμβολα", modal_useclosedicon: "Χρησιμοποιήστε ένα κλειστό εικονίδιο αντί για το miniserver", servercontext_serverfolders: "Φάκελος διακομιστή", serversubmenu_addtofolder: "Προσθέστε το διακομιστή στο φάκελο", serversubmenu_createfolder: "ΔΗΜΙΟΥΡΓΩ φακελο", serversubmenu_removefromfolder: "Κατάργηση διακομιστή από φάκελο" }; case "es": // Spanish return { foldercontext_autoreadfolder: "Automático: marcar como leído", foldercontext_mutefolder: "Silenciar carpeta", foldercontext_removefolder: "Eliminar carpeta", foldercontext_removefolder_confirm: "¿Está seguro de que desea eliminar la carpeta {{var0}}?", modal_colorpicker1: "Color de carpeta principal", modal_colorpicker2: "Color de carpeta secundaria", modal_colorpicker3: "Color de la información sobre herramientas", modal_colorpicker4: "Color de fuente", modal_copytooltipcolor: "Use el mismo color para todos los servidores de una carpeta", modal_customclosed: "Icono cerrado", modal_customopen: "Abrir icono", modal_custompreview: "Vista previa del icono", modal_iconpicker: "Selección de carpeta", modal_swapcolor: "Use el segundo color para la carpeta original", modal_tabheader1: "Carpeta", modal_tabheader2: "Color de la carpeta", modal_tabheader3: "Color de la información sobre herramientas", modal_tabheader4: "Símbolos propios", modal_useclosedicon: "Use un icono cerrado en lugar del miniserver", servercontext_serverfolders: "Carpeta del servidor", serversubmenu_addtofolder: "Agrega el servidor a la carpeta", serversubmenu_createfolder: "Crear carpeta", serversubmenu_removefromfolder: "Quitar servidor de carpeta" }; case "fi": // Finnish return { foldercontext_autoreadfolder: "Automaattinen: Merkitse luetuksi", foldercontext_mutefolder: "Mykistä kansio", foldercontext_removefolder: "Poista kansio", foldercontext_removefolder_confirm: "Haluatko varmasti poistaa kansion {{var0}}", modal_colorpicker1: "Ensisijaisen kansion väri", modal_colorpicker2: "Toissijaisen kansion väri", modal_colorpicker3: "Työkaluvinkin väri", modal_colorpicker4: "Fontin väri", modal_copytooltipcolor: "Käytä samaa väriä kaikille kansion palvelimille", modal_customclosed: "Suljettu kuvake", modal_customopen: "Avaa kuvake", modal_custompreview: "Kuvakkeen esikatselu", modal_iconpicker: "Kansion valinta", modal_swapcolor: "Käytä alkuperäisen kansion toista väriä", modal_tabheader1: "Kansio", modal_tabheader2: "Kansion väri", modal_tabheader3: "Työkaluvinkin väri", modal_tabheader4: "Omat symbolit", modal_useclosedicon: "Käytä suljetun kuvaketta minipalvelimen sijaan", servercontext_serverfolders: "Palvelinkansio", serversubmenu_addtofolder: "Lisää palvelin kansioon", serversubmenu_createfolder: "Luo kansio", serversubmenu_removefromfolder: "Poista palvelin kansiosta" }; case "fr": // French return { foldercontext_autoreadfolder: "Auto: marquer comme lu", foldercontext_mutefolder: "Dossier muet", foldercontext_removefolder: "Supprimer le dossier", foldercontext_removefolder_confirm: "Êtes-vous sûr de vouloir supprimer le dossier {{var0}}", modal_colorpicker1: "Couleur du dossier primaire", modal_colorpicker2: "Couleur du dossier secondaire", modal_colorpicker3: "Couleur de l'info-bulle", modal_colorpicker4: "Couleur de la police", modal_copytooltipcolor: "Utilisez la même couleur pour tous les serveurs d'un dossier", modal_customclosed: "Icône fermée", modal_customopen: "Icône ouverte", modal_custompreview: "Aperçu de l'icône", modal_iconpicker: "Sélection de dossier", modal_swapcolor: "Utilisez la deuxième couleur pour le dossier d'origine", modal_tabheader1: "Dossier", modal_tabheader2: "Couleur du dossier", modal_tabheader3: "Couleur de l'info-bulle", modal_tabheader4: "Propres symboles", modal_useclosedicon: "Utilisez une icône fermée au lieu du miniserver", servercontext_serverfolders: "Dossier du serveur", serversubmenu_addtofolder: "Ajouter le serveur au dossier", serversubmenu_createfolder: "Créer le dossier", serversubmenu_removefromfolder: "Supprimer le serveur du dossier" }; case "hi": // Hindi return { foldercontext_autoreadfolder: "ऑटो: पढ़ें के रूप में चिह्नित करें", foldercontext_mutefolder: "मूक फ़ोल्डर", foldercontext_removefolder: "फोल्डर हटा दें", foldercontext_removefolder_confirm: "क्या आप वाकई फ़ोल्डर को हटाना चाहते हैं {{var0}}", modal_colorpicker1: "प्राथमिक फ़ोल्डर रंग", modal_colorpicker2: "माध्यमिक फ़ोल्डर रंग", modal_colorpicker3: "टूलटिप रंग", modal_colorpicker4: "लिपि का रंग", modal_copytooltipcolor: "एक फ़ोल्डर में सभी सर्वरों के लिए एक ही रंग का प्रयोग करें", modal_customclosed: "बंद चिह्न", modal_customopen: "खुला चिह्न", modal_custompreview: "आइकन पूर्वावलोकन", modal_iconpicker: "फ़ोल्डर चयन", modal_swapcolor: "मूल फ़ोल्डर के लिए दूसरे रंग का प्रयोग करें", modal_tabheader1: "फ़ोल्डर", modal_tabheader2: "फ़ोल्डर का रंग", modal_tabheader3: "टूलटिप रंग", modal_tabheader4: "कस्टम चिह्न", modal_useclosedicon: "मिनी-सर्वर के बजाय बंद चिह्न का उपयोग करें", servercontext_serverfolders: "सर्वर फ़ोल्डर", serversubmenu_addtofolder: "सर्वर को फ़ोल्डर में जोड़ें", serversubmenu_createfolder: "फोल्डर बनाएं", serversubmenu_removefromfolder: "फ़ोल्डर से सर्वर निकालें" }; case "hr": // Croatian return { foldercontext_autoreadfolder: "Automatski: Označi kao pročitano", foldercontext_mutefolder: "Isključi mapu", foldercontext_removefolder: "Izbriši mapu", foldercontext_removefolder_confirm: "Jeste li sigurni da želite izbrisati mapu {{var0}}", modal_colorpicker1: "Boja primarne mape", modal_colorpicker2: "Boja sekundarne mape", modal_colorpicker3: "Boja opisa", modal_colorpicker4: "Boja fonta", modal_copytooltipcolor: "Koristite istu boju za sve poslužitelje u mapi", modal_customclosed: "Zatvorena ikona", modal_customopen: "Otvori ikonu", modal_custompreview: "Pregled ikone", modal_iconpicker: "Odabir mape", modal_swapcolor: "Upotrijebite drugu boju za izvornu mapu", modal_tabheader1: "Mapu", modal_tabheader2: "Boja mape", modal_tabheader3: "Boja opisa", modal_tabheader4: "Vlastiti simboli", modal_useclosedicon: "Upotrijebite zatvorenu ikonu umjesto miniservera", servercontext_serverfolders: "Mapa poslužitelja", serversubmenu_addtofolder: "Dodajte poslužitelj u mapu", serversubmenu_createfolder: "Stvori mapu", serversubmenu_removefromfolder: "Uklonite poslužitelj iz mape" }; case "hu": // Hungarian return { foldercontext_autoreadfolder: "Automatikus: Megjelölés olvasottként", foldercontext_mutefolder: "Mappa némítása", foldercontext_removefolder: "Mappa törlése", foldercontext_removefolder_confirm: "Biztosan törli a(z) {{var0}} mappát?", modal_colorpicker1: "Elsődleges mappa színe", modal_colorpicker2: "Másodlagos mappa színe", modal_colorpicker3: "Eszköztár színe", modal_colorpicker4: "Betű szín", modal_copytooltipcolor: "Használja ugyanazt a színt egy mappa összes kiszolgálójához", modal_customclosed: "Zárt ikonra", modal_customopen: "Megnyitás ikonra", modal_custompreview: "Ikon előnézet", modal_iconpicker: "Mappa kiválasztása", modal_swapcolor: "Használja az eredeti mappa második színét", modal_tabheader1: "Mappába", modal_tabheader2: "Mappa színe", modal_tabheader3: "Eszköztár színe", modal_tabheader4: "Saját szimbólumok", modal_useclosedicon: "Használjon zárt ikont a miniszerver helyett", servercontext_serverfolders: "Szerver mappa", serversubmenu_addtofolder: "Adja hozzá a szervert a mappához", serversubmenu_createfolder: "Mappa létrehozás", serversubmenu_removefromfolder: "Távolítsa el a szervert a mappából" }; case "it": // Italian return { foldercontext_autoreadfolder: "Auto: contrassegna come letto", foldercontext_mutefolder: "Disattiva cartella", foldercontext_removefolder: "Elimina cartella", foldercontext_removefolder_confirm: "Sei sicuro di voler eliminare la cartella {{var0}}", modal_colorpicker1: "Colore cartella principale", modal_colorpicker2: "Colore cartella secondaria", modal_colorpicker3: "Colore della descrizione comando", modal_colorpicker4: "Colore del carattere", modal_copytooltipcolor: "Usa lo stesso colore per tutti i server in una cartella", modal_customclosed: "Icona chiusa", modal_customopen: "Icona Apri", modal_custompreview: "Anteprima icona", modal_iconpicker: "Selezione della cartella", modal_swapcolor: "Usa il secondo colore per la cartella originale", modal_tabheader1: "Cartella", modal_tabheader2: "Colore cartella", modal_tabheader3: "Colore della descrizione comando", modal_tabheader4: "Simboli propri", modal_useclosedicon: "Utilizza un'icona chiusa al posto del miniserver", servercontext_serverfolders: "Cartella del server", serversubmenu_addtofolder: "Aggiungi il server alla cartella", serversubmenu_createfolder: "Creare una cartella", serversubmenu_removefromfolder: "Rimuovi il server dalla cartella" }; case "ja": // Japanese return { foldercontext_autoreadfolder: "自動:既読としてマーク", foldercontext_mutefolder: "ミュートフォルダ", foldercontext_removefolder: "フォルダを削除", foldercontext_removefolder_confirm: "本当にフォルダ {{var0}} を削除しますか?", modal_colorpicker1: "プライマリフォルダの色", modal_colorpicker2: "セカンダリフォルダの色", modal_colorpicker3: "ツールチップの色", modal_colorpicker4: "フォントの色", modal_copytooltipcolor: "フォルダ内のすべてのサーバーに同じ色を使用する", modal_customclosed: "閉じたアイコン", modal_customopen: "アイコンを開く", modal_custompreview: "アイコンプレビュー", modal_iconpicker: "フォルダの選択", modal_swapcolor: "元のフォルダに2番目の色を使用します", modal_tabheader1: "フォルダ", modal_tabheader2: "フォルダーの色", modal_tabheader3: "ツールチップの色", modal_tabheader4: "独自のシンボル", modal_useclosedicon: "ミニサーバーの代わりに閉じたアイコンを使用する", servercontext_serverfolders: "サーバーフォルダ", serversubmenu_addtofolder: "サーバーをフォルダーに追加します", serversubmenu_createfolder: "フォルダーを作る", serversubmenu_removefromfolder: "フォルダからサーバーを削除します" }; case "ko": // Korean return { foldercontext_autoreadfolder: "자동 : 읽은 상태로 표시", foldercontext_mutefolder: "폴더 음소거", foldercontext_removefolder: "폴더 삭제", foldercontext_removefolder_confirm: "{{var0}} 폴더를 삭제하시겠습니까?", modal_colorpicker1: "기본 폴더 색상", modal_colorpicker2: "보조 폴더 색상", modal_colorpicker3: "툴팁 색상", modal_colorpicker4: "글자 색", modal_copytooltipcolor: "폴더의 모든 서버에 동일한 색상 사용", modal_customclosed: "닫힌 아이콘", modal_customopen: "열기 아이콘", modal_custompreview: "아이콘 미리보기", modal_iconpicker: "폴더 선택", modal_swapcolor: "원본 폴더에 두 번째 색상 사용", modal_tabheader1: "폴더", modal_tabheader2: "폴더 색상", modal_tabheader3: "툴팁 색상", modal_tabheader4: "자신의 기호", modal_useclosedicon: "미니 서버 대신 닫힌 아이콘 사용", servercontext_serverfolders: "서버 폴더", serversubmenu_addtofolder: "폴더에 서버 추가", serversubmenu_createfolder: "폴더 생성", serversubmenu_removefromfolder: "폴더에서 서버 제거" }; case "lt": // Lithuanian return { foldercontext_autoreadfolder: "Automatinis: pažymėti kaip perskaitytą", foldercontext_mutefolder: "Nutildyti aplanką", foldercontext_removefolder: "Ištrinti aplanką", foldercontext_removefolder_confirm: "Ar tikrai norite ištrinti aplanką {{var0}}", modal_colorpicker1: "Pagrindinio aplanko spalva", modal_colorpicker2: "Antrinio aplanko spalva", modal_colorpicker3: "Patarimo spalva", modal_colorpicker4: "Šrifto spalva", modal_copytooltipcolor: "Naudokite tą pačią spalvą visiems aplanko serveriams", modal_customclosed: "Uždaryta piktograma", modal_customopen: "Atidaryti piktogramą", modal_custompreview: "Piktogramos peržiūra", modal_iconpicker: "Aplanko pasirinkimas", modal_swapcolor: "Originalo aplankui naudokite antrą spalvą", modal_tabheader1: "Aplanką", modal_tabheader2: "Aplanko spalva", modal_tabheader3: "Patarimo spalva", modal_tabheader4: "Savo simbolius", modal_useclosedicon: "Vietoj miniserverio naudokite uždarą piktogramą", servercontext_serverfolders: "Serverio aplankas", serversubmenu_addtofolder: "Pridėkite serverį prie aplanko", serversubmenu_createfolder: "Sukurti aplanką", serversubmenu_removefromfolder: "Pašalinti serverį iš aplanko" }; case "nl": // Dutch return { foldercontext_autoreadfolder: "Auto: Markeer als gelezen", foldercontext_mutefolder: "Mute map", foldercontext_removefolder: "Verwijder map", foldercontext_removefolder_confirm: "Weet u zeker dat u de map {{var0}} wilt verwijderen", modal_colorpicker1: "Kleur primaire map", modal_colorpicker2: "Kleur secundaire map", modal_colorpicker3: "Tooltipkleur", modal_colorpicker4: "Letterkleur", modal_copytooltipcolor: "Gebruik dezelfde kleur voor alle servers in een map", modal_customclosed: "Gesloten pictogram", modal_customopen: "Open icoon", modal_custompreview: "Pictogramvoorbeeld", modal_iconpicker: "Map selecteren", modal_swapcolor: "Gebruik de tweede kleur voor de originele map", modal_tabheader1: "Map", modal_tabheader2: "Mapkleur", modal_tabheader3: "Tooltipkleur", modal_tabheader4: "Eigen symbolen", modal_useclosedicon: "Gebruik een gesloten pictogram in plaats van de miniserver", servercontext_serverfolders: "Servermap", serversubmenu_addtofolder: "Voeg de server toe aan de map", serversubmenu_createfolder: "Map aanmaken", serversubmenu_removefromfolder: "Verwijder de server uit de map" }; case "no": // Norwegian return { foldercontext_autoreadfolder: "Auto: Merk som lest", foldercontext_mutefolder: "Demp mappe", foldercontext_removefolder: "Slett mappe", foldercontext_removefolder_confirm: "Er du sikker på at du vil slette mappen {{var0}}", modal_colorpicker1: "Primær mappefarge", modal_colorpicker2: "Sekundær mappefarge", modal_colorpicker3: "Verktøytipsfarge", modal_colorpicker4: "Skriftfarge", modal_copytooltipcolor: "Bruk samme farge for alle servere i en mappe", modal_customclosed: "Lukket ikon", modal_customopen: "Åpne ikonet", modal_custompreview: "Forhåndsvisning av ikon", modal_iconpicker: "Mappevalg", modal_swapcolor: "Bruk den andre fargen for den originale mappen", modal_tabheader1: "Mappe", modal_tabheader2: "Mappefarge", modal_tabheader3: "Verktøytipsfarge", modal_tabheader4: "Egne symboler", modal_useclosedicon: "Bruk et lukket ikon i stedet for miniserver", servercontext_serverfolders: "Servermappe", serversubmenu_addtofolder: "Legg til serveren i mappen", serversubmenu_createfolder: "Lag mappe", serversubmenu_removefromfolder: "Fjern serveren fra mappen" }; case "pl": // Polish return { foldercontext_autoreadfolder: "Auto: oznacz jako przeczytane", foldercontext_mutefolder: "Wycisz folder", foldercontext_removefolder: "Usunięty folder", foldercontext_removefolder_confirm: "Czy na pewno chcesz usunąć folder {{var0}}", modal_colorpicker1: "Główny kolor folderu", modal_colorpicker2: "Kolor folderu dodatkowego", modal_colorpicker3: "Kolor podpowiedzi", modal_colorpicker4: "Kolor czcionki", modal_copytooltipcolor: "Użyj tego samego koloru dla wszystkich serwerów w folderze", modal_customclosed: "Ikona zamknięta", modal_customopen: "Otwórz ikonę", modal_custompreview: "Podgląd ikon", modal_iconpicker: "Wybór folderu", modal_swapcolor: "Użyj drugiego koloru dla oryginalnego folderu", modal_tabheader1: "Teczka", modal_tabheader2: "Kolor folderu", modal_tabheader3: "Kolor podpowiedzi", modal_tabheader4: "Własne symbole", modal_useclosedicon: "Użyj zamkniętej ikony zamiast miniserwera", servercontext_serverfolders: "Folder serwera", serversubmenu_addtofolder: "Dodaj serwer do folderu", serversubmenu_createfolder: "Utwórz folder", serversubmenu_removefromfolder: "Usuń serwer z folderu" }; case "pt-BR": // Portuguese (Brazil) return { foldercontext_autoreadfolder: "Auto: Marcar como lido", foldercontext_mutefolder: "Pasta sem som", foldercontext_removefolder: "Excluir pasta", foldercontext_removefolder_confirm: "Tem certeza de que deseja excluir a pasta {{var0}}", modal_colorpicker1: "Cor da pasta primária", modal_colorpicker2: "Cor secundária da pasta", modal_colorpicker3: "Cor da dica de ferramenta", modal_colorpicker4: "Cor da fonte", modal_copytooltipcolor: "Use a mesma cor para todos os servidores em uma pasta", modal_customclosed: "Ícone fechado", modal_customopen: "Ícone aberto", modal_custompreview: "Antevisão do ícone", modal_iconpicker: "Seleção de pasta", modal_swapcolor: "Use a segunda cor para a pasta original", modal_tabheader1: "Pasta", modal_tabheader2: "Cor da pasta", modal_tabheader3: "Cor da dica de ferramenta", modal_tabheader4: "Símbolos próprios", modal_useclosedicon: "Use um ícone fechado em vez do miniserver", servercontext_serverfolders: "Pasta do servidor", serversubmenu_addtofolder: "Adicione o servidor à pasta", serversubmenu_createfolder: "Criar pasta", serversubmenu_removefromfolder: "Remover servidor da pasta" }; case "ro": // Romanian return { foldercontext_autoreadfolder: "Automat: marcați ca citit", foldercontext_mutefolder: "Dezactivați folderul", foldercontext_removefolder: "Ștergeți folderul", foldercontext_removefolder_confirm: "Sigur doriți să ștergeți dosarul {{var0}}", modal_colorpicker1: "Culoarea folderului principal", modal_colorpicker2: "Culoare dosar secundar", modal_colorpicker3: "Culoarea sfatului de instrumente", modal_colorpicker4: "Culoarea fontului", modal_copytooltipcolor: "Utilizați aceeași culoare pentru toate serverele dintr-un folder", modal_customclosed: "Pictogramă închisă", modal_customopen: "Pictogramă Deschidere", modal_custompreview: "Previzualizare pictogramă", modal_iconpicker: "Selectarea dosarelor", modal_swapcolor: "Utilizați a doua culoare pentru folderul original", modal_tabheader1: "Pliant", modal_tabheader2: "Culoare dosar", modal_tabheader3: "Culoarea sfatului de instrumente", modal_tabheader4: "Simboluri proprii", modal_useclosedicon: "Folosiți o pictogramă închisă în locul miniserverului", servercontext_serverfolders: "Dosar server", serversubmenu_addtofolder: "Adăugați serverul în dosar", serversubmenu_createfolder: "Creeaza dosar", serversubmenu_removefromfolder: "Eliminați serverul din dosar" }; case "ru": // Russian return { foldercontext_autoreadfolder: "Авто: Отметить как прочитанное", foldercontext_mutefolder: "Отключить папку", foldercontext_removefolder: "Удалить папку", foldercontext_removefolder_confirm: "Вы уверены, что хотите удалить папку {{var0}}", modal_colorpicker1: "Цвет основной папки", modal_colorpicker2: "Цвет вторичной папки", modal_colorpicker3: "Цвет всплывающей подсказки", modal_colorpicker4: "Цвет шрифта", modal_copytooltipcolor: "Используйте один цвет для всех серверов в папке", modal_customclosed: "Закрытый значок", modal_customopen: "Открыть значок", modal_custompreview: "Предварительный просмотр значков", modal_iconpicker: "Выбор папки", modal_swapcolor: "Используйте второй цвет для исходной папки", modal_tabheader1: "Папка", modal_tabheader2: "Цвет папки", modal_tabheader3: "Цвет всплывающей подсказки", modal_tabheader4: "Собственные символы", modal_useclosedicon: "Используйте закрытый значок вместо минисервера", servercontext_serverfolders: "Папка сервера", serversubmenu_addtofolder: "Добавьте сервер в папку", serversubmenu_createfolder: "Создать папку", serversubmenu_removefromfolder: "Удалить сервер из папки" }; case "sv": // Swedish return { foldercontext_autoreadfolder: "Auto: Markera som läst", foldercontext_mutefolder: "Tyst mapp", foldercontext_removefolder: "Ta bort mapp", foldercontext_removefolder_confirm: "Är du säker på att du vill ta bort mappen {{var0}}", modal_colorpicker1: "Primär mappfärg", modal_colorpicker2: "Sekundär mappfärg", modal_colorpicker3: "Verktygstipsfärg", modal_colorpicker4: "Fontfärg", modal_copytooltipcolor: "Använd samma färg för alla servrar i en mapp", modal_customclosed: "Stängd ikon", modal_customopen: "Öppna ikonen", modal_custompreview: "Ikonförhandsvisning", modal_iconpicker: "Mappval", modal_swapcolor: "Använd den andra färgen för den ursprungliga mappen", modal_tabheader1: "Mapp", modal_tabheader2: "Mappfärg", modal_tabheader3: "Verktygstipsfärg", modal_tabheader4: "Egna symboler", modal_useclosedicon: "Använd en stängd ikon istället för miniserver", servercontext_serverfolders: "Servermapp", serversubmenu_addtofolder: "Lägg till servern i mappen", serversubmenu_createfolder: "Skapa mapp", serversubmenu_removefromfolder: "Ta bort servern från mappen" }; case "th": // Thai return { foldercontext_autoreadfolder: "อัตโนมัติ: ทำเครื่องหมายว่าอ่านแล้ว", foldercontext_mutefolder: "ปิดเสียงโฟลเดอร์", foldercontext_removefolder: "ลบโฟลเดอร์", foldercontext_removefolder_confirm: "คุณแน่ใจหรือว่าต้องการลบโฟลเดอร์ {{var0}}", modal_colorpicker1: "สีโฟลเดอร์หลัก", modal_colorpicker2: "สีโฟลเดอร์รอง", modal_colorpicker3: "สีคำแนะนำเครื่องมือ", modal_colorpicker4: "สีตัวอักษร", modal_copytooltipcolor: "ใช้สีเดียวกันสำหรับเซิร์ฟเวอร์ทั้งหมดในโฟลเดอร์", modal_customclosed: "ไอคอนปิด", modal_customopen: "เปิดไอคอน", modal_custompreview: "ดูตัวอย่างไอคอน", modal_iconpicker: "การเลือกโฟลเดอร์", modal_swapcolor: "ใช้สีที่สองสำหรับโฟลเดอร์เดิม", modal_tabheader1: "โฟลเดอร์", modal_tabheader2: "สีโฟลเดอร์", modal_tabheader3: "สีคำแนะนำเครื่องมือ", modal_tabheader4: "สัญลักษณ์ของตัวเอง", modal_useclosedicon: "ใช้ไอคอนปิดแทน miniserver", servercontext_serverfolders: "โฟลเดอร์เซิร์ฟเวอร์", serversubmenu_addtofolder: "เพิ่มเซิร์ฟเวอร์ลงในโฟลเดอร์", serversubmenu_createfolder: "สร้างโฟลเดอร์", serversubmenu_removefromfolder: "ลบเซิร์ฟเวอร์ออกจากโฟลเดอร์" }; case "tr": // Turkish return { foldercontext_autoreadfolder: "Otomatik: Okundu olarak işaretle", foldercontext_mutefolder: "Klasörü sessize al", foldercontext_removefolder: "Klasörü sil", foldercontext_removefolder_confirm: "{{var0}} Klasörünü silmek istediğinizden emin misiniz?", modal_colorpicker1: "Birincil klasör rengi", modal_colorpicker2: "İkincil klasör rengi", modal_colorpicker3: "Araç ipucu rengi", modal_colorpicker4: "Yazı rengi", modal_copytooltipcolor: "Bir klasördeki tüm sunucular için aynı rengi kullanın", modal_customclosed: "Kapalı simge", modal_customopen: "Aç simgesi", modal_custompreview: "Simge önizlemesi", modal_iconpicker: "Klasör seçimi", modal_swapcolor: "Orijinal klasör için ikinci rengi kullanın", modal_tabheader1: "Klasör", modal_tabheader2: "Klasör rengi", modal_tabheader3: "Araç ipucu rengi", modal_tabheader4: "Kendi sembolleri", modal_useclosedicon: "Miniserver yerine kapalı bir simge kullanın", servercontext_serverfolders: "Sunucu klasörü", serversubmenu_addtofolder: "Sunucuyu klasöre ekleyin", serversubmenu_createfolder: "Klasör oluşturun", serversubmenu_removefromfolder: "Sunucuyu klasörden kaldır" }; case "uk": // Ukrainian return { foldercontext_autoreadfolder: "Авто: Позначити як прочитане", foldercontext_mutefolder: "Вимкнути папку", foldercontext_removefolder: "Видалити папку", foldercontext_removefolder_confirm: "Ви впевнені, що хочете видалити папку {{var0}}", modal_colorpicker1: "Основний колір папки", modal_colorpicker2: "Колір вторинної папки", modal_colorpicker3: "Колір підказки", modal_colorpicker4: "Колір шрифту", modal_copytooltipcolor: "Використовуйте однаковий колір для всіх серверів у папці", modal_customclosed: "Закритий значок", modal_customopen: "Відкрити значок", modal_custompreview: "Попередній перегляд піктограми", modal_iconpicker: "Вибір папки", modal_swapcolor: "Використовуйте другий колір для вихідної папки", modal_tabheader1: "Папку", modal_tabheader2: "Колір папки", modal_tabheader3: "Колір підказки", modal_tabheader4: "Власні символи", modal_useclosedicon: "Використовуйте закритий значок замість мінісервера", servercontext_serverfolders: "Папка сервера", serversubmenu_addtofolder: "Додайте сервер до папки", serversubmenu_createfolder: "Створити папку", serversubmenu_removefromfolder: "Видалити сервер з папки" }; case "vi": // Vietnamese return { foldercontext_autoreadfolder: "Tự động: Đánh dấu là đã đọc", foldercontext_mutefolder: "Thư mục ẩn", foldercontext_removefolder: "Xóa thư mục", foldercontext_removefolder_confirm: "Bạn có chắc chắn muốn xóa Thư mục {{var0}} không", modal_colorpicker1: "Màu thư mục chính", modal_colorpicker2: "Màu thư mục phụ", modal_colorpicker3: "Màu chú giải công cụ", modal_colorpicker4: "Màu phông chữ", modal_copytooltipcolor: "Sử dụng cùng một màu cho tất cả các máy chủ trong một thư mục", modal_customclosed: "Biểu tượng đã đóng", modal_customopen: "Mở biểu tượng", modal_custompreview: "Xem trước biểu tượng", modal_iconpicker: "Lựa chọn thư mục", modal_swapcolor: "Sử dụng màu thứ hai cho thư mục gốc", modal_tabheader1: "Thư mục", modal_tabheader2: "Màu thư mục", modal_tabheader3: "Màu chú giải công cụ", modal_tabheader4: "Ký hiệu riêng", modal_useclosedicon: "Sử dụng biểu tượng đã đóng thay vì trình thu nhỏ", servercontext_serverfolders: "Thư mục máy chủ", serversubmenu_addtofolder: "Thêm máy chủ vào thư mục", serversubmenu_createfolder: "Tạo thư mục", serversubmenu_removefromfolder: "Xóa máy chủ khỏi thư mục" }; case "zh-CN": // Chinese (China) return { foldercontext_autoreadfolder: "自动:标记为已读", foldercontext_mutefolder: "静音文件夹", foldercontext_removefolder: "删除文件夹", foldercontext_removefolder_confirm: "您确定要删除文件夹 {{var0}}", modal_colorpicker1: "文件夹主色", modal_colorpicker2: "文件夹辅色", modal_colorpicker3: "工具提示颜色", modal_colorpicker4: "字体颜色", modal_copytooltipcolor: "对文件夹中的所有服务器使用相同颜色", modal_customclosed: "文件夹收起图标", modal_customopen: "文件夹展开图标", modal_custompreview: "图标预览", modal_iconpicker: "文件夹选择", modal_swapcolor: "将文件夹副色应用于原始文件夹", modal_tabheader1: "文件夹", modal_tabheader2: "文件夹颜色", modal_tabheader3: "工具提示颜色", modal_tabheader4: "自定义图标", modal_useclosedicon: "使用文件夹收起图标代替服务器缩略图", servercontext_serverfolders: "服务器文件夹", serversubmenu_addtofolder: "将服务器添加到文件夹", serversubmenu_createfolder: "创建文件夹", serversubmenu_removefromfolder: "从文件夹中移除服务器" }; case "zh-TW": // Chinese (Taiwan) return { foldercontext_autoreadfolder: "自動:標記為已讀", foldercontext_mutefolder: "靜音資料夾", foldercontext_removefolder: "刪除資料夾", foldercontext_removefolder_confirm: "您確定要刪除文件夾 {{var0}}", modal_colorpicker1: "資料夾主色", modal_colorpicker2: "資料夾輔色", modal_colorpicker3: "工具提示顏色", modal_colorpicker4: "字體顏色", modal_copytooltipcolor: "對資料夾中的所有伺服器使用相同顏色", modal_customclosed: "資料夾收起圖標", modal_customopen: "資料夾展開圖標", modal_custompreview: "圖標預覽", modal_iconpicker: "資料夾選擇", modal_swapcolor: "將文件夾輔色應用於原始資料夾", modal_tabheader1: "資料夾", modal_tabheader2: "資料夾顏色", modal_tabheader3: "工具提示顏色", modal_tabheader4: "客製化圖標", modal_useclosedicon: "使用資料夾收起圖標代替伺服器縮略圖", servercontext_serverfolders: "伺服器資料夾", serversubmenu_addtofolder: "將伺服器添加到資料夾", serversubmenu_createfolder: "創建資料夾", serversubmenu_removefromfolder: "從資料夾中移除伺服器" }; default: // English return { foldercontext_autoreadfolder: "Auto: Mark As Read", foldercontext_mutefolder: "Mute Folder", foldercontext_removefolder: "Delete Folder", foldercontext_removefolder_confirm: "Are you sure you want to delete the Folder {{var0}}", modal_colorpicker1: "Primary Folder Color", modal_colorpicker2: "Secondary Folder Color", modal_colorpicker3: "Tooltip Color", modal_colorpicker4: "Font Color", modal_copytooltipcolor: "Use the same Color for all Servers in a Folder", modal_customclosed: "Closed Icon", modal_customopen: "Open Icon", modal_custompreview: "Icon Preview", modal_iconpicker: "Folder Selection", modal_swapcolor: "Use the second Color for the original Folder", modal_tabheader1: "Folder", modal_tabheader2: "Folder Color", modal_tabheader3: "Tooltip Color", modal_tabheader4: "Custom Icons", modal_useclosedicon: "Use a closed Icon instead of the Mini-Servers", servercontext_serverfolders: "Server Folder", serversubmenu_addtofolder: "Add the Server to the Folder", serversubmenu_createfolder: "Create Folder", serversubmenu_removefromfolder: "Remove Server from Folder" }; } } }; })(window.BDFDB_Global.PluginUtils.buildPlugin(changeLog)); })();