From 6e694458d7f282667653af90493757027b52188d Mon Sep 17 00:00:00 2001 From: Retropaint <70713407+Retropaint@users.noreply.github.com> Date: Sun, 22 Sep 2024 05:57:18 +0800 Subject: [PATCH] feat: render pinned messages (#430) Co-authored-by: Thomas Baag Co-authored-by: Ayyan <119342035+ayn2op@users.noreply.github.com> Co-authored-by: ayn2op --- cmd/messages_text.go | 38 +++++++++++++++++++++++++++++--------- internal/config/keys.go | 2 ++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/cmd/messages_text.go b/cmd/messages_text.go index 8d0d193..c472b1f 100644 --- a/cmd/messages_text.go +++ b/cmd/messages_text.go @@ -80,7 +80,21 @@ func (mt *MessagesText) reset() { mt.Highlight() } +// Region tags are square brackets that contain a region ID in double quotes +// https://pkg.go.dev/github.com/rivo/tview#hdr-Regions_and_Highlights +func (mt *MessagesText) startRegion(msgID discord.MessageID) { + fmt.Fprintf(mt, `["%s"]`, msgID) +} + +// Tags with no region ID ([""]) don't start new regions. They can therefore be used to mark the end of a region. +func (mt *MessagesText) endRegion() { + fmt.Fprint(mt, `[""]`) +} + func (mt *MessagesText) createMessage(m discord.Message) { + mt.startRegion(m.ID) + defer mt.endRegion() + if cfg.HideBlockedUsers { isBlocked := discordState.UserIsBlocked(m.Author.ID) if isBlocked { @@ -90,11 +104,9 @@ func (mt *MessagesText) createMessage(m discord.Message) { } switch m.Type { + case discord.ChannelPinnedMessage: + fmt.Fprint(mt, "[" + cfg.Theme.MessagesText.ContentColor + "]" + m.Author.Username + " pinned a message" + "[-:-:-]") case discord.DefaultMessage, discord.InlinedReplyMessage: - // Region tags are square brackets that contain a region ID in double quotes - // https://pkg.go.dev/github.com/rivo/tview#hdr-Regions_and_Highlights - fmt.Fprintf(mt, `["%s"]`, m.ID) - if m.ReferencedMessage != nil { mt.createHeader(mt, *m.ReferencedMessage, true) mt.createBody(mt, *m.ReferencedMessage, true) @@ -105,11 +117,11 @@ func (mt *MessagesText) createMessage(m discord.Message) { mt.createHeader(mt, m, false) mt.createBody(mt, m, false) mt.createFooter(mt, m) - - // Tags with no region ID ([""]) don't start new regions. They can therefore be used to mark the end of a region. - fmt.Fprint(mt, `[""]`) - fmt.Fprintln(mt) + default: + mt.createHeader(mt, m, false) } + + fmt.Fprintln(mt) } func (mt *MessagesText) createHeader(w io.Writer, m discord.Message, isReply bool) { @@ -166,7 +178,7 @@ func (mt *MessagesText) getSelectedMessage() (*discord.Message, error) { func (mt *MessagesText) onInputCapture(event *tcell.EventKey) *tcell.EventKey { switch event.Name() { - case cfg.Keys.SelectPrevious, cfg.Keys.SelectNext, cfg.Keys.SelectFirst, cfg.Keys.SelectLast, cfg.Keys.MessagesText.SelectReply: + case cfg.Keys.SelectPrevious, cfg.Keys.SelectNext, cfg.Keys.SelectFirst, cfg.Keys.SelectLast, cfg.Keys.MessagesText.SelectReply, cfg.Keys.MessagesText.SelectPin: mt._select(event.Name()) return nil case cfg.Keys.MessagesText.Yank: @@ -235,6 +247,14 @@ func (mt *MessagesText) _select(name string) { } } } + case cfg.Keys.MessagesText.SelectPin: + if ref := ms[mt.selectedMessage].Reference; ref != nil { + for i, m := range ms { + if ref.MessageID == m.ID { + mt.selectedMessage = i + } + } + } } mt.Highlight(ms[mt.selectedMessage].ID.String()) diff --git a/internal/config/keys.go b/internal/config/keys.go index 070a86c..5bc1222 100644 --- a/internal/config/keys.go +++ b/internal/config/keys.go @@ -25,6 +25,7 @@ type ( MessagesTextKeys struct { SelectReply string `toml:"select_reply"` + SelectPin string `toml:"select_pin"` Reply string `toml:"reply"` ReplyMention string `toml:"reply_mention"` @@ -60,6 +61,7 @@ func defaultKeys() Keys { MessagesText: MessagesTextKeys{ SelectReply: "Rune[s]", + SelectPin: "Rune[p]", Reply: "Rune[r]", ReplyMention: "Rune[R]",