Explorar o código

feat: render pinned messages (#430)

Co-authored-by: Thomas Baag <b2ag@users.noreply.github.com>
Co-authored-by: Ayyan <119342035+ayn2op@users.noreply.github.com>
Co-authored-by: ayn2op <ayn2op@gmail.com>
Retropaint hai 1 ano
pai
achega
6e694458d7
Modificáronse 2 ficheiros con 31 adicións e 9 borrados
  1. 29 9
      cmd/messages_text.go
  2. 2 0
      internal/config/keys.go

+ 29 - 9
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())

+ 2 - 0
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]",