diff --git a/cmd/message_input.go b/cmd/message_input.go index 0298dc1..43232fd 100644 --- a/cmd/message_input.go +++ b/cmd/message_input.go @@ -17,13 +17,12 @@ import ( type MessageInput struct { *tview.TextArea - replyMessageIdx int + replyMessageID discord.MessageID } func newMessageInput() *MessageInput { mi := &MessageInput{ TextArea: tview.NewTextArea(), - replyMessageIdx: -1, } mi.SetTextStyle(tcell.StyleDefault.Background(tcell.GetColor(cfg.Theme.BackgroundColor))) @@ -49,7 +48,7 @@ func newMessageInput() *MessageInput { } func (mi *MessageInput) reset() { - mi.replyMessageIdx = -1 + mi.replyMessageID = 0 mi.SetTitle("") mi.SetText("", true) } @@ -80,17 +79,10 @@ func (mi *MessageInput) send() { return } - logger := slog.With("channel_id", mainFlex.guildsTree.selectedChannelID) - if mi.replyMessageIdx != -1 { - ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID) - if err != nil { - logger.Error("failed to get messages", "err", err) - return - } - + if mi.replyMessageID != 0 { data := api.SendMessageData{ Content: text, - Reference: &discord.MessageReference{MessageID: ms[mi.replyMessageIdx].ID}, + Reference: &discord.MessageReference{MessageID: mi.replyMessageID}, AllowedMentions: &api.AllowedMentions{RepliedUser: option.False}, } @@ -111,7 +103,7 @@ func (mi *MessageInput) send() { }() } - mi.replyMessageIdx = -1 + mi.replyMessageID = 0 mi.reset() mainFlex.messagesText.Highlight() diff --git a/cmd/messages_text.go b/cmd/messages_text.go index c472b1f..f1acf56 100644 --- a/cmd/messages_text.go +++ b/cmd/messages_text.go @@ -21,14 +21,12 @@ import ( type MessagesText struct { *tview.TextView - selectedMessage int + selectedMessageID discord.MessageID } func newMessagesText() *MessagesText { mt := &MessagesText{ TextView: tview.NewTextView(), - - selectedMessage: -1, } mt.SetDynamicColors(true) @@ -73,7 +71,7 @@ func (mt *MessagesText) drawMsgs(cID discord.ChannelID) { } func (mt *MessagesText) reset() { - mainFlex.messagesText.selectedMessage = -1 + mainFlex.messagesText.selectedMessageID = 0 mt.SetTitle("") mt.Clear() @@ -105,7 +103,7 @@ 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" + "[-:-:-]") + fmt.Fprint(mt, "["+cfg.Theme.MessagesText.ContentColor+"]"+m.Author.Username+" pinned a message"+"[-:-:-]") case discord.DefaultMessage, discord.InlinedReplyMessage: if m.ReferencedMessage != nil { mt.createHeader(mt, *m.ReferencedMessage, true) @@ -164,16 +162,31 @@ func (mt *MessagesText) createFooter(w io.Writer, m discord.Message) { } func (mt *MessagesText) getSelectedMessage() (*discord.Message, error) { - if mt.selectedMessage == -1 { + if !mt.selectedMessageID.IsValid() { return nil, errors.New("no message is currently selected") } - ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID) + msg, err := discordState.Cabinet.Message(mainFlex.guildsTree.selectedChannelID, mt.selectedMessageID) if err != nil { - return nil, err + return nil, fmt.Errorf("could not retrieve selected message: %w", err) } - return &ms[mt.selectedMessage], nil + return msg, nil +} + +func (mt *MessagesText) getSelectedMessageIndex() (int, error) { + ms, err := discordState.Cabinet.Messages(mainFlex.guildsTree.selectedChannelID) + if err != nil { + return -1, err + } + + for idx, m := range ms { + for m.ID == mt.selectedMessageID { + return idx, nil + } + } + + return -1, nil } func (mt *MessagesText) onInputCapture(event *tcell.EventKey) *tcell.EventKey { @@ -208,14 +221,20 @@ func (mt *MessagesText) _select(name string) { return } + messageIdx, err := mt.getSelectedMessageIndex() + if err != nil { + slog.Error("failed to get selected message", "err", err) + return + } + switch name { case cfg.Keys.SelectPrevious: // If no message is currently selected, select the latest message. if len(mt.GetHighlights()) == 0 { - mt.selectedMessage = 0 + mt.selectedMessageID = ms[0].ID } else { - if mt.selectedMessage < len(ms)-1 { - mt.selectedMessage++ + if messageIdx < len(ms)-1 { + mt.selectedMessageID = ms[messageIdx+1].ID } else { return } @@ -223,41 +242,41 @@ func (mt *MessagesText) _select(name string) { case cfg.Keys.SelectNext: // If no message is currently selected, select the latest message. if len(mt.GetHighlights()) == 0 { - mt.selectedMessage = 0 + mt.selectedMessageID = ms[0].ID } else { - if mt.selectedMessage > 0 { - mt.selectedMessage-- + if messageIdx > 0 { + mt.selectedMessageID = ms[messageIdx-1].ID } else { return } } case cfg.Keys.SelectFirst: - mt.selectedMessage = len(ms) - 1 + mt.selectedMessageID = ms[len(ms)-1].ID case cfg.Keys.SelectLast: - mt.selectedMessage = 0 + mt.selectedMessageID = ms[0].ID case cfg.Keys.MessagesText.SelectReply: - if mt.selectedMessage == -1 { + if mt.selectedMessageID == 0 { return } - if ref := ms[mt.selectedMessage].ReferencedMessage; ref != nil { - for i, m := range ms { + if ref := ms[messageIdx].ReferencedMessage; ref != nil { + for _, m := range ms { if ref.ID == m.ID { - mt.selectedMessage = i + mt.selectedMessageID = m.ID } } } case cfg.Keys.MessagesText.SelectPin: - if ref := ms[mt.selectedMessage].Reference; ref != nil { - for i, m := range ms { + if ref := ms[messageIdx].Reference; ref != nil { + for _, m := range ms { if ref.MessageID == m.ID { - mt.selectedMessage = i + mt.selectedMessageID = m.ID } } } } - mt.Highlight(ms[mt.selectedMessage].ID.String()) + mt.Highlight(mt.selectedMessageID.String()) mt.ScrollToHighlight() } @@ -313,7 +332,7 @@ func (mt *MessagesText) reply(mention bool) { title += msg.Author.Tag() mainFlex.messageInput.SetTitle(title) - mainFlex.messageInput.replyMessageIdx = mt.selectedMessage + mainFlex.messageInput.replyMessageID = mt.selectedMessageID app.SetFocus(mainFlex.messageInput) } diff --git a/cmd/state.go b/cmd/state.go index 741ccea..a83c878 100644 --- a/cmd/state.go +++ b/cmd/state.go @@ -89,7 +89,7 @@ func (s *State) onMessageCreate(m *gateway.MessageCreateEvent) { func (s *State) onMessageDelete(m *gateway.MessageDeleteEvent) { if mainFlex.guildsTree.selectedChannelID == m.ChannelID { - mainFlex.messagesText.selectedMessage = -1 + mainFlex.messagesText.selectedMessageID = 0 mainFlex.messagesText.Highlight() mainFlex.messagesText.Clear()