`;
this.folderIcons = [
{openicon:``,
closedicon:``},
{openicon:``,
closedicon:``},
{openicon:``,
closedicon:``},
{openicon:``,
closedicon:``},
{openicon:``,
closedicon:``},
{openicon:``,
closedicon:``},
{openicon:``,
closedicon:``}
];
this.defaults = {
settings: {
closeOtherFolders: {value:false, description:"Close other Folders when opening a Folder."},
closeTheFolder: {value:false, description:"Close the Folder when selecting a Server."},
closeAllFolders: {value:false, description:"Close All Folders when selecting a Server."},
forceOpenFolder: {value:false, description:"Force a Folder to open when switching to a Server of that Folder."},
showCountBadge: {value:true, description:"Display Badge for Amount of Servers in a Folder."},
addSeparators: {value:true, description:"Adds separators between Servers of different Folders."}
}
};
}
getSettingsPanel () {
if (!global.BDFDB || typeof BDFDB != "object" || !BDFDB.loaded || !this.started) return;
let settings = BDFDB.DataUtils.get(this, "settings");
let settingshtml = `
${this.name}
`;
for (let key in settings) {
settingshtml += `
${this.defaults.settings[key].description}
`;
}
settingshtml += `
Remove all custom Icons.
`;
settingshtml += `
`;
let settingspanel = BDFDB.DOMUtils.create(settingshtml);
BDFDB.initElements(settingspanel, this);
BDFDB.ListenerUtils.add(this, settingspanel, "click", ".removecustom-button", () => {
BDFDB.ModalUtils.confirm(this, "Are you sure you want to remove all custom icons?", () => {
BDFDB.DataUtils.remove(this, "customicons");
});
});
return settingspanel;
}
//legacy
load () {}
start () {
if (!global.BDFDB) global.BDFDB = {myPlugins:{}};
if (global.BDFDB && global.BDFDB.myPlugins && typeof global.BDFDB.myPlugins == "object") global.BDFDB.myPlugins[this.getName()] = this;
var libraryScript = document.querySelector('head script#BDFDBLibraryScript');
if (!libraryScript || (performance.now() - libraryScript.getAttribute("date")) > 600000) {
if (libraryScript) libraryScript.remove();
libraryScript = document.createElement("script");
libraryScript.setAttribute("id", "BDFDBLibraryScript");
libraryScript.setAttribute("type", "text/javascript");
libraryScript.setAttribute("src", "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.min.js");
libraryScript.setAttribute("date", performance.now());
libraryScript.addEventListener("load", () => {this.initialize();});
document.head.appendChild(libraryScript);
}
else if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) this.initialize();
this.startTimeout = setTimeout(() => {
try {return this.initialize();}
catch (err) {console.error(`%c[${this.getName()}]%c`, "color: #3a71c1; font-weight: 700;", "", "Fatal Error: Could not initiate plugin! " + err);}
}, 30000);
}
initialize () {
if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) {
if (this.started) return;
BDFDB.PluginUtils.init(this);
// REMOVE 08.10.2019
let foldersdata = BDFDB.ObjectUtils.sort(BDFDB.DataUtils.load(this, "folders"), "position");
let newfolders = Object.keys(foldersdata).filter(n => n.indexOf("folder") == -1);
let cleaned = false;
if (newfolders.length) for (let id of newfolders) if (foldersdata[id].icons) {
cleaned = true;
delete foldersdata[id].icons;
}
if (cleaned) {
BDFDB.DataUtils.save(foldersdata, this, "folders");
foldersdata = BDFDB.ObjectUtils.sort(BDFDB.DataUtils.load(this, "folders"), "position");
}
let oldfolders = Object.keys(foldersdata).filter(n => n.indexOf("folder") == 0);
if (oldfolders.length) BDFDB.ModalUtils.confirm(this, `Old ServerFolders data detected!\nFound ${oldfolders.length} old custom folders in the ServerFolders.config.json.\nPress the '${BDFDB.LanguageUtils.LanguageStrings.OKAY}' button to automatically create a native folder for each old folder and to automatically put the servers in them.`, "Convert?", () => {
let oldGuildFolders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders);
let guildsInFolders = [];
let guildFolders = [];
let guildPositions = [];
let newfoldersdata = {};
for (let folderid in foldersdata) {
let newid = this.generateID("folder");
let olddata = foldersdata[folderid];
let color1 = BDFDB.ColorUtils.convert(olddata.color1, "INT");
guildFolders.push({
guildIds: olddata.servers,
folderId: newid,
folderName: olddata.folderName,
folderColor: color1 != null && color1 != undefined ? color1 : 7506394
});
guildsInFolders = guildsInFolders.concat(olddata.servers);
newfoldersdata[newid] = Object.assign({}, olddata);
delete newfoldersdata[newid].position;
delete newfoldersdata[newid].folderName;
delete newfoldersdata[newid].folderId;
delete newfoldersdata[newid].servers;
delete newfoldersdata[newid].isOpen;
newfoldersdata[newid].autoRead = newfoldersdata[newid].autounread;
delete newfoldersdata[newid].autounread;
newfoldersdata[newid].useCloseIcon = true;
newfoldersdata[newid].muteFolder = false;
}
for (let i in oldGuildFolders) if (oldGuildFolders[i].folderId || !guildsInFolders.includes(oldGuildFolders[i].guildIds[0])) guildFolders.push(Object.assign({}, oldGuildFolders[i]));
for (let i in guildFolders) for (let guildid of guildFolders[i].guildIds) guildPositions.push(guildid);
BDFDB.LibraryModules.SettingsUtils.updateRemoteSettings({guildPositions, guildFolders});
BDFDB.DataUtils.save(newfoldersdata, this, "folders");
});
BDFDB.ModuleUtils.forceAllUpdates(this);
}
else console.error(`%c[${this.getName()}]%c`, "color: #3a71c1; font-weight: 700;", "", "Fatal Error: Could not load BD functions!");
}
stop () {
if (global.BDFDB && typeof BDFDB === "object" && BDFDB.loaded) {
this.stopping = true;
BDFDB.DOMUtils.remove(this.foldercontent, BDFDB.dotCN.guildswrapper + ".foldercontent");
let modal = document.querySelector(`.${this.name}-modal`);
if (modal) {
BDFDB.DOMUtils.removeClass(modal, `${this.name}-modal`);
let modalclose = modal.querySelector(BDFDB.dotCN.modalclose);
if (modalclose) modalclose.click();
}
for (let folderinner of document.querySelectorAll(`${BDFDB.dotCNS.guildfolderwrapper + BDFDB.dotCN.guildfolderexpandendbackground} ~ ${BDFDB.dotCNS.guildouter + BDFDB.dotCN.guildinner}`)) {
folderinner.removeEventListener("mouseenter", folderinner.ServerFoldersTooltipListener);
folderinner.removeEventListener("mousedown", folderinner.ServerFoldersClickListener);
BDFDB.DOMUtils.remove(folderinner.querySelectorAll(`${BDFDB.dotCN.guildupperbadge}.count`));
}
for (let foldericon of document.querySelectorAll(BDFDB.dotCN.guildfolder)) {
foldericon.style.removeProperty("background-image");
foldericon.parentElement.parentElement.style.removeProperty("-webkit-mask");
}
BDFDB.PluginUtils.clear(this);
}
}
onSwitch () {
if (typeof BDFDB === "object" && BDFDB.DataUtils.get(this, "settings", "forceOpenFolder")) {
let folder = this.getFolderOfGuildId(BDFDB.LibraryModules.LastGuildStore.getGuildId());
if (folder && !BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folder.folderId)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folder.folderId);
}
}
// begin of own functions
onGuildContextMenu (instance, menu, returnvalue) {
if (document.querySelector(".BDFDB-modal")) return;
if (instance.props.target && instance.props.folderId && instance.props.type == "GUILD_ICON_FOLDER") {
let folderid = instance.props.folderId;
let folder = BDFDB.LibraryModules.FolderStore.getGuildFolderById(folderid);
let data = this.getFolderConfig(folderid);
let muted = data.muteFolder && folder.guildIds.every(guildid => BDFDB.LibraryModules.MutedUtils.isGuildOrCategoryOrChannelMuted(guildid));
if (data.muteFolder != muted) {
data.muteFolder = muted;
BDFDB.DataUtils.save(data, this, "folders", folderid);
}
let [children, index] = BDFDB.ReactUtils.findChildren(returnvalue, {name:"GuildFolderMarkReadItem"});
const autoreaditem = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuToggleItem, {
label: this.labels.foldercontext_autoreadfolder_text,
active: data.autoRead,
action: state => {
data.autoRead = state;
BDFDB.DataUtils.save(data, this, "folders", folderid);
}
});
if (index > -1) children.splice(index + 1, 0, autoreaditem);
else children.push(autoreaditem);
const muteGroup = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItemGroup, {
children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuToggleItem, {
label: this.labels.foldercontext_mutefolder_text,
active: muted,
action: state => {
data.muteFolder = state;
BDFDB.DataUtils.save(data, this, "folders", folderid);
for (let guildid of folder.guildIds) if (BDFDB.LibraryModules.MutedUtils.isGuildOrCategoryOrChannelMuted(guildid) != state) BDFDB.LibraryModules.GuildSettingsUtils.updateNotificationSettings(guildid, {muted:state, suppress_everyone:state});
}
})
});
returnvalue.props.children.splice(returnvalue.props.children.length - 1, 0, muteGroup);
const deleteGroup = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItemGroup, {
children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItem, {
label: this.labels.foldercontext_removefolder_text,
danger: true,
action: e => {
BDFDB.ContextMenuUtils.close(BDFDB.DOMUtils.getParent(BDFDB.dotCN.contextmenu, e.target));
BDFDB.ModalUtils.confirm(this, `Are you sure you want to remove the folder${folder.folderName ? (" '" + folder.folderName + '"') : ""}?`, () => {this.removeFolder(folderid);});
}
})
});
returnvalue.props.children.push(deleteGroup);
}
else if (instance.props.target && instance.props.guild && instance.props.type == "GUILD_ICON_BAR") {
let guildid = instance.props.guild.id;
let folders = this.getFolders();
let folder = this.getFolderOfGuildId(guildid);
let addtofolderitems = [], openguilds = BDFDB.LibraryModules.FolderStore.getSortedGuilds().filter(n => !n.folderId).map(n => n.guilds[0]);
for (let i = 0; i < folders.length; i++) addtofolderitems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItem, {
label: folders[i].folderName || (this.labels.modal_tabheader1_text + " #" + parseInt(i+1)),
action: e => {
BDFDB.ContextMenuUtils.close(menu);
this.addGuildToFolder(folders[i].folderId, guildid);
}
}));
let [children, index] = BDFDB.ReactUtils.findChildren(returnvalue, {name:["FluxContainer(MessageDeveloperModeGroup)", "DeveloperModeGroup"]});
const addType = !addtofolderitems.length ? "contextMenuItem" : "contextMenuSubItem";
const itemgroup = BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItemGroup, {
children: [
BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuSubItem, {
label: this.labels.servercontext_serverfolders_text,
render: folder ? [
BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItem, {
label: this.labels.serversubmenu_removefromfolder_text,
danger: true,
action: e => {
BDFDB.ContextMenuUtils.close(menu);
this.removeGuildFromFolder(folder.folderId, guildid);
}
})
] : [
BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ContextMenuItem, {
label: this.labels.serversubmenu_createfolder_text,
disabled: !openguilds.length,
action: e => {
BDFDB.ContextMenuUtils.close(menu);
this.openFolderCreationMenu(openguilds, guildid);
}
}),
BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents[addType.charAt(0).toUpperCase() + addType.slice(1)], {
label: this.labels.serversubmenu_addtofolder_text,
className: `BDFDB-${addType} ${this.name}-${addType} ${this.name}-addtofolder-${addType}`,
disabled: !addtofolderitems.length,
render: addtofolderitems
})
]
})
]
});
if (index > -1) children.splice(index, 0, itemgroup);
else children.push(itemgroup);
}
}
processGuilds (instance, wrapper, returnvalue, methodnames) {
if (methodnames.includes("componentWillUnmount")) {
BDFDB.DOMUtils.remove(this.foldercontent, BDFDB.dotCN.guildswrapper + ".foldercontent");
delete this.foldercontent;
delete this.foldercontentguilds;
}
if (methodnames.includes("componentDidMount")) {
let process = () => {
if (!wrapper.parentElement.querySelector(BDFDB.dotCN.guildswrapper + ".foldercontent")) {
this.foldercontent = BDFDB.DOMUtils.create(this.folderContentMarkup);
this.updateFolderContentColor(wrapper);
wrapper.parentElement.insertBefore(this.foldercontent, wrapper.nextElementSibling);
this.foldercontentguilds = this.foldercontent.querySelector(BDFDB.dotCN.guildsscroller);
this.toggleFolderContent();
}
};
if (document.querySelector(BDFDB.dotCNS.guildswrapper + BDFDB.dotCN.guildouter + ":not(.copy) " + BDFDB.dotCN.guildiconwrapper)) process();
else BDFDB.TimeUtils.timeout(process, 5000);
}
}
processGuildFolder (instance, wrapper, returnvalue, methodnames) {
if (!this.foldercontentguilds) return;
let state = this.getState(instance);
let data = this.getFolderConfig(state.folderId);
if (methodnames.includes("componentDidMount")) {
if (data.muteFolder) for (let guildid of instance.props.guildIds) if (!BDFDB.LibraryModules.MutedUtils.isGuildOrCategoryOrChannelMuted(guildid)) BDFDB.LibraryModules.GuildSettingsUtils.updateNotificationSettings(guildid, {muted:true, suppress_everyone:true});
}
if (!BDFDB.equals(state, this.folderStates[instance.props.folderId])) {
if (data.autoRead && (state.unread || state.badge > 0)) {
BDFDB.TimeUtils.clear(this.folderReads[state.folderId]);
this.folderReads[state.folderId] = BDFDB.TimeUtils.timeout(() => {
BDFDB.GuildUtils.markAsRead(instance.props.guildIds);
}, 10000);
}
if (state.expanded) BDFDB.TimeUtils.timeout(() => {
for (let guildid of instance.props.guildIds) this.updateGuildInFolderContent(state.folderId, guildid);
if (this.clickedFolder == state.folderId && BDFDB.DataUtils.get(this, "settings", "closeOtherFolders")) for (let openFolderId of BDFDB.LibraryModules.FolderUtils.getExpandedFolders()) if (openFolderId != state.folderId) {
BDFDB.DOMUtils.remove(this.foldercontent.querySelectorAll(`${BDFDB.dotCN.guildouter}[folderid="${openFolderId}"]`));
BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId);
}
this.addSeparator(state.folderId);
this.toggleFolderContent();
});
else BDFDB.TimeUtils.timeout(() => {
BDFDB.DOMUtils.remove(this.foldercontent.querySelectorAll(`${BDFDB.dotCN.guildouter}[folderid="${state.folderId}"]`));
if (BDFDB.DOMUtils.containsClass(this.foldercontentguilds.firstElementChild, "folderseparatorouter")) BDFDB.DOMUtils.remove(this.foldercontentguilds.firstElementChild);
this.toggleFolderContent();
}, BDFDB.LibraryModules.FolderUtils.getExpandedFolders().size > 0 ? 0 : 300);
this.changeFolder(state.folderId, wrapper);
}
this.folderStates[state.folderId] = state;
}
processGuild (instance, wrapper, returnvalue, methodnames) {
if (!this.foldercontentguilds) return;
if (instance.props.guild) {
if (methodnames.includes("componentDidMount")) {
BDFDB.ListenerUtils.add(this, wrapper, "click", () => {BDFDB.TimeUtils.timeout(() => {
let folder = this.getFolderOfGuildId(instance.props.guild.id);
let folderid = folder ? folder.folderId : null;
let settings = BDFDB.DataUtils.get(this, "settings");
if (settings.closeAllFolders) for (let openFolderId of BDFDB.LibraryModules.FolderUtils.getExpandedFolders()) if (!folderid || openFolderId != folderid || !settings.forceOpenFolder) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId);
else if (folderid && settings.closeTheFolder && !settings.forceOpenFolder && BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folderid)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folderid);
if (settings.closeAllFolders) for (let openFolderId of BDFDB.LibraryModules.FolderUtils.getExpandedFolders()) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId);
else if (settings.closeTheFolder) {
let folder = this.getFolderOfGuildId(instance.props.guild.id);
if (folder && BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folder.folderId)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folder.folderId);
}
})});
}
if (methodnames.includes("componentDidUpdate")) {
let folder = this.getFolderOfGuildId(instance.props.guild.id);
if (folder) {
let state = this.getState(instance);
if (!BDFDB.equals(state, this.guildStates[instance.props.guild.id])) this.updateGuildInFolderContent(folder.folderId, instance.props.guild.id);
}
}
}
}
processGuildFolderSettingsModal (instance, wrapper, returnvalue) {
if (instance.props.folderId) {
let folderid = instance.props.folderId;
let data = this.getFolderConfig(folderid);
wrapper = wrapper.parentElement;
let root = wrapper.querySelector(BDFDB.dotCN.layermodal);
let header = wrapper.querySelector(BDFDB.dotCN.modalheader);
let form = wrapper.querySelector(BDFDB.dotCN.modalsubinner + " form");
BDFDB.DOMUtils.addClass(root, "BDFDB-modal", `${this.name}-modal`, BDFDB.disCN.layermodalmedium);
BDFDB.DOMUtils.removeClass(root, BDFDB.disCN.layermodalsmall);
if (header) {
BDFDB.TimeUtils.clear(this.settingsModalWait);
header.parentElement.insertBefore(BDFDB.DOMUtils.create(`
${this.labels.modal_tabheader1_text}
${this.labels.modal_tabheader2_text}
${this.labels.modal_tabheader3_text}
${this.labels.modal_tabheader4_text}
`), header.nextElementSibling);
}
if (root && form) {
form.setAttribute("tab", "folder");
BDFDB.DOMUtils.addClass(form, "tab-content", BDFDB.disCN.marginbottom8);
for (let child of form.childNodes) if (form.firstElementChild != child) BDFDB.DOMUtils.hide(child);
form.appendChild(BDFDB.DOMUtils.create(`
`));
setIcon(wrapper.querySelector(`.ui-icon-picker-icon[value="${folderIcons[selection] ? selection : -1}"]`), false, true);
BDFDB.ListenerUtils.addToChildren(wrapper, "click", ".ui-icon-picker-icon", e => {
if (BDFDB.DOMUtils.containsClass(e.target, BDFDB.disCN.hovercardbutton)) return;
setIcon(wrapper.querySelector(".ui-icon-picker-icon.selected"), false, false);
setIcon(e.currentTarget, true, true);
});
BDFDB.ListenerUtils.addToChildren(wrapper, "click", BDFDB.dotCN.hovercardbutton, e => {
if (BDFDB.DOMUtils.containsClass(e.currentTarget.parentElement, "selected")) return;
BDFDB.DataUtils.remove(this, "customicons", e.currentTarget.getAttribute("value"));
e.currentTarget.parentElement.remove();
BDFDB.NotificationUtils.toast(`Custom Icon was deleted.`, {type:"success"});
});
BDFDB.ListenerUtils.addToChildren(wrapper, "mouseenter", ".ui-icon-picker-icon", e => {
setIcon(e.currentTarget, true);
if (e.currentTarget.getAttribute("value") == -1) BDFDB.TooltipUtils.create(e.currentTarget, BDFDB.LanguageUtils.LanguageStrings.DEFAULT, {type:"top"});
});
BDFDB.ListenerUtils.addToChildren(wrapper, "mouseleave", ".ui-icon-picker-icon", e => {
setIcon(e.currentTarget, false);
});
function setIcon (icon, hover, enable) {
if (!icon) return;
let id = icon.getAttribute("value");
if (enable != undefined) BDFDB.DOMUtils.toggleClass(icon, "selected", enable);
if (hover) {
if (folderIcons[id]) icon.querySelector(".ui-picker-inner").style.setProperty("background-image", `url(${folderIcons[id].openicon})`);
if (BDFDB.DOMUtils.containsClass(icon, "selected")) icon.style.setProperty("background-color", "rgb(255,255,255,0.2)");
else icon.style.setProperty("background-color", "rgb(255,255,255,0.1)");
}
else {
if (folderIcons[id]) icon.querySelector(".ui-picker-inner").style.setProperty("background-image", `url(${folderIcons[id].closedicon})`);
if (BDFDB.DOMUtils.containsClass(icon, "selected")) icon.style.setProperty("background-color", "rgb(255,255,255,0.2)");
else icon.style.removeProperty("background-color");
}
}
}
getState (instance) {
let state = {};
for (let key in instance.props) {
if (typeof instance.props[key] != "object" && typeof instance.props[key] != "function") state[key] = instance.props[key];
else if (Array.isArray(instance.props[key])) state[key] = instance.props[key].length;
}
return state;
}
getFolders () {
let found = [], folders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders);
for (let pos in folders) if (folders[pos].folderId) found.push(Object.assign({}, folders[pos]));
return found;
}
getFolderOfGuildId (guildid) {
if (!guildid) return null;
for (let folder of BDFDB.LibraryModules.FolderStore.guildFolders) if (folder.folderId && folder.guildIds.includes(guildid)) return folder;
}
getFolderConfig (folderid) {
let folder = BDFDB.LibraryModules.FolderStore.getGuildFolderById(folderid) || {};
let data = BDFDB.DataUtils.load(this, "folders", folderid) || {
iconID: "-1",
muteFolder: false,
autoRead: false,
copyTooltipColor: false,
useCloseIcon: true,
color1: null,
color2: ["255","255","255"],
color3: null,
color4: null
};
if (!data.color1) data.color1 = BDFDB.ColorUtils.convert(folder.folderColor, "RGBCOMP") || ["0","0","0"];
else if (folder.folderColor && !BDFDB.ColorUtils.compare(folder.folderColor, BDFDB.ColorUtils.convert(BDFDB.ObjectUtils.is(data.color1) ? data.color1[Object.keys(data.color1)[0]] : data.color1, "INT"))) {
data.color1 = BDFDB.ColorUtils.convert(folder.folderColor, "RGBCOMP");
BDFDB.DataUtils.save(data, this, "folders", folderid);
}
return data;
}
toggleFolderContent (forceOpenClose) {
if (!this.foldercontentguilds) return;
forceOpenClose = forceOpenClose === undefined ? BDFDB.LibraryModules.FolderUtils.getExpandedFolders().size > 0 : forceOpenClose;
BDFDB.DOMUtils.toggleClass(this.foldercontent, "foldercontentopen", forceOpenClose);
BDFDB.DOMUtils.toggleClass(this.foldercontent, "foldercontentclosed", !forceOpenClose);
BDFDB.DOMUtils.toggleClass(document.body, "foldercontentopened", forceOpenClose);
}
changeFolder (folderid, wrapper) {
wrapper = wrapper || BDFDB.FolderUtils.getDiv(folderid);
if (wrapper) {
let folderinner = wrapper.querySelector(`${BDFDB.dotCN.guildfolderexpandendbackground} ~ ${BDFDB.dotCNS.guildouter + BDFDB.dotCN.guildinner}`);
let foldericon = wrapper.querySelector(BDFDB.dotCN.guildfolder);
if (folderinner && foldericon) {
let folder = BDFDB.LibraryModules.FolderStore.getGuildFolderById(folderid);
let data = this.getFolderConfig(folderid);
BDFDB.DOMUtils.remove(folderinner.querySelectorAll(`${BDFDB.dotCN.guildupperbadge}.count`));
foldericon.parentElement.parentElement.style.removeProperty("-webkit-mask");
if (BDFDB.DataUtils.get(this, "settings", "showCountBadge")) {
folderinner.appendChild(BDFDB.DOMUtils.create(`
${folder.guildIds.length}
`));
let width = folder.guildIds.length > 99 ? 36 : (folder.guildIds.length > 9 ? 30 : 24);
foldericon.parentElement.parentElement.style.setProperty("-webkit-mask", `url(data:image/svg+xml;base64,${btoa(``)}) center/cover no-repeat`);
}
let icontype = BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folderid) ? "openicon" : "closedicon";
let folderIcons = this.loadAllIcons();
let icon = folderIcons[data.iconID] ? (!folderIcons[data.iconID].customID ? this.createBase64SVG(folderIcons[data.iconID][icontype], data.color1, data.color2) : folderIcons[data.iconID][icontype]) : null;
if (icon) foldericon.style.setProperty("background-image", `url(${icon})`, "important");
else foldericon.style.removeProperty("background-image");
folderinner.removeEventListener("mouseenter", folderinner.ServerFoldersTooltipListener);
folderinner.removeEventListener("mousedown", folderinner.ServerFoldersClickListener);
if (data.color3 || data.color4) {
var isgradient3 = data.color3 && BDFDB.ObjectUtils.is(data.color3);
var isgradient4 = data.color4 && BDFDB.ObjectUtils.is(data.color4);
var bgColor = data.color3 ? (!isgradient3 ? BDFDB.ColorUtils.convert(data.color3, "RGBA") : BDFDB.ColorUtils.createGradient(data.color3)) : "";
var fontColor = data.color4 ? (!isgradient4 ? BDFDB.ColorUtils.convert(data.color4, "RGBA") : BDFDB.ColorUtils.createGradient(data.color4)) : "";
var folderName = folder.folderName || BDFDB.ReactUtils.getValue(wrapper, "return.stateNode.props.defaultFolderName");
folderinner.ServerFoldersTooltipListener = () => {
BDFDB.TooltipUtils.create(folderinner, isgradient4 ? `${BDFDB.StringUtils.htmlEscape(folderName)}` : folderName, {type:"right", selector:"ServerFolders-tooltip", style:`${isgradient4 ? '' : `color: ${fontColor} !important; `}background: ${bgColor} !important; border-color: ${isgradient3 ? BDFDB.ColorUtils.convert(data.color3[0], "RGBA") : bgColor} !important;`, html:isgradient3, hide:true});
};
folderinner.addEventListener("mouseenter", folderinner.ServerFoldersTooltipListener);
}
folderinner.ServerFoldersClickListener = () => {
BDFDB.TimeUtils.clear(this.clickedFolderTimeout);
this.clickedFolder = folderid;
this.clickedFolderTimeout = BDFDB.TimeUtils.timeout(() => {
delete this.clickedFolderTimeout;
}, 3000);
};
folderinner.addEventListener("mousedown", folderinner.ServerFoldersClickListener);
}
}
}
updateGuildInFolderContent (folderid, guildid) {
if (!this.foldercontentguilds || !folderid || !guildid) return;
let guild = BDFDB.LibraryModules.GuildStore.getGuild(guildid);
let oldCopy = this.foldercontentguilds.querySelector(`.copy[guildid="${guildid}"]`);
if (guild) {
let newCopy = this.createCopyOfServer(folderid, guildid);
if (newCopy) {
if (oldCopy) this.foldercontentguilds.insertBefore(newCopy, oldCopy);
else {
let folder = BDFDB.LibraryModules.FolderStore.getGuildFolderById(folderid);
let position = folder.guildIds.indexOf(guildid);
let siblingId = position > -1 ? folder.guildIds[folder.guildIds.indexOf(guildid) + 1] : null;
let insertNode = siblingId ? this.foldercontentguilds.querySelector(`[guildid="${siblingId}"][folderid="${folderid}"]`) : null;
if (!insertNode) {
let sameFolderEles = this.foldercontentguilds.querySelectorAll(`[folderid="${folderid}"]`);
insertNode = sameFolderEles.length > 0 ? sameFolderEles[sameFolderEles.length - 1].nextSibling : null;
}
this.foldercontentguilds.insertBefore(newCopy, insertNode);
}
if (BDFDB.DOMUtils.containsClass(this.foldercontentguilds.firstElementChild, "folderseparatorouter")) BDFDB.DOMUtils.remove(this.foldercontentguilds.firstElementChild);
}
}
BDFDB.DOMUtils.remove(oldCopy);
}
addSeparator (folderid) {
if (!this.foldercontentguilds) return;
if (!this.foldercontent.querySelector(`.folderseparatorouter[folderid="${folderid}"]`) && BDFDB.DataUtils.get(this, "settings", "addSeparators")) this.foldercontentguilds.insertBefore(BDFDB.DOMUtils.create(`
`), this.foldercontentguilds.querySelectorAll(`[folderid="${folderid}"]`)[0]);
if (BDFDB.DOMUtils.containsClass(this.foldercontentguilds.firstElementChild, "folderseparatorouter")) BDFDB.DOMUtils.remove(this.foldercontentguilds.firstElementChild);
}
createBase64SVG (paths, color1 = "#000000", color2 = "#FFFFFF") {
if (paths.indexOf("`;
if (isgradient1) {
svg += ``;
for (let pos of Object.keys(color1).sort()) svg += ``;
svg += ``;
}
if (isgradient2) {
svg += ``;
for (let pos of Object.keys(color2).sort()) svg += ``;
svg += ``;
}
svg += `${paths.replace("REPLACE_FILL1", isgradient1 ? "url(#grad1)" : BDFDB.ColorUtils.convert(color1, "RGBA")).replace("REPLACE_FILL2", isgradient2 ? "url(#grad2)" : BDFDB.ColorUtils.convert(color2, "RGBA"))}`;
return `data:image/svg+xml;base64,${btoa(svg)}`;
}
createCopyOfServer (folderid, guildid) {
if (!folderid || !guildid) return;
let guild = BDFDB.LibraryModules.GuildStore.getGuild(guildid);
let guilddiv = BDFDB.GuildUtils.getDiv(guildid);
let props = BDFDB.ReactUtils.getValue(guilddiv, "return.stateNode.props");
if (!guild || !guilddiv || !props) return;
let guildcopy = guilddiv.cloneNode(true);
let guildcopyinner = guildcopy.querySelector(BDFDB.dotCN.guildcontainer);
let guildiconwrapper = guildcopy.querySelector(BDFDB.dotCN.guildiconwrapper);
let guildicon = guildcopy.querySelector(BDFDB.dotCN.guildicon);
let guildpillitem = guildcopy.querySelector(BDFDB.dotCN.guildpillitem);
if (!guildpillitem) {
guildpillitem = BDFDB.DOMUtils.create(`
`);
guildcopy.insertBefore(guildpillitem, guildcopy.firstElementChild);
guildpillitem = guildpillitem.firstElementChild;
}
guildcopy.setAttribute("guildid", guildid);
guildcopy.setAttribute("folderid", folderid);
guildiconwrapper.style.setProperty("border-radius", props.selected ? "30%" : "50%");
guildiconwrapper.style.setProperty("overflow", "hidden");
guildpillitem.style.setProperty("opacity", props.selected ? 1 : (props.unread ? 0.7 : 0));
guildpillitem.style.setProperty("height", props.selected ? "40px" : "8px");
guildpillitem.style.setProperty("transform", "translate3d(0px, 0px, 0px)");
guildcopy.querySelector("mask").setAttribute("id", "SERVERFOLDERSCOPY" + guildid);
guildcopy.querySelector("mask path").setAttribute("d", "M0 0 l50 0l0 50l-50 0l0 -50Z");
guildcopy.querySelector("foreignObject").setAttribute("mask", "url(#SERVERFOLDERSCOPY" + guildid + ")");
BDFDB.DOMUtils.addClass(guildcopy, "copy");
BDFDB.DOMUtils.show(guildcopy);
let pillvisible = guildpillitem && guildpillitem.style.getPropertyValue("opacity") != 0;
let borderRadius = new BDFDB.LibraryModules.AnimationUtils.Value(0);
borderRadius
.interpolate({
inputRange: [0, 1],
outputRange: [50, 30]
})
.addListener((value) => {
guildiconwrapper.style.setProperty("border-radius", `${value.value}%`);
});
let pillHeight = new BDFDB.LibraryModules.AnimationUtils.Value(0);
pillHeight
.interpolate({
inputRange: [0, 1],
outputRange: [8, 20]
})
.addListener((value) => {
if (guildpillitem) guildpillitem.style.setProperty("height", `${value.value}px`);
});
let pillOpacity = new BDFDB.LibraryModules.AnimationUtils.Value(0);
pillOpacity
.interpolate({
inputRange: [0, 1],
outputRange: [0, 0.7]
})
.addListener((value) => {
if (guildpillitem) guildpillitem.style.setProperty("opacity", `${value.value}`);
});
let animate = (v) => {
BDFDB.LibraryModules.AnimationUtils.parallel([
BDFDB.LibraryModules.AnimationUtils.timing(borderRadius, {toValue: v, duration: 200}),
BDFDB.LibraryModules.AnimationUtils.spring(pillHeight, {toValue: v, friction: 5})
]).start();
};
let animate2 = (v) => {
BDFDB.LibraryModules.AnimationUtils.parallel([
BDFDB.LibraryModules.AnimationUtils.timing(pillOpacity, {toValue: v, duration: 200}),
]).start();
};
guildcopyinner.addEventListener("mouseenter", () => {
if (!BDFDB.LibraryModules.GuildStore.getGuild(guildid)) return BDFDB.DOMUtils.remove(guildcopy);
let EditServers = BDFDB.BDUtils.getPlugin("EditServers");
let ESdata = EditServers ? EditServers.getGuildData(guildid, guildcopyinner) : null;
if (ESdata && (ESdata.name || ESdata.color3 || ESdata.color4)) EditServers.changeTooltip(guild, guildcopyinner, "right");
else {
let folderData = BDFDB.DataUtils.load(this, "folders", folderid) || {};
let color3 = folderData.copyTooltipColor ? folderData.color3 : null;
let color4 = folderData.copyTooltipColor ? folderData.color4 : null;
let isgradient3 = color3 && BDFDB.ObjectUtils.is(color3);
let isgradient4 = color4 && BDFDB.ObjectUtils.is(color4);
let bgColor = color3 ? (!isgradient3 ? BDFDB.ColorUtils.convert(color3, "RGBA") : BDFDB.ColorUtils.createGradient(color3)) : "";
let fontColor = color4 ? (!isgradient4 ? BDFDB.ColorUtils.convert(color4, "RGBA") : BDFDB.ColorUtils.createGradient(color4)) : "";
BDFDB.TooltipUtils.create(guildcopyinner, isgradient4 ? `${BDFDB.StringUtils.htmlEscape(guild.name)}` : guild.name, {type:"right", selector:"guild-folder-tooltip", style:`${isgradient4 ? '' : 'color: ' + fontColor + ' !important; '}background: ${bgColor} !important; border-color: ${isgradient3 ? BDFDB.ColorUtils.convert(color3[0], "RGBA") : bgColor} !important;`, html:isgradient3, hide:true});
}
if (guildicon && guildicon.src && guild.icon && guild.icon.startsWith("a_") && guild.features.has("ANIMATED_ICON") && guildicon.src.includes("discordapp.com/icons/")) {
guildicon.src = guildicon.src.replace(".webp", ".gif");
}
pillvisible = guildpillitem && guildpillitem.style.getPropertyValue("opacity") != 0;
if (BDFDB.LibraryModules.LastGuildStore.getGuildId() != guildid) {
animate(1);
if (!pillvisible) animate2(1);
}
});
guildcopyinner.addEventListener("mouseleave", () => {
if (guildicon && guildicon.src && guild.icon && guild.icon.startsWith("a_") && guild.features.has("ANIMATED_ICON") && guildicon.src.includes("discordapp.com/icons/") && !BDFDB.ReactUtils.getValue(BDFDB.BDUtils.getPlugin("AutoPlayGifs", true), "settings.guildList")) {
guildicon.src = guildicon.src.replace(".gif", ".webp");
}
if (BDFDB.LibraryModules.LastGuildStore.getGuildId() != guildid) {
animate(0);
if (!pillvisible) animate2(0);
}
});
guildcopy.addEventListener("click", e => {
BDFDB.ListenerUtils.stopEvent(e);
if (BDFDB.InternalData.pressedKeys.includes(46)) this.removeGuildFromFolder(folderid, guildid);
else {
BDFDB.LibraryModules.GuildUtils.transitionToGuildSync(guild.id);
let settings = BDFDB.DataUtils.get(this, "settings");
if (settings.closeAllFolders) for (let openFolderId of BDFDB.LibraryModules.FolderUtils.getExpandedFolders()) if (openFolderId != folderid || !settings.forceOpenFolder) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(openFolderId);
else if (settings.closeTheFolder && !settings.forceOpenFolder && BDFDB.LibraryModules.FolderUtils.isFolderExpanded(folderid)) BDFDB.LibraryModules.GuildUtils.toggleGuildFolderExpand(folderid);
}
});
guildcopy.addEventListener("contextmenu", e => {
BDFDB.GuildUtils.openMenu(guilddiv, e);
});
guildcopy.addEventListener("mousedown", e => {
let x = e.pageX, y = e.pageY;
let mousemove = e2 => {
if (Math.sqrt((x - e2.pageX)**2) > 20 || Math.sqrt((y - e2.pageY)**2) > 20) {
document.removeEventListener("mousemove", mousemove);
document.removeEventListener("mouseup", mouseup);
let hovcopy = null;
let placeholder = BDFDB.DOMUtils.create(this.dragPlaceholderMarkup);
let dragpreview = this.createDragPreview(guilddiv, e);
let dragging = e3 => {
BDFDB.DOMUtils.remove(placeholder);
BDFDB.DOMUtils.hide(guildcopy);
this.updateDragPreview(dragpreview, e3);
if (this.foldercontent.contains(e3.target)) {
hovcopy = BDFDB.DOMUtils.getParent(BDFDB.dotCN.guildouter, e3.target);
if (hovcopy && hovcopy.getAttribute("folderid") == folderid) this.foldercontentguilds.insertBefore(placeholder, hovcopy.nextSibling);
else hovcopy = null;
}
};
let releasing = e3 => {
document.removeEventListener("mousemove", dragging);
document.removeEventListener("mouseup", releasing);
BDFDB.DOMUtils.remove(placeholder, dragpreview);
BDFDB.DOMUtils.show(guildcopy);
let dropfolderdiv = BDFDB.DOMUtils.getParent(BDFDB.dotCN.guildfolderwrapper, e3.target);
let newfolderid = dropfolderdiv ? BDFDB.FolderUtils.getId(dropfolderdiv) : null;
if (newfolderid) {
if (newfolderid != folderid) {
BDFDB.DOMUtils.remove(guildcopy);
this.addGuildToFolder(newfolderid, guildid);
}
}
else if (hovcopy) {
this.foldercontentguilds.insertBefore(guildcopy, hovcopy.nextSibling);
this.updateGuildPositions(folderid);
}
};
document.addEventListener("mousemove", dragging);
document.addEventListener("mouseup", releasing);
}
};
let mouseup = () => {
document.removeEventListener("mousemove", mousemove);
document.removeEventListener("mouseup", mouseup);
};
document.addEventListener("mousemove", mousemove);
document.addEventListener("mouseup", mouseup);
});
guildcopy.querySelector("a").setAttribute("draggable", false);
return guildcopy;
}
updateGuildPositions (folderid) {
let oldGuildFolders = Object.assign({}, BDFDB.LibraryModules.FolderStore.guildFolders);
let guildFolders = [], guildPositions = [];
for (let i in oldGuildFolders) {
if (oldGuildFolders[i].folderId) {
let newFolder = Object.assign({}, oldGuildFolders[i]);
if (oldGuildFolders[i].folderId == folderid) {
let sameFolderGuilds = this.foldercontentguilds.querySelectorAll(`[guildid][folderid="${folderid}"]`);
if (sameFolderGuilds.length > 0) {
newFolder.guildIds = [];
for (let guilddiv of sameFolderGuilds) newFolder.guildIds.push(guilddiv.getAttribute("guildid"));
}
}
guildFolders.push(newFolder);
}
else guildFolders.push(oldGuildFolders[i]);
}
for (let i in guildFolders) for (let guildid of guildFolders[i].guildIds) guildPositions.push(guildid);
BDFDB.LibraryModules.SettingsUtils.updateRemoteSettings({guildPositions, guildFolders});
}
openFolderCreationMenu (guilds, initguildid) {
let modal = BDFDB.DOMUtils.create(`
${this.labels.serversubmenu_createfolder_text}
`);
let targetedguildsids = {};
let container = modal.querySelector(".entries");
BDFDB.ListenerUtils.addToChildren(modal, "click", ".btn-done", () => {
let ids = [];
for (let id in targetedguildsids) if (targetedguildsids[id]) ids.push(id);
this.createFolder(ids);
});
for (let guild of guilds) {
if (container.firstElementChild) container.appendChild(BDFDB.DOMUtils.create(``));
let entry = BDFDB.DOMUtils.create(`