discordo/ui/guilds.go
2021-09-15 00:09:50 +04:00

119 lines
2.9 KiB
Go

package ui
import (
"github.com/bwmarrin/discordgo"
"github.com/rivo/tview"
)
// NewGuildsWidget creates and returns a new guilds widget.
func NewGuildsWidget() *tview.TreeView {
w := tview.NewTreeView()
w.
SetTopLevel(1).
SetRoot(tview.NewTreeNode("")).
SetBorder(true).
SetBorderPadding(0, 0, 1, 0).
SetTitle("Guilds").
SetTitleAlign(tview.AlignLeft)
return w
}
// NewTextChannelTreeNode creates and returns a new text channel treenode.
func NewTextChannelTreeNode(c *discordgo.Channel) *tview.TreeNode {
n := tview.NewTreeNode("[::d]#" + c.Name + "[::-]").
SetReference(c.ID)
return n
}
// GetTreeNodeByReference gets the TreeNode that has reference r from the given
// treeview.
func GetTreeNodeByReference(
r interface{},
treeV *tview.TreeView,
) (mn *tview.TreeNode) {
treeV.GetRoot().Walk(func(n, _ *tview.TreeNode) bool {
if n.GetReference() == r {
mn = n
return false
}
return true
})
return
}
// CreateTopLevelChannelsTreeNodes creates TreeNodes for the top-level (orphan)
// channels.
func CreateTopLevelChannelsTreeNodes(
s *discordgo.State,
n *tview.TreeNode,
cs []*discordgo.Channel,
) {
for _, c := range cs {
if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) &&
(c.ParentID == "") {
if p, err := s.UserChannelPermissions(s.User.ID, c.ID); err != nil || p&discordgo.PermissionViewChannel != discordgo.PermissionViewChannel {
continue
}
cn := NewTextChannelTreeNode(c)
n.AddChild(cn)
continue
}
}
}
// CreateCategoryChannelsTreeNodes creates TreeNodes for the category (parent)
// channels.
func CreateCategoryChannelsTreeNodes(
s *discordgo.State,
n *tview.TreeNode,
cs []*discordgo.Channel,
) {
CategoryLoop:
for _, c := range cs {
if c.Type == discordgo.ChannelTypeGuildCategory {
if p, err := s.UserChannelPermissions(s.User.ID, c.ID); err != nil || p&discordgo.PermissionViewChannel != discordgo.PermissionViewChannel {
continue
}
for _, child := range cs {
if child.ParentID == c.ID {
cn := tview.NewTreeNode(c.Name).
SetReference(c.ID)
n.AddChild(cn)
continue CategoryLoop
}
}
cn := tview.NewTreeNode(c.Name).
SetReference(c.ID)
n.AddChild(cn)
}
}
}
// CreateSecondLevelChannelsTreeNodes creates TreeNodes for the second-level
// (category children) channels.
func CreateSecondLevelChannelsTreeNodes(
s *discordgo.State,
treeV *tview.TreeView,
cs []*discordgo.Channel,
) {
for _, c := range cs {
if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) &&
(c.ParentID != "") {
if p, err := s.UserChannelPermissions(s.User.ID, c.ID); err != nil || p&discordgo.PermissionViewChannel != discordgo.PermissionViewChannel {
continue
}
if pn := GetTreeNodeByReference(c.ParentID, treeV); pn != nil {
cn := NewTextChannelTreeNode(c)
pn.AddChild(cn)
}
}
}
}