channels.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package ui
  2. import (
  3. "github.com/ayntgl/astatine"
  4. "github.com/rivo/tview"
  5. )
  6. type ChannelsTreeView struct {
  7. *tview.TreeView
  8. app *App
  9. }
  10. func NewChannelsTreeView(app *App) *ChannelsTreeView {
  11. ctv := &ChannelsTreeView{
  12. TreeView: tview.NewTreeView(),
  13. app: app,
  14. }
  15. ctv.SetTopLevel(1)
  16. ctv.SetRoot(tview.NewTreeNode(""))
  17. ctv.SetTitle("Channels")
  18. ctv.SetTitleAlign(tview.AlignLeft)
  19. ctv.SetBorder(true)
  20. ctv.SetBorderPadding(0, 0, 1, 1)
  21. ctv.SetSelectedFunc(ctv.onSelected)
  22. return ctv
  23. }
  24. func (ctv *ChannelsTreeView) onSelected(n *tview.TreeNode) {
  25. ctv.app.SelectedMessage = -1
  26. ctv.app.MessagesTextView.
  27. Highlight().
  28. Clear()
  29. ctv.app.MessageInputField.SetText("")
  30. c, err := ctv.app.Session.State.Channel(n.GetReference().(string))
  31. if err != nil {
  32. return
  33. }
  34. if c.Type == astatine.ChannelTypeGuildCategory {
  35. n.SetExpanded(!n.IsExpanded())
  36. return
  37. }
  38. ctv.app.SelectedChannel = c
  39. ctv.app.SetFocus(ctv.app.MessageInputField)
  40. go func() {
  41. ms, err := ctv.app.Session.ChannelMessages(c.ID, ctv.app.Config.General.FetchMessagesLimit, "", "", "")
  42. if err != nil {
  43. return
  44. }
  45. for i := len(ms) - 1; i >= 0; i-- {
  46. ctv.app.SelectedChannel.Messages = append(ctv.app.SelectedChannel.Messages, ms[i])
  47. _, err = ctv.app.MessagesTextView.Write(buildMessage(ctv.app, ms[i]))
  48. if err != nil {
  49. return
  50. }
  51. }
  52. ctv.app.MessagesTextView.ScrollToEnd()
  53. }()
  54. }