guilds.go 2.9 KB

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