guilds.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package ui
  2. import (
  3. "sort"
  4. "github.com/ayntgl/discordgo"
  5. "github.com/ayntgl/discordo/discord"
  6. "github.com/rivo/tview"
  7. )
  8. type GuildsList struct {
  9. *tview.List
  10. app *App
  11. }
  12. func NewGuildsList(app *App) *GuildsList {
  13. gl := &GuildsList{
  14. List: tview.NewList(),
  15. app: app,
  16. }
  17. gl.ShowSecondaryText(false)
  18. gl.SetTitle("Guilds")
  19. gl.SetTitleAlign(tview.AlignLeft)
  20. gl.SetBorder(true)
  21. gl.SetBorderPadding(0, 0, 1, 1)
  22. gl.SetSelectedFunc(gl.onSelected)
  23. return gl
  24. }
  25. func (gl *GuildsList) onSelected(idx int, mainText string, secondaryText string, shortcut rune) {
  26. rootTreeNode := gl.app.ChannelsTreeView.GetRoot()
  27. rootTreeNode.ClearChildren()
  28. gl.app.SelectedMessage = -1
  29. gl.app.MessagesTextView.
  30. Highlight().
  31. Clear()
  32. gl.app.MessageInputField.SetText("")
  33. // If the user is a bot account, the direct messages item does not exist in the guilds list.
  34. if gl.app.Session.State.User.Bot && idx == 0 {
  35. idx = 1
  36. }
  37. if idx == 0 { // Direct Messages
  38. cs := gl.app.Session.State.PrivateChannels
  39. sort.Slice(cs, func(i, j int) bool {
  40. return cs[i].LastMessageID > cs[j].LastMessageID
  41. })
  42. for _, c := range cs {
  43. channelTreeNode := tview.NewTreeNode(discord.ChannelToString(c)).
  44. SetReference(c.ID)
  45. rootTreeNode.AddChild(channelTreeNode)
  46. }
  47. } else { // Guild
  48. cs := gl.app.Session.State.Guilds[idx-1].Channels
  49. sort.Slice(cs, func(i, j int) bool {
  50. return cs[i].Position < cs[j].Position
  51. })
  52. for _, c := range cs {
  53. if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) && (c.ParentID == "") {
  54. channelTreeNode := tview.NewTreeNode(discord.ChannelToString(c)).
  55. SetReference(c.ID)
  56. rootTreeNode.AddChild(channelTreeNode)
  57. }
  58. }
  59. CATEGORY:
  60. for _, c := range cs {
  61. if c.Type == discordgo.ChannelTypeGuildCategory {
  62. for _, nestedChannel := range cs {
  63. if nestedChannel.ParentID == c.ID {
  64. channelTreeNode := tview.NewTreeNode(c.Name).
  65. SetReference(c.ID)
  66. rootTreeNode.AddChild(channelTreeNode)
  67. continue CATEGORY
  68. }
  69. }
  70. channelTreeNode := tview.NewTreeNode(c.Name).
  71. SetReference(c.ID)
  72. rootTreeNode.AddChild(channelTreeNode)
  73. }
  74. }
  75. for _, c := range cs {
  76. if (c.Type == discordgo.ChannelTypeGuildText || c.Type == discordgo.ChannelTypeGuildNews) && (c.ParentID != "") {
  77. var parentTreeNode *tview.TreeNode
  78. rootTreeNode.Walk(func(node, _ *tview.TreeNode) bool {
  79. if node.GetReference() == c.ParentID {
  80. parentTreeNode = node
  81. return false
  82. }
  83. return true
  84. })
  85. if parentTreeNode != nil {
  86. channelTreeNode := tview.NewTreeNode(discord.ChannelToString(c)).
  87. SetReference(c.ID)
  88. parentTreeNode.AddChild(channelTreeNode)
  89. }
  90. }
  91. }
  92. }
  93. gl.app.ChannelsTreeView.SetCurrentNode(rootTreeNode)
  94. gl.app.SetFocus(gl.app.ChannelsTreeView)
  95. }