reaction_viewer.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // reaction_viewer.go implements the reaction details popup overlay.
  2. // Opened with the view_reactions keybind (v), it fetches and displays
  3. // which users reacted with each emoji on the selected message.
  4. package chat
  5. import (
  6. "fmt"
  7. "github.com/ayn2op/tview"
  8. "github.com/diamondburned/arikawa/v3/discord"
  9. "github.com/gdamore/tcell/v3"
  10. )
  11. const reactionViewerLayerName = "reactionViewer"
  12. func (ml *messagesList) showReactionViewer() {
  13. msg, err := ml.selectedMessage()
  14. if err != nil || len(msg.Reactions) == 0 {
  15. return
  16. }
  17. channelID := msg.ChannelID
  18. var lines []tview.Line
  19. boldStyle := tcell.StyleDefault.Bold(true)
  20. dimStyle := tcell.StyleDefault.Dim(true)
  21. normalStyle := tcell.StyleDefault
  22. for i, r := range msg.Reactions {
  23. if i > 0 {
  24. // Blank separator line
  25. b := tview.NewLineBuilder()
  26. b.Write("", normalStyle)
  27. lines = append(lines, b.Finish()...)
  28. }
  29. // Emoji header: "👍 (3)"
  30. name := r.Emoji.Name
  31. if r.Emoji.ID.IsValid() && name != "" {
  32. name = ":" + name + ":"
  33. }
  34. b := tview.NewLineBuilder()
  35. b.Write(fmt.Sprintf("%s (%d)", name, r.Count), boldStyle)
  36. lines = append(lines, b.Finish()...)
  37. // Fetch users who reacted
  38. apiEmoji := discord.NewAPIEmoji(r.Emoji.ID, r.Emoji.Name)
  39. users, err := ml.chatView.state.Reactions(channelID, msg.ID, apiEmoji, 100)
  40. if err != nil {
  41. b = tview.NewLineBuilder()
  42. b.Write(" (could not load)", dimStyle)
  43. lines = append(lines, b.Finish()...)
  44. continue
  45. }
  46. for _, u := range users {
  47. b = tview.NewLineBuilder()
  48. b.Write(" "+u.DisplayOrUsername(), normalStyle)
  49. lines = append(lines, b.Finish()...)
  50. }
  51. }
  52. tv := tview.NewTextView().
  53. SetWrap(true).
  54. SetWordWrap(true).
  55. SetLines(lines)
  56. tv.SetTitle("Reactions")
  57. ml.chatView.showReactionViewerOverlay(tv)
  58. }