channels.go 1.5 KB

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