aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorSnek <107999380+sneksnake@users.noreply.github.com>2022-10-23 11:44:21 +0200
committerGitHub <noreply@github.com>2022-10-23 11:44:21 +0200
commitabbc08fb06df0ab9fcb8b30e42d52cad851025c2 (patch)
tree1b0914df8876c87ee8030f2db25a02039efc41a5 /src/plugins
parent409fb6ff4e32131aa2a7ca5f9733c17d8a69f13f (diff)
downloadVencord-abbc08fb06df0ab9fcb8b30e42d52cad851025c2.tar.gz
Vencord-abbc08fb06df0ab9fcb8b30e42d52cad851025c2.tar.bz2
Vencord-abbc08fb06df0ab9fcb8b30e42d52cad851025c2.zip
feat(plugin): Show Hidden Channels (#101)
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/showHiddenChannels.tsx137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/plugins/showHiddenChannels.tsx b/src/plugins/showHiddenChannels.tsx
new file mode 100644
index 0000000..9415900
--- /dev/null
+++ b/src/plugins/showHiddenChannels.tsx
@@ -0,0 +1,137 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2022 Vendicated and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+
+import { Flex } from "../components/Flex";
+import { ModalContent, ModalFooter, ModalHeader, ModalRoot, ModalSize, openModal } from "../utils/modal";
+import definePlugin, { OptionType } from "../utils/types";
+import { Settings } from "../Vencord";
+import { waitFor } from "../webpack";
+import { Button, ChannelStore, Text } from "../webpack/common";
+
+const VIEW_CHANNEL = 1024n;
+
+let can = (permission, channel) => true;
+waitFor(m => m.can && m.initialize, m => ({ can } = m));
+
+export default definePlugin({
+ name: "ShowHiddenChannels",
+ description: "Show hidden channels",
+ authors: [
+ {
+ name: "BigDuck",
+ id: 1024588272623681609n
+ },
+ {
+ name: "Average React Enjoyer",
+ id: 1004904120056029256n
+ }
+ ],
+ options: {
+ hideUnreads: {
+ description: "Hide unreads",
+ type: OptionType.BOOLEAN,
+ default: true,
+ restartNeeded: true // Restart is needed to refresh channel list
+ }
+ },
+ patches: [
+ {
+ // RenderLevel defines if a channel is hidden, collapsed in category, visible, etc
+ find: ".CannotShow",
+ replacement: {
+ match: /renderLevel:(\w+)\.CannotShow/g,
+ replace: "renderLevel:$1.Show"
+ }
+ },
+ {
+ // This is where the logic that chooses the icon is, we overide it to be a locked voice channel if it's hidden
+ find: ".rulesChannelId))",
+ replacement: {
+ match: /(\w+)\.locked(.*?)switch\((\w+)\.type\)({case \w+\.\w+\.GUILD_ANNOUNCEMENT)/g,
+ replace: "Vencord.Plugins.plugins.ShowHiddenChannels.isHiddenChannel($3)||$1.locked$2switch($3._isHiddenChannel?2:$3.type)$4"
+ }
+ },
+ {
+ find: "selectChannel:function",
+ replacement: [
+ {
+ match: /selectChannel:function\((\w)\){/g,
+ replace: "selectChannel:function($1){if(Vencord.Plugins.plugins.ShowHiddenChannels.channelSelected($1)) return;"
+ }
+ ]
+ },
+ {
+ find: "?\"button\":\"link\"",
+ predicate: () => Settings.plugins.ShowHiddenChannels.hideUnreads === true,
+ replacement: {
+ match: /(\w)\.connected,(\w)=(\w\.unread),(\w=\w\.canHaveDot)/g,
+ replace: "$1.connected,$2=Vencord.Plugins.plugins.ShowHiddenChannels.isHiddenChannel($1.channel)?false:$3,$4"
+ }
+ }
+ ],
+ isHiddenChannel(channel) {
+ if (!channel) return false;
+ channel._isHiddenChannel = !can(VIEW_CHANNEL, channel);
+ return channel._isHiddenChannel;
+ },
+ channelSelected(channelData) {
+ const channel = ChannelStore.getChannel(channelData.channelId);
+
+ if (!channel || channel.isDM() || channel.isGroupDM() || channel.isMultiUserDM()) return false;
+
+ const isHidden = this.isHiddenChannel(channel);
+ if (isHidden)
+ openModal(modalProps => (
+ <ModalRoot size={ModalSize.SMALL} {...modalProps}>
+ <ModalHeader>
+ <Flex>
+ <Text variant="heading-md/bold">{channel.name}</Text>
+ {(channel.isNSFW() && (
+ <Text style={{ backgroundColor: "var(--status-danger)", borderRadius: "8px", paddingLeft: 4, paddingRight: 4 }} variant="heading-md/normal">
+ NSFW
+ </Text>
+ ))}
+ </Flex>
+ </ModalHeader>
+ <ModalContent style={{ marginBottom: 10, marginTop: 10, marginRight: 8, marginLeft: 8 }}>
+ <Text variant="text-md/normal">You don't have the permission to view the messages in this channel.</Text>
+ {(channel.topic || "").length > 0 && (
+ <>
+ <Text variant="text-md/bold" style={{ marginTop: 10 }}>
+ Topic:
+ </Text>
+ <Text variant="code">{channel.topic}</Text>
+ </>
+ )}
+ </ModalContent>
+ <ModalFooter>
+ <Flex>
+ <Button
+ onClick={modalProps.onClose}
+ size={Button.Sizes.SMALL}
+ color={Button.Colors.PRIMARY}
+ >
+ Continue
+ </Button>
+ </Flex>
+ </ModalFooter>
+ </ModalRoot>
+ ));
+ return isHidden;
+ }
+});