guilds.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package ui
  2. import (
  3. "github.com/bwmarrin/discordgo"
  4. "github.com/rivo/tview"
  5. )
  6. // NewGuildsWidget creates and returns a new guilds widget.
  7. func NewGuildsWidget() *tview.TreeView {
  8. w := tview.NewTreeView()
  9. w.
  10. SetTopLevel(1).
  11. SetRoot(tview.NewTreeNode("")).
  12. SetBorder(true).
  13. SetBorderPadding(0, 0, 1, 0).
  14. SetTitle("Guilds").
  15. SetTitleAlign(tview.AlignLeft)
  16. return w
  17. }
  18. // NewTextChannelTreeNode creates and returns a new text channel treenode.
  19. func NewTextChannelTreeNode(c *discordgo.Channel) *tview.TreeNode {
  20. n := tview.NewTreeNode("[::d]#" + c.Name + "[::-]").
  21. SetReference(c.ID)
  22. return n
  23. }
  24. // GetTreeNodeByReference gets the TreeNode that has reference r from the given
  25. // treeview.
  26. func GetTreeNodeByReference(
  27. r interface{},
  28. treeV *tview.TreeView,
  29. ) (mn *tview.TreeNode) {
  30. treeV.GetRoot().Walk(func(n, _ *tview.TreeNode) bool {
  31. if n.GetReference() == r {
  32. mn = n
  33. return false
  34. }
  35. return true
  36. })
  37. return
  38. }
  39. // CreateTopLevelChannelsTreeNodes creates TreeNodes for the top-level (orphan)
  40. // channels.
  41. func CreateTopLevelChannelsTreeNodes(
  42. s *discordgo.State,
  43. n *tview.TreeNode,
  44. cs []*discordgo.Channel,
  45. ) {
  46. for _, c := range cs {
  47. if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) &&
  48. (c.ParentID == "") {
  49. if p, err := s.UserChannelPermissions(s.User.ID, c.ID); err != nil || p&discordgo.PermissionViewChannel != discordgo.PermissionViewChannel {
  50. continue
  51. }
  52. cn := NewTextChannelTreeNode(c)
  53. n.AddChild(cn)
  54. continue
  55. }
  56. }
  57. }
  58. // CreateCategoryChannelsTreeNodes creates TreeNodes for the category (parent)
  59. // channels.
  60. func CreateCategoryChannelsTreeNodes(
  61. s *discordgo.State,
  62. n *tview.TreeNode,
  63. cs []*discordgo.Channel,
  64. ) {
  65. CategoryLoop:
  66. for _, c := range cs {
  67. if c.Type == discordgo.ChannelTypeGuildCategory {
  68. if p, err := s.UserChannelPermissions(s.User.ID, c.ID); err != nil || p&discordgo.PermissionViewChannel != discordgo.PermissionViewChannel {
  69. continue
  70. }
  71. for _, child := range cs {
  72. if child.ParentID == c.ID {
  73. cn := tview.NewTreeNode(c.Name).
  74. SetReference(c.ID)
  75. n.AddChild(cn)
  76. continue CategoryLoop
  77. }
  78. }
  79. cn := tview.NewTreeNode(c.Name).
  80. SetReference(c.ID)
  81. n.AddChild(cn)
  82. }
  83. }
  84. }
  85. // CreateSecondLevelChannelsTreeNodes creates TreeNodes for the second-level
  86. // (category children) channels.
  87. func CreateSecondLevelChannelsTreeNodes(
  88. s *discordgo.State,
  89. treeV *tview.TreeView,
  90. cs []*discordgo.Channel,
  91. ) {
  92. for _, c := range cs {
  93. if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) &&
  94. (c.ParentID != "") {
  95. if p, err := s.UserChannelPermissions(s.User.ID, c.ID); err != nil || p&discordgo.PermissionViewChannel != discordgo.PermissionViewChannel {
  96. continue
  97. }
  98. if pn := GetTreeNodeByReference(c.ParentID, treeV); pn != nil {
  99. cn := NewTextChannelTreeNode(c)
  100. pn.AddChild(cn)
  101. }
  102. }
  103. }
  104. }