messages_text.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "time"
  6. "github.com/diamondburned/arikawa/v3/discord"
  7. "github.com/rivo/tview"
  8. )
  9. type MessagesText struct {
  10. *tview.TextView
  11. selectedMessage *discord.Message
  12. }
  13. func newMessagesText() *MessagesText {
  14. mt := &MessagesText{
  15. TextView: tview.NewTextView(),
  16. }
  17. mt.SetDynamicColors(true)
  18. mt.SetRegions(true)
  19. mt.SetWordWrap(true)
  20. mt.ScrollToEnd()
  21. mt.SetHighlightedFunc(mt.onHighlighted)
  22. mt.SetBorder(cfg.Theme.MessagesText.Border)
  23. padding := cfg.Theme.MessagesText.BorderPadding
  24. mt.SetBorderPadding(padding[0], padding[1], padding[2], padding[3])
  25. return mt
  26. }
  27. func (mt *MessagesText) newMessage(m *discord.Message) error {
  28. switch m.Type {
  29. case discord.DefaultMessage, discord.InlinedReplyMessage:
  30. // Region tags are square brackets that contain a region ID in double quotes
  31. // https://pkg.go.dev/github.com/rivo/tview#hdr-Regions_and_Highlights
  32. fmt.Fprintf(mt, `["%s"]`, m.ID)
  33. if m.ReferencedMessage != nil {
  34. fmt.Fprint(mt, "[::d] ╭ ")
  35. // Author
  36. mt.newAuthor(m.ReferencedMessage)
  37. // Content
  38. mt.newContent(m.ReferencedMessage)
  39. fmt.Fprint(mt, "[::-]")
  40. fmt.Fprintln(mt)
  41. }
  42. if cfg.Timestamps {
  43. // Timestamps
  44. mt.newTimestamp(m)
  45. }
  46. // Author
  47. mt.newAuthor(m)
  48. // Content
  49. mt.newContent(m)
  50. // Tags with no region ID ([""]) don't start new regions. They can therefore be used to mark the end of a region.
  51. fmt.Fprint(mt, `[""]`)
  52. }
  53. fmt.Fprintln(mt)
  54. return nil
  55. }
  56. func (mt *MessagesText) newAuthor(m *discord.Message) {
  57. fmt.Fprintf(mt, "[blue]%s[-] ", m.Author.Username)
  58. }
  59. func (mt *MessagesText) newTimestamp(m *discord.Message) {
  60. fmt.Fprintf(mt, "[::d]%s[::-] ", m.Timestamp.Format(time.Kitchen))
  61. }
  62. func (mt *MessagesText) newContent(m *discord.Message) {
  63. fmt.Fprint(mt, tview.Escape(m.Content))
  64. }
  65. func (mt *MessagesText) onHighlighted(added, removed, remaining []string) {
  66. if len(added) == 0 {
  67. return
  68. }
  69. sf, err := discord.ParseSnowflake(added[0])
  70. if err != nil {
  71. log.Println(err)
  72. return
  73. }
  74. m, err := discordState.Cabinet.Message(guildsTree.selectedChannel.ID, discord.MessageID(sf))
  75. if err != nil {
  76. log.Println(err)
  77. return
  78. }
  79. mt.selectedMessage = m
  80. }