// reaction_viewer.go implements the reaction details popup overlay. // Opened with the view_reactions keybind (v), it fetches and displays // which users reacted with each emoji on the selected message. package chat import ( "fmt" "github.com/ayn2op/tview" "github.com/diamondburned/arikawa/v3/discord" "github.com/gdamore/tcell/v3" ) const reactionViewerLayerName = "reactionViewer" func (ml *messagesList) showReactionViewer() { msg, err := ml.selectedMessage() if err != nil || len(msg.Reactions) == 0 { return } channelID := msg.ChannelID var lines []tview.Line boldStyle := tcell.StyleDefault.Bold(true) dimStyle := tcell.StyleDefault.Dim(true) normalStyle := tcell.StyleDefault for i, r := range msg.Reactions { if i > 0 { // Blank separator line b := tview.NewLineBuilder() b.Write("", normalStyle) lines = append(lines, b.Finish()...) } // Emoji header: "👍 (3)" name := r.Emoji.Name if r.Emoji.ID.IsValid() && name != "" { name = ":" + name + ":" } b := tview.NewLineBuilder() b.Write(fmt.Sprintf("%s (%d)", name, r.Count), boldStyle) lines = append(lines, b.Finish()...) // Fetch users who reacted apiEmoji := discord.NewAPIEmoji(r.Emoji.ID, r.Emoji.Name) users, err := ml.chatView.state.Reactions(channelID, msg.ID, apiEmoji, 100) if err != nil { b = tview.NewLineBuilder() b.Write(" (could not load)", dimStyle) lines = append(lines, b.Finish()...) continue } for _, u := range users { b = tview.NewLineBuilder() b.Write(" "+u.DisplayOrUsername(), normalStyle) lines = append(lines, b.Finish()...) } } tv := tview.NewTextView(). SetWrap(true). SetWordWrap(true). SetLines(lines) tv.SetTitle("Reactions") ml.chatView.showReactionViewerOverlay(tv) }