diff --git a/.config/BetterDiscord/plugins/ShowHiddenChannels.plugin.js b/.config/BetterDiscord/plugins/ShowHiddenChannels.plugin.js
new file mode 100644
index 0000000..9d672f2
--- /dev/null
+++ b/.config/BetterDiscord/plugins/ShowHiddenChannels.plugin.js
@@ -0,0 +1,972 @@
+/**
+ * @name ShowHiddenChannels
+ * @author DevilBro
+ * @authorId 278543574059057154
+ * @version 3.0.1
+ * @description Displays all hidden Channels, which can't be accessed due to Role Restrictions, this won't allow you to read them (impossible)
+ * @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/ShowHiddenChannels/
+ * @updateUrl https://mwittrien.github.io/BetterDiscordAddons/Plugins/ShowHiddenChannels/ShowHiddenChannels.plugin.js
+ */
+
+module.exports = (_ => {
+ const config = {
+ "info": {
+ "name": "ShowHiddenChannels",
+ "author": "DevilBro",
+ "version": "3.0.1",
+ "description": "Displays all hidden Channels, which can't be accessed due to Role Restrictions, this won't allow you to read them (impossible)"
+ },
+ "changeLog": {
+ "fixed": {
+ "Denied Users": "Fixed an Issue that caused denied Users not to be Listed together with denied Roles"
+ }
+ }
+ };
+
+ return (window.Lightcord || window.LightCord) ? class {
+ getName () {return config.info.name;}
+ getAuthor () {return config.info.author;}
+ getVersion () {return config.info.version;}
+ getDescription () {return "Do not use LightCord!";}
+ load () {BdApi.alert("Attention!", "By using LightCord you are risking your Discord Account, due to using a 3rd Party Client. Switch to an official Discord Client (https://discord.com/) with the proper BD Injection (https://betterdiscord.app/)");}
+ start() {}
+ stop() {}
+ } : !window.BDFDB_Global || (!window.BDFDB_Global.loaded && !window.BDFDB_Global.started) ? class {
+ getName () {return config.info.name;}
+ getAuthor () {return config.info.author;}
+ getVersion () {return config.info.version;}
+ getDescription () {return `The Library Plugin needed for ${config.info.name} is missing. Open the Plugin Settings to download it. \n\n${config.info.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 ${config.info.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(config.info.name)) window.BDFDB_Global.pluginQueue.push(config.info.name);
+ }
+ start () {this.load();}
+ stop () {}
+ getSettingsPanel () {
+ let template = document.createElement("template");
+ template.innerHTML = `
The Library Plugin needed for ${config.info.name} is missing.\nPlease click
Download Now to install it.
`;
+ template.content.firstElementChild.querySelector("a").addEventListener("click", this.downloadLibrary);
+ return template.content.firstElementChild;
+ }
+ } : (([Plugin, BDFDB]) => {
+ var blackList = [], collapseList = [], hiddenCategory, lastGuildId, overrideTypes = [];
+ var hiddenChannelCache = {};
+ var accessModal;
+
+ const channelGroupMap = {
+ GUILD_TEXT: "SELECTABLE",
+ GUILD_VOICE: "VOCAL",
+ GUILD_ANNOUNCEMENT: "SELECTABLE",
+ GUILD_STORE: "SELECTABLE",
+ };
+
+ const typeNameMap = {
+ GUILD_TEXT: "TEXT_CHANNEL",
+ GUILD_VOICE: "VOICE_CHANNEL",
+ GUILD_ANNOUNCEMENT: "NEWS_CHANNEL",
+ GUILD_STORE: "STORE_CHANNEL",
+ GUILD_CATEGORY: "CATEGORY",
+ GUILD_STAGE_VOICE: "STAGE_CHANNEL"
+ };
+
+ const sortOrders = {
+ NATIVE: {value: "native", label: "Native Category in correct Order"},
+ BOTTOM: {value: "bottom", label: "Native Category at the bottom"},
+ EXTRA: {value: "extra", label: "Extra Category 'Hidden'"}
+ };
+
+ const UserRowComponent = class UserRow extends BdApi.React.Component {
+ componentDidMount() {
+ if (this.props.user.fetchable) {
+ this.props.user.fetchable = false;
+ BDFDB.LibraryModules.UserFetchUtils.getUser(this.props.user.id).then(fetchedUser => {
+ this.props.user = Object.assign({}, fetchedUser, BDFDB.LibraryModules.MemberStore.getMember(this.props.guildId, this.props.user.id) || {});
+ BDFDB.ReactUtils.forceUpdate(this);
+ });
+ }
+ }
+ render() {
+ return BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ListRow, {
+ prefix: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.listavatar,
+ children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.AvatarComponents.default, {
+ src: BDFDB.UserUtils.getAvatar(this.props.user.id),
+ status: BDFDB.UserUtils.getStatus(this.props.user.id),
+ size: BDFDB.LibraryComponents.AvatarComponents.Sizes.SIZE_40,
+ onClick: _ => {
+ if (accessModal) accessModal.props.onClose();
+ BDFDB.LibraryModules.UserProfileModalUtils.openUserProfileModal({
+ userId: this.props.user.id,
+ guildId: this.props.guildId
+ });
+ }
+ })
+ }),
+ labelClassName: BDFDB.disCN.nametag,
+ label: [
+ BDFDB.ReactUtils.createElement("span", {
+ className: BDFDB.disCN.username,
+ children: this.props.user.username,
+ style: {color: this.props.user.colorString}
+ }),
+ !this.props.user.discriminator ? null : BDFDB.ReactUtils.createElement("span", {
+ className: BDFDB.disCN.listdiscriminator,
+ children: `#${this.props.user.discriminator}`
+ }),
+ this.props.user.bot && BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.BotTag, {
+ style: {marginLeft: 6}
+ })
+ ]
+ });
+ }
+ };
+
+ const RoleRowComponent = class RoleRow extends BdApi.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ListRow, {
+ prefix: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCNS.avataricon + BDFDB.disCNS.listavatar + BDFDB.disCNS.avatariconsizemedium + BDFDB.disCN.avatariconinactive,
+ style: {
+ boxSizing: "border-box",
+ padding: 10
+ },
+ children: BDFDB.ReactUtils.createElement("div", {
+ style: {
+ borderRadius: "50%",
+ height: "100%",
+ width: "100%",
+ backgroundColor: BDFDB.ColorUtils.convert(this.props.role.colorString || BDFDB.DiscordConstants.Colors.PRIMARY_DARK_300, "RGB")
+ }
+ })
+ }),
+ labelClassName: this.props.role.overwritten && BDFDB.disCN.strikethrough,
+ label: BDFDB.ReactUtils.createElement("span", {
+ children: this.props.role.name,
+ style: {color: this.props.role.colorString}
+ })
+ });
+ }
+ };
+
+ return class ShowHiddenChannels extends Plugin {
+ onLoad () {
+ overrideTypes = Object.keys(BDFDB.DiscordConstants.PermissionOverrideType);
+
+ this.defaults = {
+ sortOrder: {
+ hidden: {
+ value: sortOrders[Object.keys(sortOrders)[0]].value,
+ description: "Sorts hidden Channels in",
+ options: Object.keys(sortOrders).map(n => sortOrders[n])
+ }
+ },
+ general: {
+ alwaysCollapse: {value: false, description: "Always collapse 'Hidden' Category after switching Servers"},
+ showVoiceUsers: {value: true, description: "Show connected Users in hidden Voice Channels"},
+ showForNormal: {value: true, description: "Add Access-Overview ContextMenu Entry for non-hidden Channels"}
+ },
+ channels: {
+ GUILD_TEXT: {value: true},
+ GUILD_VOICE: {value: true},
+ GUILD_ANNOUNCEMENT: {value: true},
+ GUILD_STORE: {value: true},
+ GUILD_STAGE_VOICE: {value: true}
+ }
+ };
+
+ this.patchedModules = {
+ before: {
+ Channels: "render",
+ ChannelCategoryItem: "type",
+ VoiceUsers: "render"
+ },
+ after: {
+ ChannelItem: "default"
+ }
+ };
+
+ this.css = `
+ ${BDFDB.dotCNS._showhiddenchannelsaccessmodal + BDFDB.dotCN.messagespopoutemptyplaceholder} {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ }
+ `;
+ }
+
+ onStart () {
+ let loadedBlackList = BDFDB.DataUtils.load(this, "blacklist");
+ this.saveBlackList(!BDFDB.ArrayUtils.is(loadedBlackList) ? [] : loadedBlackList);
+
+ let loadedCollapseList = BDFDB.DataUtils.load(this, "categorydata");
+ this.saveCollapseList(!BDFDB.ArrayUtils.is(loadedCollapseList) ? [] : loadedCollapseList);
+
+ BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.UnreadChannelUtils, "hasUnread", {after: e => {
+ return e.returnValue && !this.isChannelHidden(e.methodArguments[0]);
+ }});
+
+ BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.UnreadChannelUtils, "getMentionCount", {after: e => {
+ return this.isChannelHidden(e.methodArguments[0]) ? 0 : e.returnValue;
+ }});
+
+ BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.CategoryCollapseStore, "isCollapsed", {after: e => {
+ if (e.methodArguments[0] && e.methodArguments[0].endsWith("hidden")) {
+ if (this.settings.general.alwaysCollapse && e.methodArguments[0] != lastGuildId && !collapseList.includes(e.methodArguments[0])) {
+ collapseList.push(e.methodArguments[0]);
+ this.saveCollapseList(BDFDB.ArrayUtils.removeCopies(collapseList));
+ }
+ lastGuildId = e.methodArguments[0];
+ return collapseList.includes(e.methodArguments[0]);
+ }
+ }});
+
+ BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.CategoryCollapseUtils, "categoryCollapse", {before: e => {
+ if (e.methodArguments[0] && e.methodArguments[0].endsWith("hidden")) {
+ if (!collapseList.includes(e.methodArguments[0])) {
+ collapseList.push(e.methodArguments[0]);
+ this.saveCollapseList(BDFDB.ArrayUtils.removeCopies(collapseList));
+ }
+ }
+ }});
+
+ BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.CategoryCollapseUtils, "categoryExpand", {before: e => {
+ if (e.methodArguments[0] && e.methodArguments[0].endsWith("hidden")) {
+ if (collapseList.includes(e.methodArguments[0])) {
+ BDFDB.ArrayUtils.remove(collapseList, e.methodArguments[0], true);
+ this.saveCollapseList(BDFDB.ArrayUtils.removeCopies(collapseList));
+ }
+ }
+ }});
+
+ BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.GuildChannelStore, "getTextChannelNameDisambiguations", {after: e => {
+ let all = this.getAllChannels();
+ for (let channel_id in all) if (all[channel_id].guild_id == e.methodArguments[0] && !e.returnValue[channel_id] && (all[channel_id].type != BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY && all[channel_id].type != BDFDB.DiscordConstants.ChannelTypes.GUILD_VOICE)) e.returnValue[channel_id] = {id: channel_id, name: all[channel_id].name};
+ }});
+
+ BDFDB.PatchUtils.patch(this, BDFDB.LibraryModules.ChannelIconUtils, "getChannelIconComponent", {before: e => {
+ if (e.methodArguments[2] && e.methodArguments[2].locked && e.methodArguments[0] && this.isChannelHidden(e.methodArguments[0].id)) e.methodArguments[2].locked = false;
+ }});
+
+ this.forceUpdateAll();
+ }
+
+ onStop () {
+ this.forceUpdateAll();
+ }
+
+ getSettingsPanel (collapseStates = {}) {
+ let settingsPanel;
+ return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(this, {
+ collapseStates: collapseStates,
+ children: _ => {
+ let settingsItems = [];
+
+ for (let key in this.defaults.selections) settingsItems.push();
+
+ settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.CollapseContainer, {
+ title: "Settings",
+ collapseStates: collapseStates,
+ children: Object.keys(this.defaults.sortOrder).map(key => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, {
+ type: "Select",
+ plugin: this,
+ keys: ["sortOrder", key],
+ label: this.defaults.sortOrder[key].description,
+ basis: "50%",
+ options: this.defaults.sortOrder[key].options,
+ value: this.settings.sortOrder[key]
+ })).concat(Object.keys(this.defaults.general).map(key => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, {
+ type: "Switch",
+ plugin: this,
+ keys: ["general", key],
+ label: this.defaults.general[key].description,
+ value: this.settings.general[key]
+ }))).concat(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsPanelList, {
+ title: "Show Channels:",
+ children: Object.keys(this.defaults.channels).map(key => BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsSaveItem, {
+ type: "Switch",
+ plugin: this,
+ keys: ["channels", key],
+ label: BDFDB.LanguageUtils.LanguageStrings[typeNameMap[key]],
+ value: this.settings.channels[key]
+ }))
+ }))
+ }));
+
+ settingsItems.push(BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.CollapseContainer, {
+ title: "Server Black List",
+ collapseStates: collapseStates,
+ children: [
+ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsGuildList, {
+ className: BDFDB.disCN.marginbottom20,
+ disabled: blackList,
+ onClick: disabledGuilds => this.saveBlackList(disabledGuilds)
+ }),
+ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, {
+ type: "Button",
+ color: BDFDB.LibraryComponents.Button.Colors.GREEN,
+ label: "Enable for all Servers",
+ onClick: _ => this.batchSetGuilds(settingsPanel, collapseStates, true),
+ children: BDFDB.LanguageUtils.LanguageStrings.ENABLE
+ }),
+ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SettingsItem, {
+ type: "Button",
+ color: BDFDB.LibraryComponents.Button.Colors.PRIMARY,
+ label: "Disable for all Servers",
+ onClick: _ => this.batchSetGuilds(settingsPanel, collapseStates, false),
+ children: BDFDB.LanguageUtils.LanguageStrings.DISABLE
+ })
+ ]
+ }));
+
+ return settingsItems;
+ }
+ });
+ }
+
+ onSettingsClosed () {
+ if (this.SettingsUpdated) {
+ delete this.SettingsUpdated;
+ this.forceUpdateAll();
+ }
+ }
+
+ forceUpdateAll () {
+ hiddenChannelCache = {};
+
+ BDFDB.PatchUtils.forceAllUpdates(this);
+ BDFDB.ChannelUtils.rerenderAll();
+ }
+
+ onChannelContextMenu (e) {
+ if (e.instance.props.channel) {
+ if (e.instance.props.channel.id.endsWith("hidden") && e.instance.props.channel.type == BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY) {
+ let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: "ChannelMuteItem"});
+ if (index > -1) children.splice(index, 1);
+ [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "mark-channel-read", group: true});
+ children.splice(index > -1 ? index + 1 : 0, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, {
+ children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
+ label: this.labels.context_changeorder,
+ id: BDFDB.ContextMenuUtils.createItemId(this.name, "change_order"),
+ children: Object.keys(sortOrders).filter(n => sortOrders[n].value != sortOrders.EXTRA.value).map(n => BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, {
+ children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
+ label: this.labels["context_changeorder_" + sortOrders[n].value],
+ id: BDFDB.ContextMenuUtils.createItemId(this.name, "change_order", sortOrders[n].value),
+ action: _ => {
+ this.settings.sortOrder.hidden = sortOrders[n].value;
+ BDFDB.DataUtils.save(this.settings.sortOrder, this, "sortOrder");
+ this.forceUpdateAll();
+ }
+ })
+ }))
+ })
+ }));
+ }
+ let isHidden = this.isChannelHidden(e.instance.props.channel.id);
+ if (isHidden || this.settings.general.showForNormal) {
+ let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "mark-channel-read", group: true});
+ children.splice(index > -1 ? index + 1 : 0, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuGroup, {
+ children: BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuItem, {
+ label: this.labels.context_channelaccess,
+ id: BDFDB.ContextMenuUtils.createItemId(this.name, "permissions"),
+ action: _ => this.openAccessModal(e.instance.props.channel, !isHidden)
+ })
+ }));
+ }
+ }
+ }
+
+ onGuildContextMenu (e) {
+ if (e.instance.props.guild) {
+ let [children, index] = BDFDB.ContextMenuUtils.findItem(e.returnvalue, {id: "hide-muted-channels"});
+ if (index > -1) children.splice(index + 1, 0, BDFDB.ContextMenuUtils.createItem(BDFDB.LibraryComponents.MenuItems.MenuCheckboxItem, {
+ label: this.labels.context_hidehidden,
+ id: BDFDB.ContextMenuUtils.createItemId(this.name, "hide-locked-channels"),
+ checked: blackList.includes(e.instance.props.guild.id),
+ action: value => {
+ if (value) blackList.push(e.instance.props.guild.id);
+ else BDFDB.ArrayUtils.remove(blackList, e.instance.props.guild.id, true);
+ this.saveBlackList(BDFDB.ArrayUtils.removeCopies(blackList));
+
+ BDFDB.PatchUtils.forceAllUpdates(this);
+ BDFDB.ChannelUtils.rerenderAll(true);
+ }
+ }));
+ }
+ }
+
+ onGuildHeaderContextMenu (e) {
+ this.onGuildContextMenu(e);
+ }
+
+ processChannels (e) {
+ if (!e.instance.props.guild || blackList.includes(e.instance.props.guild.id)) return;
+ let [hiddenChannels, amount] = this.getHiddenChannels(e.instance.props.guild);
+ if (amount) {
+ e.instance.props.categories = Object.assign({}, e.instance.props.categories);
+ for (let catId in e.instance.props.categories) e.instance.props.categories[catId] = [].concat(e.instance.props.categories[catId]);
+ e.instance.props.channels = Object.assign({}, e.instance.props.channels);
+ for (let type in e.instance.props.channels) e.instance.props.channels[type] = [].concat(e.instance.props.channels[type]);
+
+ let hiddenId = e.instance.props.guild.id + "_hidden";
+
+ delete e.instance.props.categories[hiddenId];
+ e.instance.props.categories._categories = e.instance.props.categories._categories.filter(n => n.channel.id != hiddenId);
+ e.instance.props.channels[BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY] = e.instance.props.channels[BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY].filter(n => n.channel.id != hiddenId);
+
+ let index = -1;
+ for (let catId in e.instance.props.categories) {
+ if (catId != "_categories") e.instance.props.categories[catId] = e.instance.props.categories[catId].filter(n => !this.isChannelHidden(n.channel.id));
+ for (let channelObj of e.instance.props.categories[catId]) if (channelObj.index > index) index = parseInt(channelObj.index);
+ }
+ if (this.settings.sortOrder.hidden == sortOrders.EXTRA.value) {
+ hiddenCategory = new BDFDB.DiscordObjects.Channel({
+ guild_id: e.instance.props.guild.id,
+ id: hiddenId,
+ name: "hidden",
+ type: BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY
+ });
+ e.instance.props.categories[hiddenId] = [];
+ e.instance.props.categories._categories.push({
+ channel: hiddenCategory,
+ index: ++index
+ });
+ e.instance.props.channels[BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY].push({
+ comparator: (e.instance.props.channels[BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY][e.instance.props.channels[BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY].length - 1] || {comparator: 0}).comparator + 1,
+ channel: hiddenCategory
+ });
+ }
+ else hiddenCategory = null;
+
+ for (let type in hiddenChannels) {
+ let channelType = channelGroupMap[BDFDB.DiscordConstants.ChannelTypes[type]] || type;
+ if (!BDFDB.ArrayUtils.is(e.instance.props.channels[channelType])) e.instance.props.channels[channelType] = [];
+ for (let channel of hiddenChannels[type]) {
+ let hiddenChannel = new BDFDB.DiscordObjects.Channel(Object.assign({}, channel, {
+ parent_id: hiddenCategory ? hiddenId : channel.parent_id,
+ position: this.settings.sortOrder.hidden == sortOrders.BOTTOM.value ? 999999999 : channel.position
+ }));
+ let parent_id = hiddenChannel.parent_id || "null";
+ e.instance.props.categories[parent_id].push({
+ channel: hiddenChannel,
+ index: hiddenChannel.position
+ });
+ e.instance.props.channels[channelType].push({
+ comparator: hiddenChannel.position,
+ channel: hiddenChannel
+ });
+ }
+ }
+
+ for (let parent_id in e.instance.props.categories) BDFDB.ArrayUtils.keySort(e.instance.props.categories[parent_id], "index");
+ for (let channelType in e.instance.props.channels) BDFDB.ArrayUtils.keySort(e.instance.props.channels[channelType], "comparator");
+ }
+ }
+
+ processChannelCategoryItem (e) {
+ if (hiddenCategory && e.instance.props.channel && !e.instance.props.channel.id && e.instance.props.channel.type != BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY) e.instance.props.channel = hiddenCategory;
+ }
+
+ processChannelItem (e) {
+ if (e.instance.props.channel && this.isChannelHidden(e.instance.props.channel.id)) {
+ let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {name: "ChannelItemIcon"});
+ let channelChildren = BDFDB.ReactUtils.findChild(e.returnvalue, {props: [["className", BDFDB.disCN.channelchildren]]});
+ if (channelChildren && channelChildren.props && channelChildren.props.children) {
+ channelChildren.props.children = [BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.TooltipContainer, {
+ text: BDFDB.LanguageUtils.LanguageStrings.CHANNEL_LOCKED_SHORT,
+ children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.Clickable, {
+ className: BDFDB.disCN.channeliconitem,
+ style: {display: "block"},
+ children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.SvgIcon, {
+ className: BDFDB.disCN.channelactionicon,
+ name: BDFDB.LibraryComponents.SvgIcon.Names.LOCK_CLOSED
+ })
+ })
+ })];
+ }
+ if (!(e.instance.props.channel.type == BDFDB.DiscordConstants.ChannelTypes.GUILD_VOICE && e.instance.props.connected)) {
+ let wrapper = BDFDB.ReactUtils.findChild(e.returnvalue, {props: [["className", BDFDB.disCN.channelwrapper]]});
+ if (wrapper) {
+ wrapper.props.onMouseDown = _ => {};
+ wrapper.props.onMouseUp = _ => {};
+ }
+ let mainContent = BDFDB.ReactUtils.findChild(e.returnvalue, {props: [["className", BDFDB.disCN.channelmaincontent]]});
+ if (mainContent) {
+ mainContent.props.onClick = _ => {};
+ mainContent.props.href = null;
+ }
+ }
+ }
+ }
+
+ processVoiceUsers (e) {
+ if (!this.settings.general.showVoiceUsers && this.isChannelHidden(e.instance.props.channel.id)) e.instance.props.voiceStates = [];
+ }
+
+ isChannelHidden (channelId) {
+ let channel = BDFDB.LibraryModules.ChannelStore.getChannel(channelId);
+ return channel && hiddenChannelCache[channel.guild_id] && hiddenChannelCache[channel.guild_id].hidden[channel.type] && hiddenChannelCache[channel.guild_id].hidden[channel.type].find(c => c.id == channel.id);
+ }
+
+ getAllChannels () {
+ return (BDFDB.LibraryModules.ChannelStore.getGuildChannels || BDFDB.LibraryModules.ChannelStore.getMutableGuildChannels || (_ => ({})))();
+ }
+
+ getHiddenChannels (guild) {
+ if (!guild) return [{}, 0];
+ let hiddenChannels = {}, visibleAmount = (BDFDB.LibraryModules.GuildChannelStore.getChannels(guild.id) || {count: 0}),count, rolesAmount = (BDFDB.LibraryModules.MemberStore.getMember(guild.id, BDFDB.UserUtils.me.id) || {roles: []}).roles.length;
+ if (!hiddenChannelCache[guild.id] || hiddenChannelCache[guild.id].visible != visibleAmount || hiddenChannelCache[guild.id].roles != rolesAmount) {
+ let all = this.getAllChannels();
+ for (let type in BDFDB.DiscordConstants.ChannelTypes) hiddenChannels[BDFDB.DiscordConstants.ChannelTypes[type]] = [];
+ for (let channel_id in all) {
+ let channel = all[channel_id];
+ if (channel.guild_id == guild.id && channel.type != BDFDB.DiscordConstants.ChannelTypes.GUILD_CATEGORY && (this.settings.channels[BDFDB.DiscordConstants.ChannelTypes[channel.type]] || this.settings.channels[BDFDB.DiscordConstants.ChannelTypes[channel.type]] === undefined) && !BDFDB.DMUtils.isDMChannel(channel.id) && !BDFDB.UserUtils.can("VIEW_CHANNEL", BDFDB.UserUtils.me.id, channel.id)) hiddenChannels[channel.type].push(channel);
+ }
+ }
+ else hiddenChannels = hiddenChannelCache[guild.id].hidden;
+ for (let type in hiddenChannels) hiddenChannels[type] = hiddenChannels[type].filter(c => BDFDB.LibraryModules.ChannelStore.getChannel(c.id));
+ hiddenChannelCache[guild.id] = {hidden: hiddenChannels, amount: BDFDB.ObjectUtils.toArray(hiddenChannels).flat().length, visible: visibleAmount, roles: rolesAmount};
+ return [hiddenChannelCache[guild.id].hidden, hiddenChannelCache[guild.id].amount];
+ }
+
+ batchSetGuilds (settingsPanel, collapseStates, value) {
+ if (!value) {
+ for (let id of BDFDB.LibraryModules.FolderStore.getFlattenedGuildIds()) blackList.push(id);
+ this.saveBlackList(BDFDB.ArrayUtils.removeCopies(blackList));
+ }
+ else this.saveBlackList([]);
+ BDFDB.PluginUtils.refreshSettingsPanel(this, settingsPanel, collapseStates);
+ }
+
+ saveBlackList (savedBlackList) {
+ blackList = savedBlackList;
+ BDFDB.DataUtils.save(savedBlackList, this, "blacklist");
+ }
+
+ saveCollapseList (savedCollapseList) {
+ collapseList = savedCollapseList;
+ BDFDB.DataUtils.save(savedCollapseList, this, "categorydata");
+ }
+
+ openAccessModal (channel, allowed) {
+ let guild = BDFDB.LibraryModules.GuildStore.getGuild(channel.guild_id);
+ let myMember = guild && BDFDB.LibraryModules.MemberStore.getMember(guild.id, BDFDB.UserUtils.me.id);
+ let category = BDFDB.LibraryModules.ChannelStore.getChannel(BDFDB.LibraryModules.ChannelStore.getChannel(channel.id).parent_id);
+ let lightTheme = BDFDB.DiscordUtils.getTheme() == BDFDB.disCN.themelight;
+
+ let addUser = (id, users) => {
+ let user = BDFDB.LibraryModules.UserStore.getUser(id);
+ if (user) users.push(Object.assign({}, user, BDFDB.LibraryModules.MemberStore.getMember(guild.id, id) || {}));
+ else users.push({id: id, username: `UserId: ${id}`, fetchable: true});
+ };
+ let checkPerm = permString => {
+ return ((permString | BDFDB.DiscordConstants.Permissions.VIEW_CHANNEL) == permString || (permString | BDFDB.DiscordConstants.Permissions.READ_MESSAGE_HISTORY) == permString || channel.type == BDFDB.DiscordConstants.ChannelTypes.GUILD_VOICE && (permString | BDFDB.DiscordConstants.Permissions.CONNECT) == permString);
+ };
+
+ let allowedRoles = [], allowedUsers = [], deniedRoles = [], deniedUsers = [], everyoneDenied = false;
+ for (let id in channel.permissionOverwrites) {
+ if ((channel.permissionOverwrites[id].type == BDFDB.DiscordConstants.PermissionOverrideType.ROLE || overrideTypes[channel.permissionOverwrites[id].type] == BDFDB.DiscordConstants.PermissionOverrideType.ROLE) && (guild.roles[id] && guild.roles[id].name != "@everyone") && checkPerm(channel.permissionOverwrites[id].allow)) {
+ allowedRoles.push(Object.assign({overwritten: myMember && myMember.roles.includes(id) && !allowed}, guild.roles[id]));
+ }
+ else if ((channel.permissionOverwrites[id].type == BDFDB.DiscordConstants.PermissionOverrideType.MEMBER || overrideTypes[channel.permissionOverwrites[id].type] == BDFDB.DiscordConstants.PermissionOverrideType.MEMBER) && checkPerm(channel.permissionOverwrites[id].allow)) {
+ addUser(id, allowedUsers);
+ }
+ if ((channel.permissionOverwrites[id].type == BDFDB.DiscordConstants.PermissionOverrideType.ROLE || overrideTypes[channel.permissionOverwrites[id].type] == BDFDB.DiscordConstants.PermissionOverrideType.ROLE) && checkPerm(channel.permissionOverwrites[id].deny)) {
+ deniedRoles.push(guild.roles[id]);
+ if (guild.roles[id] && guild.roles[id].name == "@everyone") everyoneDenied = true;
+ }
+ else if ((channel.permissionOverwrites[id].type == BDFDB.DiscordConstants.PermissionOverrideType.MEMBER || overrideTypes[channel.permissionOverwrites[id].type] == BDFDB.DiscordConstants.PermissionOverrideType.MEMBER) && checkPerm(channel.permissionOverwrites[id].deny)) {
+ addUser(id, deniedUsers);
+ }
+ }
+
+ if (![].concat(allowedUsers, deniedUsers).find(user => user.id == guild.ownerId)) addUser(guild.ownerId, allowedUsers);
+ for (let id in guild.roles) if ((guild.roles[id].permissions | BDFDB.DiscordConstants.Permissions.ADMINISTRATOR) == guild.roles[id].permissions && ![].concat(allowedRoles, deniedRoles).find(role => role.id == id)) allowedRoles.push(Object.assign({overwritten: myMember && myMember.roles.includes(id) && !allowed}, guild.roles[id]));
+ if (allowed && !everyoneDenied) allowedRoles.push({name: "@everyone"});
+
+ let allowedElements = [], deniedElements = [];
+ for (let role of allowedRoles) allowedElements.push(BDFDB.ReactUtils.createElement(RoleRowComponent, {role: role, guildId: guild.id, channelId: channel.id}));
+ for (let user of allowedUsers) allowedElements.push(BDFDB.ReactUtils.createElement(UserRowComponent, {user: user, guildId: guild.id, channelId: channel.id}));
+ for (let role of deniedRoles) deniedElements.push(BDFDB.ReactUtils.createElement(RoleRowComponent, {role: role, guildId: guild.id, channelId: channel.id}));
+ for (let user of deniedUsers) deniedElements.push(BDFDB.ReactUtils.createElement(UserRowComponent, {user: user, guildId: guild.id, channelId: channel.id}));
+
+ BDFDB.ModalUtils.open(this, {
+ size: "MEDIUM",
+ header: BDFDB.LanguageUtils.LanguageStrings.CHANNEL + " " + BDFDB.LanguageUtils.LanguageStrings.ACCESSIBILITY,
+ subHeader: "#" + channel.name,
+ className: BDFDB.disCN._showhiddenchannelsaccessmodal,
+ contentClassName: BDFDB.disCN.listscroller,
+ onOpen: modalInstance => {if (modalInstance) accessModal = modalInstance;},
+ children: [
+ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, {
+ className: BDFDB.disCN.modalsubinner,
+ tab: BDFDB.LanguageUtils.LanguageStrings.OVERLAY_SETTINGS_GENERAL_TAB,
+ children: [{
+ title: BDFDB.LanguageUtils.LanguageStrings.FORM_LABEL_CHANNEL_NAME,
+ text: channel.name
+ }, channel.type == BDFDB.DiscordConstants.ChannelTypes.GUILD_VOICE ? {
+ title: BDFDB.LanguageUtils.LanguageStrings.FORM_LABEL_BITRATE,
+ text: channel.bitrate || "---"
+ } : {
+ title: BDFDB.LanguageUtils.LanguageStrings.FORM_LABEL_CHANNEL_TOPIC,
+ text: BDFDB.ReactUtils.markdownParse(channel.topic || "---")
+ }, {
+ title: BDFDB.LanguageUtils.LanguageStrings.CHANNEL_TYPE,
+ text: BDFDB.LanguageUtils.LanguageStrings[typeNameMap[BDFDB.DiscordConstants.ChannelTypes[channel.type]]]
+ }, {
+ title: BDFDB.LanguageUtils.LanguageStrings.CATEGORY_NAME,
+ text: category && category.name || BDFDB.LanguageUtils.LanguageStrings.NO_CATEGORY
+ }].map((formLabel, i) => formLabel && [
+ i == 0 ? null : BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormDivider, {
+ className: BDFDB.disCN.marginbottom20
+ }),
+ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormItem, {
+ title: `${formLabel.title}:`,
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.marginbottom20, i == 0 && BDFDB.disCN.margintop8),
+ children: BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.FormComponents.FormText, {
+ className: BDFDB.disCN.marginleft8,
+ children: formLabel.text
+ })
+ })
+ ]).flat(10).filter(n => n)
+ }),
+ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, {
+ tab: this.labels.modal_allowed,
+ children: allowedElements.length ? allowedElements :
+ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.MessagesPopoutComponents.EmptyStateBottom, {
+ msg: BDFDB.LanguageUtils.LanguageStrings.AUTOCOMPLETE_NO_RESULTS_HEADER,
+ image: lightTheme ? "/assets/9b0d90147f7fab54f00dd193fe7f85cd.svg" : "/assets/308e587f3a68412f137f7317206e92c2.svg"
+ })
+ }),
+ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.ModalComponents.ModalTabContent, {
+ tab: this.labels.modal_denied,
+ children: deniedElements.length ? deniedElements :
+ BDFDB.ReactUtils.createElement(BDFDB.LibraryComponents.MessagesPopoutComponents.EmptyStateBottom, {
+ msg: BDFDB.LanguageUtils.LanguageStrings.AUTOCOMPLETE_NO_RESULTS_HEADER,
+ image: lightTheme ? "/assets/9b0d90147f7fab54f00dd193fe7f85cd.svg" : "/assets/308e587f3a68412f137f7317206e92c2.svg"
+ })
+ })
+ ]
+ });
+ }
+
+ setLabelsByLanguage () {
+ switch (BDFDB.LanguageUtils.getLanguage().id) {
+ case "bg": // Bulgarian
+ return {
+ context_changeorder: "Промяна на реда на скритите канали",
+ context_changeorder_bottom: "Родна категория в долната част",
+ context_changeorder_native: "Родна категория в правилен ред",
+ context_channelaccess: "Достъп до канал",
+ context_hidehidden: "Скриване на заключените канали",
+ modal_allowed: "Разрешено",
+ modal_denied: "Отрича се"
+ };
+ case "cs": // Czech
+ return {
+ context_changeorder: "Změnit pořadí skrytých kanálů",
+ context_changeorder_bottom: "Nativní kategorie dole",
+ context_changeorder_native: "Nativní kategorie ve správném pořadí",
+ context_channelaccess: "Přístup ke kanálu",
+ context_hidehidden: "Skrýt zamčené kanály",
+ modal_allowed: "Povoleno",
+ modal_denied: "Odepřeno"
+ };
+ case "da": // Danish
+ return {
+ context_changeorder: "Skift rækkefølge for skjulte kanaler",
+ context_changeorder_bottom: "Indfødt kategori i bunden",
+ context_changeorder_native: "Native Kategori i korrekt rækkefølge",
+ context_channelaccess: "Kanaltilgang",
+ context_hidehidden: "Skjul låste kanaler",
+ modal_allowed: "Tilladt",
+ modal_denied: "Nægtet"
+ };
+ case "de": // German
+ return {
+ context_changeorder: "Reihenfolge der versteckten Kanäle ändern",
+ context_changeorder_bottom: "Native Kategorie ganz unten",
+ context_changeorder_native: "Native Kategorie in der richtigen Reihenfolge",
+ context_channelaccess: "Kanalzugriff",
+ context_hidehidden: "Versteckte Kanäle ausblenden",
+ modal_allowed: "Erlaubt",
+ modal_denied: "Verweigert"
+ };
+ case "el": // Greek
+ return {
+ context_changeorder: "Αλλαγή σειράς κρυφών καναλιών",
+ context_changeorder_bottom: "Εγγενής κατηγορία στο κάτω μέρος",
+ context_changeorder_native: "Εγγενής κατηγορία σε σωστή σειρά",
+ context_channelaccess: "Πρόσβαση καναλιού",
+ context_hidehidden: "Απόκρυψη κλειδωμένων καναλιών",
+ modal_allowed: "Επιτρεπόμενο",
+ modal_denied: "Απορρίφθηκε"
+ };
+ case "es": // Spanish
+ return {
+ context_changeorder: "Cambiar el orden de los canales ocultos",
+ context_changeorder_bottom: "Categoría nativa en la parte inferior",
+ context_changeorder_native: "Categoría nativa en el orden correcto",
+ context_channelaccess: "Acceso al canal",
+ context_hidehidden: "Ocultar canales bloqueados",
+ modal_allowed: "Permitido",
+ modal_denied: "Negado"
+ };
+ case "fi": // Finnish
+ return {
+ context_changeorder: "Muuta piilotettujen kanavien järjestystä",
+ context_changeorder_bottom: "Alkuperäinen luokka alareunassa",
+ context_changeorder_native: "Alkuperäinen luokka oikeassa järjestyksessä",
+ context_channelaccess: "Kanavan käyttöoikeus",
+ context_hidehidden: "Piilota lukitut kanavat",
+ modal_allowed: "Sallittu",
+ modal_denied: "Kielletty"
+ };
+ case "fr": // French
+ return {
+ context_changeorder: "Modifier l'ordre des canaux cachés",
+ context_changeorder_bottom: "Catégorie native en bas",
+ context_changeorder_native: "Catégorie native dans le bon ordre",
+ context_channelaccess: "Accès à la chaîne",
+ context_hidehidden: "Masquer les salons verrouillées",
+ modal_allowed: "Permis",
+ modal_denied: "Refusé"
+ };
+ case "hi": // Hindi
+ return {
+ context_changeorder: "हिडन चैनल ऑर्डर बदलें",
+ context_changeorder_bottom: "नीचे की ओर मूल श्रेणी",
+ context_changeorder_native: "मूल श्रेणी सही क्रम में",
+ context_channelaccess: "चैनल एक्सेस",
+ context_hidehidden: "बंद चैनल छुपाएं Hide",
+ modal_allowed: "अनुमति है",
+ modal_denied: "निषेध"
+ };
+ case "hr": // Croatian
+ return {
+ context_changeorder: "Promijenite redoslijed skrivenih kanala",
+ context_changeorder_bottom: "Izvorna kategorija na dnu",
+ context_changeorder_native: "Izvorna kategorija u ispravnom redoslijedu",
+ context_channelaccess: "Pristup kanalu",
+ context_hidehidden: "Sakrij zaključane kanale",
+ modal_allowed: "Dopuštena",
+ modal_denied: "Odbijen"
+ };
+ case "hu": // Hungarian
+ return {
+ context_changeorder: "Rejtett csatornák sorrendjének módosítása",
+ context_changeorder_bottom: "Natív kategória az alján",
+ context_changeorder_native: "Natív kategória helyes sorrendben",
+ context_channelaccess: "Csatornához való hozzáférés",
+ context_hidehidden: "Zárt csatornák elrejtése",
+ modal_allowed: "Megengedett",
+ modal_denied: "Megtagadva"
+ };
+ case "it": // Italian
+ return {
+ context_changeorder: "Modifica l'ordine dei canali nascosti",
+ context_changeorder_bottom: "Categoria nativa in basso",
+ context_changeorder_native: "Categoria nativa nell'ordine corretto",
+ context_channelaccess: "Accesso al canale",
+ context_hidehidden: "Nascondi canali bloccati",
+ modal_allowed: "Consentito",
+ modal_denied: "Negato"
+ };
+ case "ja": // Japanese
+ return {
+ context_changeorder: "非表示チャネルの順序を変更する",
+ context_changeorder_bottom: "下部のネイティブカテゴリ",
+ context_changeorder_native: "正しい順序のネイティブカテゴリ",
+ context_channelaccess: "チャネルアクセス",
+ context_hidehidden: "ロックされたチャンネルを非表示にする",
+ modal_allowed: "許可",
+ modal_denied: "拒否されました"
+ };
+ case "ko": // Korean
+ return {
+ context_changeorder: "숨겨진 채널 순서 변경",
+ context_changeorder_bottom: "하단의 기본 카테고리",
+ context_changeorder_native: "올바른 순서의 네이티브 카테고리",
+ context_channelaccess: "채널 액세스",
+ context_hidehidden: "잠긴 채널 숨기기",
+ modal_allowed: "허용됨",
+ modal_denied: "거부 됨"
+ };
+ case "lt": // Lithuanian
+ return {
+ context_changeorder: "Keisti paslėptų kanalų tvarką",
+ context_changeorder_bottom: "Gimtoji kategorija apačioje",
+ context_changeorder_native: "Gimtoji kategorija teisinga tvarka",
+ context_channelaccess: "Prieiga prie kanalo",
+ context_hidehidden: "Slėpti užrakintus kanalus",
+ modal_allowed: "Leidžiama",
+ modal_denied: "Paneigta"
+ };
+ case "nl": // Dutch
+ return {
+ context_changeorder: "Wijzig de volgorde van verborgen kanalen",
+ context_changeorder_bottom: "Native categorie onderaan",
+ context_changeorder_native: "Native categorie in de juiste volgorde",
+ context_channelaccess: "Kanaaltoegang",
+ context_hidehidden: "Verberg vergrendelde kanalen",
+ modal_allowed: "Toegestaan",
+ modal_denied: "Geweigerd"
+ };
+ case "no": // Norwegian
+ return {
+ context_changeorder: "Endre rekkefølgen på skjulte kanaler",
+ context_changeorder_bottom: "Innfødt kategori nederst",
+ context_changeorder_native: "Innfødt kategori i riktig rekkefølge",
+ context_channelaccess: "Kanaltilgang",
+ context_hidehidden: "Skjul låste kanaler",
+ modal_allowed: "Tillatt",
+ modal_denied: "Nektet"
+ };
+ case "pl": // Polish
+ return {
+ context_changeorder: "Zmień kolejność ukrytych kanałów",
+ context_changeorder_bottom: "Kategoria natywna na dole",
+ context_changeorder_native: "Kategoria natywna we właściwej kolejności",
+ context_channelaccess: "Dostęp do kanałów",
+ context_hidehidden: "Ukryj zablokowane kanały",
+ modal_allowed: "Dozwolony",
+ modal_denied: "Odmówiono"
+ };
+ case "pt-BR": // Portuguese (Brazil)
+ return {
+ context_changeorder: "Alterar a ordem dos canais ocultos",
+ context_changeorder_bottom: "Categoria nativa na parte inferior",
+ context_changeorder_native: "Categoria nativa na ordem correta",
+ context_channelaccess: "Acesso ao canal",
+ context_hidehidden: "Ocultar canais bloqueados",
+ modal_allowed: "Permitido",
+ modal_denied: "Negado"
+ };
+ case "ro": // Romanian
+ return {
+ context_changeorder: "Schimbați comanda canalelor ascunse",
+ context_changeorder_bottom: "Categorie nativă în partea de jos",
+ context_changeorder_native: "Categorie nativă în ordine corectă",
+ context_channelaccess: "Acces la canal",
+ context_hidehidden: "Ascundeți canalele blocate",
+ modal_allowed: "Permis",
+ modal_denied: "Negat"
+ };
+ case "ru": // Russian
+ return {
+ context_changeorder: "Изменить порядок скрытых каналов",
+ context_changeorder_bottom: "Родная категория внизу",
+ context_changeorder_native: "Собственная категория в правильном порядке",
+ context_channelaccess: "Доступ к каналу",
+ context_hidehidden: "Скрыть заблокированные каналы",
+ modal_allowed: "Разрешенный",
+ modal_denied: "Отказано"
+ };
+ case "sv": // Swedish
+ return {
+ context_changeorder: "Ändra ordning för dolda kanaler",
+ context_changeorder_bottom: "Naturlig kategori längst ner",
+ context_changeorder_native: "Naturlig kategori i rätt ordning",
+ context_channelaccess: "Kanaltillgång",
+ context_hidehidden: "Dölj låsta kanaler",
+ modal_allowed: "Tillåtet",
+ modal_denied: "Förnekad"
+ };
+ case "th": // Thai
+ return {
+ context_changeorder: "เปลี่ยนลำดับช่องที่ซ่อนอยู่",
+ context_changeorder_bottom: "หมวดหมู่ดั้งเดิมที่ด้านล่าง",
+ context_changeorder_native: "หมวดหมู่ดั้งเดิมในลำดับที่ถูกต้อง",
+ context_channelaccess: "การเข้าถึงช่อง",
+ context_hidehidden: "ซ่อนช่องที่ถูกล็อก",
+ modal_allowed: "ได้รับอนุญาต",
+ modal_denied: "ถูกปฏิเสธ"
+ };
+ case "tr": // Turkish
+ return {
+ context_changeorder: "Gizli Kanal Sırasını Değiştir",
+ context_changeorder_bottom: "Altta Yerel Kategori",
+ context_changeorder_native: "Yerel Kategori doğru sırada",
+ context_channelaccess: "Kanal Erişimi",
+ context_hidehidden: "Kilitli Kanalları Gizle",
+ modal_allowed: "İzin veriliyor",
+ modal_denied: "Reddedildi"
+ };
+ case "uk": // Ukrainian
+ return {
+ context_changeorder: "Змінити порядок прихованих каналів",
+ context_changeorder_bottom: "Рідна категорія внизу",
+ context_changeorder_native: "Рідна категорія в правильному порядку",
+ context_channelaccess: "Доступ до каналу",
+ context_hidehidden: "Сховати заблоковані канали",
+ modal_allowed: "Дозволено",
+ modal_denied: "Заперечується"
+ };
+ case "vi": // Vietnamese
+ return {
+ context_changeorder: "Thay đổi thứ tự các kênh bị ẩn",
+ context_changeorder_bottom: "Danh mục Gốc ở dưới cùng",
+ context_changeorder_native: "Danh mục gốc theo đúng thứ tự",
+ context_channelaccess: "Quyền truy cập kênh",
+ context_hidehidden: "Ẩn các kênh đã khóa",
+ modal_allowed: "Được phép",
+ modal_denied: "Phủ định"
+ };
+ case "zh-CN": // Chinese (China)
+ return {
+ context_changeorder: "更改隐藏频道顺序",
+ context_changeorder_bottom: "底部的原生类别",
+ context_changeorder_native: "正确顺序的本地类别",
+ context_channelaccess: "频道访问",
+ context_hidehidden: "隐藏锁定的频道",
+ modal_allowed: "允许的",
+ modal_denied: "被拒绝"
+ };
+ case "zh-TW": // Chinese (Taiwan)
+ return {
+ context_changeorder: "更改隱藏頻道順序",
+ context_changeorder_bottom: "底部的原生類別",
+ context_changeorder_native: "正確順序的本地類別",
+ context_channelaccess: "頻道訪問",
+ context_hidehidden: "隱藏鎖定的頻道",
+ modal_allowed: "允許的",
+ modal_denied: "被拒絕"
+ };
+ default: // English
+ return {
+ context_changeorder: "Change Hidden Channels Order",
+ context_changeorder_bottom: "Native Category at the bottom",
+ context_changeorder_native: "Native Category in correct Order",
+ context_channelaccess: "Channel Access",
+ context_hidehidden: "Hide Locked Channels",
+ modal_allowed: "Permitted",
+ modal_denied: "Denied"
+ };
+ }
+ }
+ };
+ })(window.BDFDB_Global.PluginUtils.buildPlugin(config));
+})();
diff --git a/.config/BetterDiscord/themes/Nocturnal.theme.css b/.config/BetterDiscord/themes/Nocturnal.theme.css
new file mode 100644
index 0000000..b0ccec8
--- /dev/null
+++ b/.config/BetterDiscord/themes/Nocturnal.theme.css
@@ -0,0 +1,17 @@
+/**
+* @name Nocturnal
+* @version Auto Update
+* @description Generated by Spectra's Theme editor - Based on the Nocturnal theme
+* @author Spectra
+* @invite PZdnCVD
+* @Source https://github.com/codedotspectra/themes
+* @website https://betterdiscord.app/theme/Nocturnal
+*/
+@import url("https://codedotspectra.github.io/themes/themes-cores/nocturnal.css");
+:root {
+--mainColor: #7AA2F7FF;
+--backgroundColor01: #1A1B26FF;
+--backgroundColor02: #16161DFF;
+--gradientColor01: #8970B4FF;
+--gradientColor02: #7AA2F7FF;
+}
\ No newline at end of file
diff --git a/.config/i3/config b/.config/i3/config
index 02de40f..e0de4f0 100644
--- a/.config/i3/config
+++ b/.config/i3/config
@@ -19,11 +19,9 @@
# Borders
# Also removes all title bars
- for_window [class="^.*"] border pixel 4
- default_border pixel 4
-
- # Floating windows get no borders >:(
- default_floating_border pixel 4
+ for_window [class="^.*"] border pixel 6
+ default_border pixel 6
+ default_floating_border pixel 6
# Hide borders at the edge of the screen
hide_edge_borders smart
diff --git a/.config/spicetify/Themes/Base/color.ini b/.config/spicetify/Themes/Base/color.ini
new file mode 100644
index 0000000..7ffb17b
--- /dev/null
+++ b/.config/spicetify/Themes/Base/color.ini
@@ -0,0 +1,41 @@
+[Base]
+; button = playlist buttons bg in sidebar, drop-down menus, now playing song, like button
+button = 364A82
+; sidebar = sidebar bg
+sidebar = 16161e
+; player = player bg
+player = 16161e
+; main = main field or main bg
+main = 1a1b26
+; button-active = hover on song selected
+button-active = 7aa2f7
+; text = main text, playlist names in main field, name of playlist selected in sidebar, headings
+text = c0caf5
+; subtext = text in main buttons in sidebar, playlist names in sidebar, artist names, and mini infos
+subtext = 9aa5ce
+; button-text = text in main buttons in sidebar when active
+button-text = 8c4351
+; card = card bg
+card = 364A82
+; shadow = bg of buttons like account, pop-up lyrics, full app display in main field
+shadow = 364A82
+; selected-row = bg color of the song selected
+selected-row = 565f89
+; sub-button = download and options button
+sub-button = 8c4351
+; button-disabled = seekbar bg, volume bar bg, scrollbar
+button-disabled = 364A82
+; sidebar-button = sidebar buttons bg
+sidebar-button = 8c4351
+; play-button = color of main play button in main field
+play-button = 8c4351
+; tab-active = button bg in main field (playlists, podcasts, artists, albums)
+tab-active = 7aa2f7
+; notification = notification ('Added to liked songs' etc.)
+notification = 8f5e15
+; notification-error = error
+notification-error = 8c4351
+; playback-bar = seekbar fg, main play/pause button bg
+playback-bar = 8c4351
+; misc = miscellaneous
+misc = 7dcfff
\ No newline at end of file
diff --git a/.config/spicetify/Themes/Base/user.css b/.config/spicetify/Themes/Base/user.css
new file mode 100644
index 0000000..1175b25
--- /dev/null
+++ b/.config/spicetify/Themes/Base/user.css
@@ -0,0 +1,191 @@
+* {
+ font-family: Montserrat;
+}
+
+/* Page titles */
+h1 {
+ font-weight: 700 !important;
+}
+
+/* Song name in player */
+.main-nowPlayingWidget-nowPlaying .main-trackInfo-name {
+ overflow: unset;
+ font-size: 20px !important;
+}
+
+/* Artist name in player */
+.main-nowPlayingWidget-nowPlaying .main-trackInfo-artists {
+ overflow: unset;
+ padding-top: 5px;
+ font-size: 15px;
+}
+
+.main-type-finale {
+ line-height: 17px;
+}
+
+/* Icons */
+.Svg-ulyrgf-0,
+.main-trackList-rowPlayPauseIcon {
+ transform: scale(1.3);
+}
+
+.x-downloadButton-button svg {
+ height: 32px;
+ width: 32px;
+}
+
+/* Progress and remaining time */
+.main-playbackBarRemainingTime-container,
+.playback-bar__progress-time {
+ font-size: 15px;
+ margin-left: 5px;
+ margin-right: 5px;
+}
+
+/* Player play button */
+.main-playPauseButton-button {
+ background-color: unset;
+ color: var(--spice-subtext);
+}
+
+.main-playPauseButton-button svg {
+ height: 28px;
+ width: 28px;
+}
+
+/* Progress bar */
+.progress-bar {
+ --fg-color: var(--spice-button);
+}
+
+.progress-bar__bg,
+.progress-bar__fg,
+.progress-bar__fg_wrapper {
+ height: 5px;
+}
+
+.progress-bar-wrapper {
+ margin-left: 5px;
+ margin-right: 5px;
+}
+
+/* Extra controls */
+.control-button::before {
+ font-size: 20px;
+}
+
+.ExtraControls svg {
+ height: 20px;
+ width: 20px;
+}
+
+/* Removing gradients */
+.main-entityHeader-backgroundColor,
+.main-actionBarBackground-background {
+ background-color: unset !important;
+ background-image: none;
+}
+
+/* Cover shadow */
+.main-entityHeader-shadow {
+ -webkit-box-shadow: 0 4px 20px rgba(var(--spice-rgb-shadow), 0.5);
+ box-shadow: 0 4px 20px rgba(var(--spice-rgb-shadow), 0.5);
+}
+
+/* Top bar */
+.main-topBar-background {
+ background-color: #1a1b26 !important;
+}
+
+/* Playing icon */
+.main-trackList-playingIcon {
+ filter: saturate(0%);
+}
+
+/* Playlist like button */
+.main-actionBar-ActionBarRow .main-addButton-button .Svg-ulyrgf-0 {
+ height: unset;
+ width: unset;
+}
+
+/* Order button */
+.x-sortBox-sortDropdown {
+ margin-top: 3px;
+}
+
+/* Sidebar playlists menu */
+.main-rootlist-rootlistDividerGradient {
+ background: unset;
+}
+
+.main-rootlist-rootlistDivider {
+ background-color: var(--spice-button);
+}
+
+/* Search box */
+.x-searchInput-searchInputInput {
+ font-size: 18px;
+}
+
+/* Aritsts names */
+.main-type-mesto {
+ font-size: 16px;
+ line-height: 20px;
+}
+
+/* Songs names */
+.main-type-ballad {
+ font-size: 18px;
+}
+
+/* Cards descriptions */
+.main-cardSubHeader-root {
+ overflow: hidden !important;
+}
+
+/* Ad title */
+.desktoproutes-homepage-takeover-ad-hptoNativeOriginal-header {
+ font-weight: 700 !important;
+}
+
+/* Friends names */
+.main-buddyFeed-username a {
+ color: var(--spice-text) !important;
+ font-size: 17px;
+ font-weight: 500;
+}
+
+/* Friends songs and artists */
+.main-buddyFeed-artistAndTrackName a,
+.main-buddyFeed-playbackContextLink span {
+ font-size: 13px;
+}
+
+/* Cover height */
+.main-coverSlotExpanded-container {
+ height: var(--nav-bar-width) + 8px;
+}
+
+/* Scrollbars */
+.os-scrollbar-handle {
+ background: var(--spice-button) !important;
+ border-radius: 8px;
+}
+
+/* Making index column wider so that lighter background that
+highlights selected song contains multi-digit song numbers */
+/* It looks good up to 4 digits, I figured that no one has playlists with more music than that ;) */
+.main-trackList-trackList.main-trackList-indexable .main-trackList-trackListRowGrid {
+ grid-template-columns: [index] 48px [first] 6fr [var1] 4fr [var2] 3fr [last] minmax(120px, 1fr) !important;
+}
+
+/* Text boxes in settings */
+.main-dropDown-dropDown {
+ background-color: var(--spice-button-disabled);
+}
+
+/* Facebook button */
+.x-settings-facebookButton {
+ background-color: unset !important;
+}
diff --git a/.config/sway/config b/.config/sway/config
index addaf0c..8e4a372 100644
--- a/.config/sway/config
+++ b/.config/sway/config
@@ -27,11 +27,9 @@
# Borders
# Also removes all title bars
- for_window [class="^.*"] border pixel 4
- default_border pixel 4
-
- # Floating windows get no borders >:(
- default_floating_border pixel 4
+ for_window [class="^.*"] border pixel 6
+ default_border pixel 6
+ default_floating_border pixel 6
# Hide borders at the edge of the screen
hide_edge_borders smart
@@ -300,7 +298,7 @@
exec code &
exec discord &
exec spotify &
- exec ario &
+ #exec ario &
exec gimp &
exec bitwarden &
exec thunderbird &
diff --git a/.config/waybar/style.css b/.config/waybar/style.css
index 69bb256..a7ad719 100644
--- a/.config/waybar/style.css
+++ b/.config/waybar/style.css
@@ -30,12 +30,12 @@ window#waybar {
}
#workspaces button.visible {
- color: #343b58;
+ color: #364A82;
}
#workspaces button.focused {
- border-top: 3px solid #343b58;
- border-bottom: 3px solid #343b58;
+ border-top: 3px solid #7aa2f7;
+ border-bottom: 3px solid #7aa2f7;
}
#workspaces button.urgent {
@@ -45,14 +45,14 @@ window#waybar {
#workspaces button:hover {
box-shadow: inherit;
- border-color: #34548a;
- color: #364A82;
+ border-color: #7dcfff;
+ color: #7dcfff;
}
/* Repeat style here to ensure properties are overwritten as there's no !important and button:hover above resets the colour */
#workspaces button.focused {
- color: #343b58;
+ color: #7aa2f7;
}
#pulseaudio {
@@ -62,7 +62,7 @@ window#waybar {
#custom-recorder {
font-size: 18px;
margin: 2px 7px 0px 7px;
- color:rgba(238, 46, 36, 1);
+ color:#ee2e24;
}
#tray,
diff --git a/.gtkrc-2.0 b/.gtkrc-2.0
index b957a3c..483fa48 100644
--- a/.gtkrc-2.0
+++ b/.gtkrc-2.0
@@ -1,14 +1,18 @@
-# -- THEME AUTO-WRITTEN DO NOT EDIT
-include "/usr/share/themes/UltimateBlack-0.1/gtk-2.0/gtkrc"
-
-style "user-font" {
- font_name = "Cantarell 11"
-}
-
-widget_class "*" style "user-font"
+# DO NOT EDIT! This file will be overwritten by LXAppearance.
+# Any customization should be done in ~/.gtkrc-2.0.mine instead.
+include "/home/marco/.gtkrc-2.0.mine"
+gtk-theme-name="UltimateBlack-0.1"
+gtk-icon-theme-name="Blueberry-Numix-2021"
gtk-font-name="Cantarell 11"
-
-include "/home/marco/.gtkrc.mine"
-
-# -- THEME AUTO-WRITTEN DO NOT EDIT
+gtk-cursor-theme-name="volantes_cursors"
+gtk-cursor-theme-size=0
+gtk-toolbar-style=GTK_TOOLBAR_BOTH
+gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
+gtk-button-images=1
+gtk-menu-images=1
+gtk-enable-event-sounds=1
+gtk-enable-input-feedback-sounds=1
+gtk-xft-antialias=1
+gtk-xft-hinting=1
+gtk-xft-hintstyle="hintfull"