BetterDiscordAddons/Plugins/ServerFolders/ServerFolders.plugin.js

2014 lines
112 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @name ServerFolders
* @author DevilBro
* @authorId 278543574059057154
* @version 7.1.2
* @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 = `<div style="color: var(--header-primary); font-size: 16px; font-weight: 300; white-space: pre; line-height: 22px;">The Library Plugin needed for ${this.name} is missing.\nPlease click <a style="font-weight: 500;">Download Now</a> to install it.</div>`;
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 = {};
var GuildItemWrapperComponent;
const folderIcons = [
{openicon: `<path d="M 200,390 H 955 L 795,770 H 200 Z" fill="REPLACE_FILL2"/><path d="M 176.6,811 C 163.9,811 155.1,802.6 155,784.7 V 212.9 C 157.9,190.5 169,179.8 195.9,176 h 246 c 20.3,3.2 34.5,18.7 41,28.6 C 494.9,228.3 492.9,240.4 494,266 l 313.6,1.3 c 17.6,0.4 23.3,3.7 23.3,3.7 8.6,4.2 14.8,10.7 19,19.5 C 856.3,319.5 854,360 854,360 h 108.9 c 4.4,2.4 13.7,1.2 11.8,23.5 L 815.8,789.4 c -2.1,5.2 -12.5,13.6 -18.7,16.1 -6.8,2.7 -18.5,5.5 -23.9,5.5 z M 767,759 897,430 H 360 L 230,759 Z" fill="REPLACE_FILL1"/>`,
closedicon: `<path d="M 175,320 V 790 H 820 V 320 Z" fill="REPLACE_FILL2"/><path d="M 183,811 c -12.2,-0.6 -17.9,-4.8 -21.5,-8.2 C 159.5,801 154.8,792.6 155,779.7 V 215.6 c 3.3,-14.1 9.3,-21.4 15.1,-26.4 7.4,-6.3 16,-11.6 36.7,-13.2 h 237.3 c 23.3,6 32.2,18.7 38.7,28.6 7.6,11.7 9.4,18.6 10.3,41.4 L 494,266 h 313.4 c 16.9,0.1 23.5,5.1 23.5,5.1 8.6,4.2 14.5,10.9 19,19.5 0,0 3.7,7.5 3.1,19.8 V 777.2 c -1.1,9 -4.1,13.7 -4.1,13.7 -4.2,8.6 -10.7,14.8 -19.5,19 L 823.3,811 Z m 602.8,-55 c 2.8,-1.7 6.9,-4.5 8.9,-7.4 2.4,-3.6 5,-10.8 5.4,-24.7 V 362 c -0.2,-10.9 -4.2,-16.3 -4.2,-16.3 -2,-3 -5.9,-6.8 -8.7,-8.6 0,0 -5.8,-3 -12.7,-3.2 h -548.1 c -7.8,0 -13.9,3.6 -13.9,3.6 -3,2 -7.3,6.7 -8.4,17.3 v 386.4 c 2.8,10.4 7.5,16 13.6,17.7 h 544.9 c 11,-0.2 18.4,-1.9 23.3,-3 z" fill="REPLACE_FILL1"/>`},
{openicon: `<path d="M 167,200 h 200 l 50,50 H 829.8 L 830,330 H 970 L 825,779 H 167 Z" fill="REPLACE_FILL2"/><path d="M 184,799 c -10.5,0 -22.3,-5.3 -27,-10 -4.7,-4.7 -9,-15.1 -9,-34 V 212 c 0,-13.3 5,-22 11,-28 4.4,-4.4 15.4,-10 30,-10 h 170.3 l 53.3,53 H 820 c 13.1,0 18.2,4.2 25,10 6.4,5.5 7,14.4 7,31 v 52 h 122.3 c 11.6,0 17.1,3.3 17.1,3.3 2.9,2.9 3.3,4.4 3.3,14.2 0,8.4 -0.9,13.5 -3.8,22.4 L 849,799 Z M 933,360 H 335 l -130,398.1 603.2,1.3 z M 289.7,334.6 c 3,-8.2 8,-14.8 17,-14.8 0,0 506.6,0.2 506.3,0.2 0,-39.8 -12.2,-53 -53,-53 L 403.3,266.7 350,213 H 240 c -37.6,0 -53,10.1 -53,53 v 382.7 z" fill="REPLACE_FILL1"/>`,
closedicon: `<path d="M 173,190 V 771 H 825 V 250 H 420 l -70,-60 z" fill="REPLACE_FILL2"/><path d="M 184.2,799 C 170.3,799 164.3,795.8 157.4,788.9 151.7,783.3 148,774.6 148,754.9 V 211.2 c 0.7,-18.6 6,-21.7 11.9,-27.6 6.8,-6.8 15.5,-9.4 29.3,-9.6 h 170.1 l 53.3,53 h 407.7 c 14.1,0 18.6,2.8 25.3,9.4 6.4,6.4 7.1,13.4 7.1,30.8 v 246.1 247.4 c 0.2,11.8 -1.9,22.1 -7.4,27.6 C 839.7,793.9 831,799 819.4,799 Z M 813,707 V 415 c 0,-36.9 -13.9,-53 -53,-53 H 240 c -38.1,0 -53,11.7 -53,53 v 292 c 0,38.8 11.5,53 53,53 h 520 c 37.8,0 53,-12.1 53,-53 z M 760,267 c 0,0 -228.6,-0.3 -356.7,-0.3 L 350,213 H 240 c -41.6,2.7 -52.2,14.3 -53,53 v 54 h 626 c -0.6,-37.5 -12,-53 -53,-53 z" fill="REPLACE_FILL1"/>`},
{openicon: `<path d="M 307,330 H 970 L 825,779 H 167 Z" fill="REPLACE_FILL2"/><path d="M 189 174 C 174.4 174 163.4 179.6 159 184 C 153 190 148 198.7 148 212 L 148 755 C 148 773.9 152.3 784.3 157 789 C 161.7 793.7 173.5 799 184 799 L 849 799 L 990.8 359.8 C 993.8 350.9 994.7 345.9 994.7 337.4 C 994.7 327.6 994.3 326.2 991.4 323.3 C 991.4 323.3 985.9 320 974.3 320 L 852 320 L 852 268 C 852 251.4 851.4 242.5 845 237 C 838.2 231.2 833.1 227 820 227 L 412.6 227 L 359.3 174 L 189 174 z M 335 360 L 933 360 L 808.2 759.3 L 205 758.1 L 335 360 z" fill="REPLACE_FILL1"/>`,
closedicon: `<path d="M 173,345 V 771 H 825 V 345 Z" fill="REPLACE_FILL2"/><path d="M 189.2 174 C 175.4 174.2 166.7 176.8 159.9 183.6 C 154 189.5 148.7 192.7 148 211.2 L 148 754.9 C 148 774.6 151.7 783.3 157.4 788.9 C 164.3 795.8 170.3 799 184.2 799 L 819.4 799 C 831 799 839.7 793.9 845.2 788.4 C 850.8 782.8 852.9 772.5 852.7 760.8 L 852.7 513.3 L 852.7 267.2 C 852.7 249.8 852 242.8 845.6 236.4 C 838.9 229.7 834.4 227 820.3 227 L 412.6 227 L 359.3 174 L 189.2 174 z M 240 362 L 760 362 C 799.1 362 813 378.1 813 415 L 813 707 C 813 747.9 797.8 760 760 760 L 240 760 C 198.5 760 187 745.8 187 707 L 187 415 C 187 373.7 201.9 362 240 362 z" fill="REPLACE_FILL1"/>`},
{openicon: `<path d="M 167,200 h 200 l 50,50 H 829.8 L 830,330 H 314 L 167,779 Z" fill="REPLACE_FILL2"/><path d="M 189 174 C 174.4 174 163.4 179.6 159 184 C 153 190 148 198.7 148 212 L 148 755 C 148 773.9 152.3 784.3 157 789 C 161.7 793.7 173.5 799 184 799 L 849 799 L 990.8 359.8 C 993.8 350.9 994.7 345.9 994.7 337.4 C 994.7 327.6 994.3 326.2 991.4 323.3 C 991.4 323.3 985.9 320 974.3 320 L 852 320 L 852 268 C 852 251.4 851.4 242.5 845 237 C 838.2 231.2 833.1 227 820 227 L 412.6 227 L 359.3 174 L 189 174 z M 240 213 L 350 213 L 403.3 266.7 L 760 267 C 800.8 267 813 280.2 813 320 C 813.3 320 306.7 319.8 306.7 319.8 C 297.7 319.8 292.7 326.4 289.7 334.6 L 187 648.7 L 187 266 C 187 223.1 202.4 213 240 213 z" fill="REPLACE_FILL1"/>`,
closedicon: `<path d="M 173,190 V 350 H 825 V 250 H 420 l -70,-60 z" fill="REPLACE_FILL2"/><path d="M 189.2 174 C 175.4 174.2 166.7 176.8 159.9 183.6 C 154 189.5 148.7 192.7 148 211.2 L 148 754.9 C 148 774.6 151.7 783.3 157.4 788.9 C 164.3 795.8 170.3 799 184.2 799 L 819.4 799 C 831 799 839.7 793.9 845.2 788.4 C 850.8 782.8 852.9 772.5 852.7 760.8 L 852.7 513.3 L 852.7 267.2 C 852.7 249.8 852 242.8 845.6 236.4 C 838.9 229.7 834.4 227 820.3 227 L 412.6 227 L 359.3 174 L 189.2 174 z M 240 213 L 350 213 L 403.3 266.7 C 531.4 266.7 760 267 760 267 C 801 267 812.4 282.5 813 320 L 187 320 L 187 266 C 187.8 227.3 198.4 215.7 240 213 z" fill="REPLACE_FILL1"/>`},
{openicon: `<path d="M 132,305 H 880 V 750 H 132 Z" fill="REPLACE_FILL2"/><path d="M 135,188 c -5.6,0 -13.9,2.9 -19.8,8.9 C 109.4,203 107,206.8 107,216 c 0,189.7 0,379.3 0,569 0,11.1 1.7,14.8 7,20.2 C 120.5,811.6 125.4,813 135,813 h 717 c 16.7,0 16.7,-1.6 18.6,-6.6 L 981.3,423.4 c 0,-5.8 -1,-6.2 -2.8,-8.1 -1.9,-1.9 -4.3,-2 -11.9,-2 l -691.9,2.1 c -16.4,0 -21.3,11.5 -23.4,17.2 l -80.9,263 -0.2,0 C 159.1,714.4 147,704.3 147,677.2 V 334 h 733 v -26 c 0,-7.7 -1.6,-14.7 -7.6,-19.8 C 866.3,283.1 860.4,280 852,280 H 440 l -20,-82 c -1.2,-2.5 -3.1,-6.8 -5.8,-7.7 0,0 -3,-2.3 -10.2,-2.3 z" fill="REPLACE_FILL1"/>`,
closedicon: `<path d="M 132,305 H 880 V 750 H 132 Z" fill="REPLACE_FILL2"/><path d="M 135,813 c -10.3,0 -14.5,-1.4 -21,-7.8 C 108.7,799.8 107,796.1 107,785 c 0,-189.7 0,-379.3 0,-569 0,-9.2 2.4,-13 8.2,-19.1 C 121.1,190.9 129.4,188 135,188 h 269 c 7.2,0 10.2,2.3 10.2,2.3 2.7,0.9 4.6,5.2 5.8,7.7 l 20,82 h 412 c 8.4,0 14.3,3.1 20.4,8.2 C 878.4,293.3 880,300.3 880,308 v 26 H 147 v 343.2 c 0,27.1 18.1,25.2 21.7,5.4 l 32.7,-277.7 c 0.7,-2.8 2.7,-7.5 5.8,-10.6 C 210.4,391.1 214.5,388 222.7,388 H 852 c 7.9,0 15.9,2.9 20.5,7.5 C 878.3,401.3 880,408.6 880,416 v 369 c 0,6.9 -1.8,14.7 -7.4,19.3 C 866.2,809.6 858.9,813 852,813 Z" fill="REPLACE_FILL1"/>`},
{openicon: `<path d="M 186.3,187 c -20,0 -35.7,7.4 -47.4,19.3 -11.7,11.9 -17.6,25 -17.6,45.7 v 80 l -0.3,416 c 0,10.9 4.6,32.6 16.7,45.1 C 149.8,805.6 168,813 186.3,813 365.7,749.3 880.3,734.5 880.3,734.5 c 0,0 0,-255.4 0,-402.5 0,-16.9 -4.7,-35 -17.2,-47.4 -12.5,-12.4 -30.1,-17.6 -47.8,-17.6 h -310 l -79,-80 z" fill="REPLACE_FILL1"/><path d="m 175.1,810.3 79.1,-393 c 8.3,-23.6 21.8,-42.9 53.1,-43 H 920.6 c 17.7,0 35.9,19.5 33.7,29.3 l -73.7,365.7 c -9,24.8 -11.1,41.3 -51.8,44 H 185.6 c -3.6,0 -6.4,-0.1 -11.1,-0.9 z" fill="REPLACE_FILL2"/>`,
closedicon: `<path d="M 121,252 c 0,-20.7 5.9,-33.8 17.6,-45.7 C 150.3,194.4 166,187 186,187 h 240 l 79,80 -384,113 z" fill="REPLACE_FILL1"/><path d="M 186,813 c -18.4,0 -36.5,-7.4 -48.6,-19.9 C 125.3,780.6 120.7,758.9 120.7,748 L 121,332 c 0,-16.9 7.2,-31.7 18.6,-43.5 C 151,276.7 170.1,267 186,267 h 629 c 17.6,0 35.2,5.3 47.8,17.6 C 875.3,297 880,315.1 880,332 v 416 c 0,14.8 -3.4,36.6 -17,47.9 C 849.5,807.2 830.9,813 815,813 Z" fill="REPLACE_FILL2"/>`},
{openicon: `<path d="M 160,253 h 614 c 14.8,0 29.7,8.6 36.9,15.8 C 819.4,277.3 826,289.4 826,305 v 95 H 160 Z" fill="REPLACE_FILL2"/><path d="M 199,200 c -26.2,0 -33.9,6.5 -41.5,15.6 C 149.8,224.8 147,231.8 147,252 V 386.7 387 c -20.9,0.5 -56.5,-3.5 -70.3,6.9 -2.5,1.9 -5.4,3.2 -8.3,9.8 -6.8,25.6 -0.3,54.8 1.1,70.3 9.1,59.2 69.1,294.7 74.9,310 3.7,9.8 4.6,13.6 10,15 h 689.6 c 6.3,-1.4 11.6,-15 11.6,-15 L 931.8,474 c 2.7,-20 8.3,-54 -0.2,-70.3 -2,-3.5 -6.5,-8.1 -9.3,-9.8 C 902.5,385.1 881.9,387 853,387 852.6,369.4 855,346.8 846.6,333 842.4,326.2 830.5,321.3 826,321.3 V 387 L 173.2,386.7 173,387 v -82 c 0,-14.6 2.8,-25.9 12.4,-35.5 C 195.9,259 207.7,253 225,253 h 201 l -54,-53 z" fill="REPLACE_FILL1"/>`,
closedicon: `<path d="M 160,400 V 253 h 440 v 147 z" fill="REPLACE_FILL2"/><path d="M 186,799 c -24.2,0 -34,-8 -39.7,-13.6 C 140.8,779.9 134,769.1 134,747 V 372 c 0,-21.5 13,-32 13,-32 V 252 c 0,-20.2 2.8,-27.2 10.5,-36.4 C 165.1,206.5 172.8,200 199,200 h 173 l 54,53 H 225 c -17.3,0 -29.1,6 -39.6,16.5 C 175.8,279.1 173,290.4 173,305 l -0.4,19 c 0,0 9.6,-4 20.9,-4 H 494 L 614,200 h 186 c 17.7,0 26.6,7.1 36,14.2 C 846.5,222 852,233.6 852,252 v 495 c 0,16.1 -7.5,30.2 -14.1,36.7 C 831.4,790.2 815.9,799 800,799 Z" fill="REPLACE_FILL1"/>`}
];
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.LibraryModules.SortedGuildUtils.getGuildFolderById(folderId)).filter(folder => folder && folder.guildIds);
this.props.folders = folders.length || closing ? folders : (this.props.folders || []);
BDFDB.TimeUtils.clear(this._rerenderTimeout);
if (!GuildItemWrapperComponent && folders.length || !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: GuildItemWrapperComponent && 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,
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(GuildItemWrapperComponent, {
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(), {agentOptions: {rejectUnauthorized: false}, headers: {"Content-Type": "application/json"}}, (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," + Buffer.from(body).toString("base64"), 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",
"GuildItemWrapper",
"GuildsBar",
"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, <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"><g fill="none" stroke="rgb(240,71,71)" stroke-width="2.63295174" stroke-linecap="round"><path d="M 2.3297741,2.3297744 17.669885,17.670227"/><path d="M 17.66721,2.3327927 2.3327902,17.667207"/></g></svg>');
}
${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.2s cubic-bezier(.44,1.04,1,1.01) !important;
}
${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.LibraryModules.SortedGuildUtils.guildFolders.filter(n => n.folderId);
let folder = BDFDB.GuildUtils.getFolder(e.instance.props.guild.id);
let unfolderedGuilds = BDFDB.LibraryModules.SortedGuildUtils.getSortedGuilds().filter(n => !n.folderId).map(n => n.guilds[0]).filter(n => n);
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.LibraryModules.SortedGuildUtils.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.LibraryModules.SortedGuildUtils.guildFolders.filter(n => n.folderId).map(n => n.guildIds).flat(10);
args[2] = args[2].filter(id => !ids.includes(id));
return topIsVisible(...args) || 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.LibraryModules.SortedGuildUtils.guildFolders.filter(n => n.folderId).map(n => n.guildIds).flat(10);
args[2] = args[2].filter(id => !ids.includes(id));
return bottomIsVisible(...args) || 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 && 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.folderColor || 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!");
}
processGuildItemWrapper (e) {
if (e.component) GuildItemWrapperComponent = e.component;
}
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
});
}
}
}
processFolderSettingsModal (e) {
if (e.node) {
let root = e.node.parentElement.querySelector(BDFDB.dotCN.modal);
BDFDB.DOMUtils.addClass(root, BDFDB.disCN.modalmedium, BDFDB.disCN.modalwrapper, `${this.name}-modal`);
BDFDB.DOMUtils.removeClass(root, BDFDB.disCN.modalsmall);
}
if (e.returnvalue) {
let folder = BDFDB.LibraryModules.SortedGuildUtils.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.LibraryModules.SortedGuildUtils.guildFolders.every(n => !n.folderId || n.folderId != id) ? id : this.generateId(prefix);
}
else {
let data = BDFDB.DataUtils.load(this, prefix + "s");
let id = prefix + "_" + Math.round(Math.random()*10000000000000000);
return data[id] ? this.generateId(prefix) : id;
}
}
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.LibraryModules.SortedGuildUtils.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("<path ") != 0) return paths;
let isGradient1 = color1 && BDFDB.ObjectUtils.is(color1);
let isGradient2 = color2 && BDFDB.ObjectUtils.is(color2);
let svg = `<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="1000" viewBox="-60 -50 1100 1100">`;
if (isGradient1) {
color1 = BDFDB.ColorUtils.convert(color1, "RGBA");
svg += `<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">`;
for (let pos of Object.keys(color1).sort()) svg += `<stop offset="${pos * 100}%" style="stop-color: ${color1[pos]};"></stop>`;
svg += `</linearGradient>`;
}
if (isGradient2) {
color2 = BDFDB.ColorUtils.convert(color2, "RGBA");
svg += `<linearGradient id="grad2" x1="0%" y1="0%" x2="100%" y2="0%">`;
for (let pos of Object.keys(color2).sort()) svg += `<stop offset="${pos * 100}%" style="stop-color: ${color2[pos]};"></stop>`;
svg += `</linearGradient>`;
}
svg += `${paths.replace("REPLACE_FILL1", isGradient1 ? "url(#grad1)" : BDFDB.ColorUtils.convert(color1, "RGBA")).replace("REPLACE_FILL2", isGradient2 ? "url(#grad2)" : BDFDB.ColorUtils.convert(color2, "RGBA"))}</svg>`;
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.GuildIconComponents.Icon, {
className: BDFDB.disCN.listavatar,
guild: guild,
size: BDFDB.LibraryComponents.GuildIconComponents.Icon.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.LibraryModules.SortedGuildUtils.guildFolders), 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.LibraryModules.SortedGuildUtils.guildFolders), 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.LibraryModules.SortedGuildUtils.guildFolders), 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.LibraryModules.SortedGuildUtils.guildFolders), 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.LibraryModules.SortedGuildUtils.guildFolders), 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));
})();