guilds.go 2.8 KB

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