Kaynağa Gözat

Ignore inaccessible channels from guilds tree

Closes #254
ayn2op 3 yıl önce
ebeveyn
işleme
43234d4153
1 değiştirilmiş dosya ile 33 ekleme ve 9 silme
  1. 33 9
      guilds_tree.go

+ 33 - 9
guilds_tree.go

@@ -73,12 +73,6 @@ func (gt *GuildsTree) createGuildNode(n *tview.TreeNode, g discord.Guild) {
 	n.AddChild(gn)
 }
 
-func (gt *GuildsTree) createChannelNode(n *tview.TreeNode, c discord.Channel) {
-	cn := tview.NewTreeNode(gt.channelToString(c))
-	cn.SetReference(c.ID)
-	n.AddChild(cn)
-}
-
 func (gt *GuildsTree) channelToString(c discord.Channel) string {
 	var s string
 	switch c.Type {
@@ -113,12 +107,42 @@ func (gt *GuildsTree) channelToString(c discord.Channel) string {
 	return s
 }
 
+func (gt *GuildsTree) createChannelNode(n *tview.TreeNode, c discord.Channel) {
+	ps, err := discordState.Permissions(c.ID, discordState.Ready().User.ID)
+	if err != nil {
+		return
+	}
+
+	if !ps.Has(discord.PermissionViewChannel) {
+		return
+	}
+
+	cn := tview.NewTreeNode(gt.channelToString(c))
+	cn.SetReference(c.ID)
+	n.AddChild(cn)
+}
+
 func (gt *GuildsTree) createChannelNodes(n *tview.TreeNode, cs []discord.Channel) {
 	for _, c := range cs {
-		// If the type of the channel is guild category or if the channel is an orphan channel.
-		if c.Type == discord.GuildCategory || !c.ParentID.IsValid() {
+		if c.Type != discord.GuildCategory && !c.ParentID.IsValid() {
 			gt.createChannelNode(n, c)
-		} else {
+		}
+	}
+
+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
+				}
+			}
+		}
+	}
+
+	for _, c := range cs {
+		if c.ParentID.IsValid() {
 			var parent *tview.TreeNode
 			n.Walk(func(node, _ *tview.TreeNode) bool {
 				if node.GetReference() == c.ParentID {