From 3a2f383d5ce8f20d9517fcdf3be811f62fa50a70 Mon Sep 17 00:00:00 2001 From: cyberme0w Date: Sun, 17 Mar 2024 10:51:54 +0000 Subject: [PATCH] Fix hidden category/channel bug (#369) Co-authored-by: Ayyan <119342035+ayn2op@users.noreply.github.com> --- cmd/guilds_tree.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/cmd/guilds_tree.go b/cmd/guilds_tree.go index 346441a..212d462 100644 --- a/cmd/guilds_tree.go +++ b/cmd/guilds_tree.go @@ -108,7 +108,8 @@ func (gt *GuildsTree) channelToString(c discord.Channel) string { } func (gt *GuildsTree) createChannelNode(n *tview.TreeNode, c discord.Channel) { - if c.Type != discord.DirectMessage && c.Type != discord.GroupDM { + // If c is a regular channel, abort if user does not have view permission + if c.Type != discord.DirectMessage && c.Type != discord.GroupDM && c.Type != discord.GuildCategory { ps, err := discordState.Permissions(c.ID, discordState.Ready().User.ID) if err != nil { log.Println(err) @@ -126,26 +127,47 @@ func (gt *GuildsTree) createChannelNode(n *tview.TreeNode, c discord.Channel) { } func (gt *GuildsTree) createChannelNodes(n *tview.TreeNode, cs []discord.Channel) { + // Create all top-level, non-category channels for _, c := range cs { if c.Type != discord.GuildCategory && !c.ParentID.IsValid() { gt.createChannelNode(n, c) } } + // Create categories that have child channels, if at least one child channel is visible to the user PARENT_CHANNELS: for _, c := range cs { if c.Type == discord.GuildCategory { for _, nested := range cs { if nested.ParentID == c.ID { - gt.createChannelNode(n, c) - continue PARENT_CHANNELS + ps, err := discordState.Permissions(nested.ID, discordState.Ready().User.ID) + if err != nil { + log.Println(err) + continue + } + if ps.Has(discord.PermissionViewChannel) { + gt.createChannelNode(n, c) + continue PARENT_CHANNELS + } } } } } + // Create category-channels if user has view channel permission for _, c := range cs { if c.ParentID.IsValid() { + // Check if user has view permission for this channel (if not, we don't need to look for the parent) + ps, err := discordState.Permissions(c.ID, discordState.Ready().User.ID) + if err != nil { + log.Println(err) + continue + } + if !ps.Has(discord.PermissionViewChannel) { + continue + } + + // Get parent reference if it exists var parent *tview.TreeNode n.Walk(func(node, _ *tview.TreeNode) bool { if node.GetReference() == c.ParentID {