channels.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package ui
  2. import (
  3. "github.com/diamondburned/arikawa/v3/discord"
  4. "github.com/rivo/tview"
  5. )
  6. type ChannelsTree struct {
  7. *tview.TreeView
  8. app *App
  9. }
  10. func NewChannelsTree(app *App) *ChannelsTree {
  11. ct := &ChannelsTree{
  12. TreeView: tview.NewTreeView(),
  13. app: app,
  14. }
  15. ct.SetRoot(tview.NewTreeNode(""))
  16. ct.SetTopLevel(1)
  17. ct.SetSelectedFunc(ct.onSelected)
  18. ct.SetTitle("Channels")
  19. ct.SetTitleAlign(tview.AlignLeft)
  20. ct.SetBorder(true)
  21. ct.SetBorderPadding(0, 0, 1, 1)
  22. return ct
  23. }
  24. func (ct *ChannelsTree) onSelected(node *tview.TreeNode) {
  25. ct.app.SelectedChannel = nil
  26. ct.app.SelectedMessage = -1
  27. ct.app.MessagesTextView.
  28. Highlight().
  29. Clear().
  30. SetTitle("")
  31. ct.app.MessageInputField.SetText("")
  32. ref := node.GetReference()
  33. c, err := ct.app.State.Cabinet.Channel(ref.(discord.ChannelID))
  34. if err != nil {
  35. return
  36. }
  37. // If the channel is a category channel, expend the selected node if it is not expanded already.
  38. if c.Type == discord.GuildCategory {
  39. node.SetExpanded(!node.IsExpanded())
  40. return
  41. }
  42. ct.app.SelectedChannel = c
  43. ct.app.SetFocus(ct.app.MessageInputField)
  44. title := channelToString(*c)
  45. if c.Topic != "" {
  46. title += " - " + parseMarkdown(c.Topic)
  47. }
  48. ct.app.MessagesTextView.SetTitle(title)
  49. go func() {
  50. // The returned slice will be sorted from latest to oldest.
  51. ms, err := ct.app.State.Messages(c.ID, ct.app.Config.MessagesLimit)
  52. if err != nil {
  53. return
  54. }
  55. for i := len(ms) - 1; i >= 0; i-- {
  56. _, err = ct.app.MessagesTextView.Write(buildMessage(ct.app, ms[i]))
  57. if err != nil {
  58. return
  59. }
  60. }
  61. ct.app.MessagesTextView.ScrollToEnd()
  62. }()
  63. }