From 30dd4b9e0128d9fed81bc64050d67b350d462396 Mon Sep 17 00:00:00 2001 From: Nico Date: Mon, 24 Oct 2022 23:22:39 +0200 Subject: [PATCH] [ShowHiddenChannels] Add last message info, fix collapsing (#146) Co-authored-by: Snek <107999380+sneksnake@users.noreply.github.com> --- src/plugins/showHiddenChannels.tsx | 75 ++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/src/plugins/showHiddenChannels.tsx b/src/plugins/showHiddenChannels.tsx index 9415900a..25a2b544 100644 --- a/src/plugins/showHiddenChannels.tsx +++ b/src/plugins/showHiddenChannels.tsx @@ -23,6 +23,7 @@ import { Settings } from "../Vencord"; import { waitFor } from "../webpack"; import { Button, ChannelStore, Text } from "../webpack/common"; +const CONNECT = 1048576n; const VIEW_CHANNEL = 1024n; let can = (permission, channel) => true; @@ -39,7 +40,11 @@ export default definePlugin({ { name: "Average React Enjoyer", id: 1004904120056029256n - } + }, + { + name: "D3SOX", + id: 201052085641281538n + }, ], options: { hideUnreads: { @@ -55,11 +60,11 @@ export default definePlugin({ find: ".CannotShow", replacement: { match: /renderLevel:(\w+)\.CannotShow/g, - replace: "renderLevel:$1.Show" + replace: "renderLevel:Vencord.Plugins.plugins.ShowHiddenChannels.shouldShow(this.record, this.category, this.isMuted) ? $1.Show : $1.CannotShow" } }, { - // This is where the logic that chooses the icon is, we overide it to be a locked voice channel if it's hidden + // This is where the logic that chooses the icon is, we override 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, @@ -67,15 +72,31 @@ export default definePlugin({ } }, { - find: "selectChannel:function", - replacement: [ - { - match: /selectChannel:function\((\w)\){/g, - replace: "selectChannel:function($1){if(Vencord.Plugins.plugins.ShowHiddenChannels.channelSelected($1)) return;" - } - ] + // Prevents Discord from trying to fetch message and create a 403 error + find: "fetchMessages:function", + replacement: { + match: /fetchMessages:function\((\w)\){/g, + replace: "fetchMessages:function($1){if(Vencord.Plugins.plugins.ShowHiddenChannels.isHiddenChannel($1)) return;" + } }, { + // Don't switch to the channel if it's hidden, but show a modal instead + find: ".selectGuild(", + replacement: { + match: /(function \w+\(\w\)\{var (\w)=\w+\(\w\);)/g, + replace: "$1if(Vencord.Plugins.plugins.ShowHiddenChannels.channelSelected($2?.params))return;" + } + }, + { + // Prevent categories from disappearing when they're collapsed + find: ".prototype.shouldShowEmptyCategory=function(){", + replacement: { + match: /(\.prototype\.shouldShowEmptyCategory=function\(\){)/g, + replace: "$1return true;" + } + }, + { + // Hide unreads find: "?\"button\":\"link\"", predicate: () => Settings.plugins.ShowHiddenChannels.hideUnreads === true, replacement: { @@ -84,18 +105,33 @@ export default definePlugin({ } } ], + shouldShow(channel, category, isMuted) { + if (!this.isHiddenChannel(channel)) return false; + if (!category) return false; + if (channel.type === 0 && category.guild?.hideMutedChannels && isMuted) return false; + + return !category.isCollapsed; + }, isHiddenChannel(channel) { if (!channel) return false; - channel._isHiddenChannel = !can(VIEW_CHANNEL, channel); + if (channel.channelId) + channel = ChannelStore.getChannel(channel.channelId); + if (!channel || channel.isDM() || channel.isGroupDM() || channel.isMultiUserDM()) + return false; + + // check for disallowed voice channels too so that they get hidden when collapsing the category + channel._isHiddenChannel = !can(VIEW_CHANNEL, channel) || (channel.type === 2 && !can(CONNECT, channel)); return channel._isHiddenChannel; }, channelSelected(channelData) { + if (!channelData) return false; const channel = ChannelStore.getChannel(channelData.channelId); - - if (!channel || channel.isDM() || channel.isGroupDM() || channel.isMultiUserDM()) return false; - + if (!channel) return false; const isHidden = this.isHiddenChannel(channel); - if (isHidden) + // check for type again, otherwise it would show it for hidden stage channels + if (channel.type === 0 && isHidden) { + const lastMessageDate = channel.lastActiveTimestamp ? new Date(channel.lastActiveTimestamp).toLocaleString() : null; + openModal(modalProps => ( @@ -118,6 +154,14 @@ export default definePlugin({ {channel.topic} )} + {lastMessageDate && ( + <> + + Last message sent: + + {lastMessageDate} + + )} @@ -132,6 +176,7 @@ export default definePlugin({ )); + } return isHidden; } });