util.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package main
  2. import (
  3. "sort"
  4. "github.com/ayntgl/discordgo"
  5. "github.com/ayntgl/discordo/util"
  6. "github.com/rivo/tview"
  7. )
  8. func createPrivateChannels(n *tview.TreeNode) {
  9. cs := session.State.PrivateChannels
  10. sort.Slice(cs, func(i, j int) bool {
  11. return cs[i].LastMessageID > cs[j].LastMessageID
  12. })
  13. for _, c := range cs {
  14. var tag string
  15. if util.ChannelIsUnread(session.State, c) {
  16. tag = "[::b]"
  17. } else {
  18. tag = "[::d]"
  19. }
  20. cn := tview.NewTreeNode(tag + util.ChannelToString(c) + "[::-]").
  21. SetReference(c.ID)
  22. n.AddChild(cn)
  23. }
  24. }
  25. func createGuilds(n *tview.TreeNode) {
  26. gs := session.State.Guilds
  27. sort.Slice(gs, func(a, b int) bool {
  28. found := false
  29. for _, gID := range session.State.Settings.GuildPositions {
  30. if found {
  31. if gID == gs[b].ID {
  32. return true
  33. }
  34. } else {
  35. if gID == gs[a].ID {
  36. found = true
  37. }
  38. }
  39. }
  40. return false
  41. })
  42. for _, g := range gs {
  43. gn := tview.NewTreeNode(g.Name).Collapse()
  44. n.AddChild(gn)
  45. cs := g.Channels
  46. sort.Slice(cs, func(i, j int) bool {
  47. return cs[i].Position < cs[j].Position
  48. })
  49. // Top-level channels
  50. createTopLevelChannelsTreeNodes(gn, cs)
  51. // Category channels
  52. createCategoryChannelsTreeNodes(gn, cs)
  53. // Second-level channels
  54. createSecondLevelChannelsTreeNodes(cs)
  55. }
  56. }
  57. func createTopLevelChannelsTreeNodes(
  58. n *tview.TreeNode,
  59. cs []*discordgo.Channel,
  60. ) {
  61. for _, c := range cs {
  62. if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) &&
  63. (c.ParentID == "") {
  64. p, err := session.State.UserChannelPermissions(session.State.User.ID, c.ID)
  65. if err != nil || p&discordgo.PermissionViewChannel != discordgo.PermissionViewChannel {
  66. continue
  67. }
  68. var tag string
  69. if util.ChannelIsUnread(session.State, c) {
  70. tag = "[::b]"
  71. } else {
  72. tag = "[::d]"
  73. }
  74. cn := tview.NewTreeNode(tag + util.ChannelToString(c) + "[::-]").
  75. SetReference(c.ID)
  76. n.AddChild(cn)
  77. continue
  78. }
  79. }
  80. }
  81. func createCategoryChannelsTreeNodes(
  82. n *tview.TreeNode,
  83. cs []*discordgo.Channel,
  84. ) {
  85. CategoryLoop:
  86. for _, c := range cs {
  87. if c.Type == discordgo.ChannelTypeGuildCategory {
  88. p, err := session.State.UserChannelPermissions(session.State.User.ID, c.ID)
  89. if err != nil || p&discordgo.PermissionViewChannel != discordgo.PermissionViewChannel {
  90. continue
  91. }
  92. for _, child := range cs {
  93. if child.ParentID == c.ID {
  94. cn := tview.NewTreeNode(c.Name).
  95. SetReference(c.ID)
  96. n.AddChild(cn)
  97. continue CategoryLoop
  98. }
  99. }
  100. cn := tview.NewTreeNode(c.Name).
  101. SetReference(c.ID)
  102. n.AddChild(cn)
  103. }
  104. }
  105. }
  106. func createSecondLevelChannelsTreeNodes(cs []*discordgo.Channel) {
  107. for _, c := range cs {
  108. if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) &&
  109. (c.ParentID != "") {
  110. p, err := session.State.UserChannelPermissions(session.State.User.ID, c.ID)
  111. if err != nil || p&discordgo.PermissionViewChannel != discordgo.PermissionViewChannel {
  112. continue
  113. }
  114. var tag string
  115. if util.ChannelIsUnread(session.State, c) {
  116. tag = "[::b]"
  117. } else {
  118. tag = "[::d]"
  119. }
  120. pn := util.GetTreeNodeByReference(channelsTree, c.ParentID)
  121. if pn != nil {
  122. cn := tview.NewTreeNode(tag + util.ChannelToString(c) + "[::-]").
  123. SetReference(c.ID)
  124. pn.AddChild(cn)
  125. }
  126. }
  127. }
  128. }