Просмотр исходного кода

Hide non-permissible channels from channels TreeView (#35)

* Add discord.HasPermission()

* Exclude disallowed channels from TreeView

* Update README preview
rigormorrtiss 4 лет назад
Родитель
Сommit
04b6ddc599
4 измененных файлов с 49 добавлено и 22 удалено
  1. BIN
      .github/preview.png
  2. 3 19
      discordo.go
  3. 36 3
      ui/treeviews.go
  4. 10 0
      util/discord.go

BIN
.github/preview.png


+ 3 - 19
discordo.go

@@ -157,27 +157,11 @@ func onGuildsTreeViewSelected(gn *tview.TreeNode) {
 	rootN := channelsTreeView.GetRoot()
 	rootN.ClearChildren()
 	// Top-level channels
-	ui.CreateTopLevelTreeNodes(rootN, cs)
+	ui.CreateTopLevelChannelsTreeNodes(session.State, rootN, cs)
 	// Category channels
-CategoryLoop:
-	for _, c := range cs {
-		if c.Type == discordgo.ChannelTypeGuildCategory {
-			for _, child := range cs {
-				if child.ParentID == c.ID {
-					cn := tview.NewTreeNode(c.Name).
-						SetReference(c.ID)
-					rootN.AddChild(cn)
-					continue CategoryLoop
-				}
-			}
-
-			cn := tview.NewTreeNode(c.Name).
-				SetReference(c.ID)
-			rootN.AddChild(cn)
-		}
-	}
+	ui.CreateCategoryChannelsTreeNodes(session.State, rootN, cs)
 	// Second-level channels
-	ui.CreateSecondLevelTreeNodes(channelsTreeView, rootN, cs)
+	ui.CreateSecondLevelChannelsTreeNodes(session.State, channelsTreeView, rootN, cs)
 
 	channelsTreeView.SetCurrentNode(rootN)
 }

+ 36 - 3
ui/treeviews.go

@@ -2,6 +2,7 @@ package ui
 
 import (
 	"github.com/rigormorrtiss/discordgo"
+	"github.com/rigormorrtiss/discordo/util"
 	"github.com/rivo/tview"
 )
 
@@ -58,9 +59,13 @@ func GetTreeNodeByReference(r interface{}, treeV *tview.TreeView) (mn *tview.Tre
 }
 
 // CreateTopLevelTreeNodes creates treenodes for the top-level (orphan) channels.
-func CreateTopLevelTreeNodes(rootN *tview.TreeNode, cs []*discordgo.Channel) {
+func CreateTopLevelChannelsTreeNodes(s *discordgo.State, rootN *tview.TreeNode, cs []*discordgo.Channel) {
 	for _, c := range cs {
 		if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) && (c.ParentID == "") {
+			if !util.HasPermission(s, s.User.ID, c.ID, discordgo.PermissionViewChannel) {
+				continue
+			}
+
 			cn := NewTextChannelTreeNode(c)
 			rootN.AddChild(cn)
 			continue
@@ -68,10 +73,38 @@ func CreateTopLevelTreeNodes(rootN *tview.TreeNode, cs []*discordgo.Channel) {
 	}
 }
 
-// CreateSecondLevelTreeNodes creates treenodes for the second-level (category children) channels.
-func CreateSecondLevelTreeNodes(channelsTreeView *tview.TreeView, rootN *tview.TreeNode, cs []*discordgo.Channel) {
+func CreateCategoryChannelsTreeNodes(s *discordgo.State, rootN *tview.TreeNode, cs []*discordgo.Channel) {
+CategoryLoop:
+	for _, c := range cs {
+		if c.Type == discordgo.ChannelTypeGuildCategory {
+			if !util.HasPermission(s, s.User.ID, c.ID, discordgo.PermissionViewChannel) {
+				continue
+			}
+
+			for _, child := range cs {
+				if child.ParentID == c.ID {
+					cn := tview.NewTreeNode(c.Name).
+						SetReference(c.ID)
+					rootN.AddChild(cn)
+					continue CategoryLoop
+				}
+			}
+
+			cn := tview.NewTreeNode(c.Name).
+				SetReference(c.ID)
+			rootN.AddChild(cn)
+		}
+	}
+}
+
+// CreateSecondLevelChannelsTreeNodes creates treenodes for the second-level (category children) channels.
+func CreateSecondLevelChannelsTreeNodes(s *discordgo.State, channelsTreeView *tview.TreeView, rootN *tview.TreeNode, cs []*discordgo.Channel) {
 	for _, c := range cs {
 		if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) && (c.ParentID != "") {
+			if !util.HasPermission(s, s.User.ID, c.ID, discordgo.PermissionViewChannel) {
+				continue
+			}
+
 			if pn := GetTreeNodeByReference(c.ParentID, channelsTreeView); pn != nil {
 				cn := NewTextChannelTreeNode(c)
 				pn.AddChild(cn)

+ 10 - 0
util/discord.go

@@ -181,3 +181,13 @@ func TOTP(s *discordgo.Session, code, ticket string) (*loginResponse, error) {
 
 	return lr, nil
 }
+
+// HasPermission returns a boolean representing whether the provided user has given permissions or not.
+func HasPermission(s *discordgo.State, uID string, cID string, perm int64) bool {
+	p, err := s.UserChannelPermissions(uID, cID)
+	if err != nil {
+		return false
+	}
+
+	return p&perm == perm
+}