messages_text.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package main
  2. import (
  3. "bytes"
  4. "time"
  5. "github.com/diamondburned/arikawa/v3/discord"
  6. "github.com/rivo/tview"
  7. )
  8. type MessagesText struct {
  9. *tview.TextView
  10. buffer bytes.Buffer
  11. }
  12. func newMessagesText() *MessagesText {
  13. mt := &MessagesText{
  14. TextView: tview.NewTextView(),
  15. }
  16. mt.SetDynamicColors(true)
  17. mt.SetRegions(true)
  18. mt.SetWordWrap(true)
  19. mt.SetBorder(cfg.Theme.MessagesText.Border)
  20. mt.SetBorderPadding(cfg.BorderPadding())
  21. return mt
  22. }
  23. func (mt *MessagesText) newMessage(m *discord.Message) error {
  24. switch m.Type {
  25. case discord.DefaultMessage, discord.InlinedReplyMessage:
  26. // Region tags are square brackets that contain a region ID in double quotes
  27. // https://pkg.go.dev/github.com/rivo/tview#hdr-Regions_and_Highlights
  28. mt.buffer.WriteString(`["`)
  29. mt.buffer.WriteString(m.ID.String())
  30. mt.buffer.WriteString(`"]`)
  31. if m.ReferencedMessage != nil {
  32. mt.buffer.WriteString("> [::d]")
  33. // Author
  34. mt.newAuthor(m.ReferencedMessage)
  35. // Content
  36. mt.newContent(m.ReferencedMessage)
  37. mt.buffer.WriteString("[::-]")
  38. mt.buffer.WriteByte('\n')
  39. }
  40. // Author
  41. mt.newAuthor(m)
  42. // Timestamps
  43. mt.newTimestamp(m)
  44. // Content
  45. mt.buffer.WriteByte('\n')
  46. mt.newContent(m)
  47. // Tags with no region ID ([""]) don't start new regions. They can therefore be used to mark the end of a region.
  48. mt.buffer.WriteString(`[""]`)
  49. }
  50. mt.buffer.WriteString("\n\n")
  51. _, err := mt.buffer.WriteTo(mt)
  52. return err
  53. }
  54. func (mt *MessagesText) newAuthor(m *discord.Message) {
  55. mt.buffer.WriteString("[blue]")
  56. mt.buffer.WriteString(m.Author.Username)
  57. mt.buffer.WriteString("[-] ")
  58. }
  59. func (mt *MessagesText) newTimestamp(m *discord.Message) {
  60. mt.buffer.WriteString("[::d]")
  61. mt.buffer.WriteString(m.Timestamp.Format(time.Kitchen))
  62. mt.buffer.WriteString("[-:-:-] ")
  63. }
  64. func (mt *MessagesText) newContent(m *discord.Message) {
  65. mt.buffer.WriteString(m.Content)
  66. }