diff options
-rw-r--r-- | interface/ui.go | 5 | ||||
-rw-r--r-- | matrix/matrix.go | 49 | ||||
-rw-r--r-- | ui/message-view.go | 6 | ||||
-rw-r--r-- | ui/messages/base.go | 3 | ||||
-rw-r--r-- | ui/messages/parser.go | 4 | ||||
-rw-r--r-- | ui/messages/textmessage.go | 10 | ||||
-rw-r--r-- | ui/room-view.go | 32 | ||||
-rw-r--r-- | ui/view-main.go | 4 |
8 files changed, 80 insertions, 33 deletions
diff --git a/interface/ui.go b/interface/ui.go index 32925a8..e8274e2 100644 --- a/interface/ui.go +++ b/interface/ui.go @@ -60,9 +60,10 @@ type RoomView interface { SetTyping(users []string) UpdateUserList() - ParseEvent(evt *event.Event) Message + AddEvent(evt *event.Event) Message + AddRedaction(evt *event.Event) + AddEdit(evt *event.Event) GetEvent(eventID string) Message - AddMessage(message Message) AddServiceMessage(message string) } diff --git a/matrix/matrix.go b/matrix/matrix.go index 7856ac7..fe0bfff 100644 --- a/matrix/matrix.go +++ b/matrix/matrix.go @@ -334,13 +334,39 @@ func (c *Container) HandleRedaction(source EventSource, evt *mautrix.Event) { return } - // TODO make this less hacky? - message := roomView.ParseEvent(redactedEvt) - if message != nil { - roomView.AddMessage(message) - if c.syncer.FirstSyncDone { - c.ui.Render() - } + roomView.AddRedaction(redactedEvt) + if c.syncer.FirstSyncDone { + c.ui.Render() + } +} + +func (c *Container) HandleEdit(room *rooms.Room, editsID string, editEvent *event.Event) { + var origEvt *event.Event + err := c.history.Update(room, editsID, func(evt *event.Event) error { + evt.Gomuks.Edits = append(evt.Gomuks.Edits, editEvent) + origEvt = evt + return nil + }) + if err != nil { + debug.Print("Failed to store edit in history db:", err) + } + if !c.config.AuthCache.InitialSyncDone { + return + } + + roomView := c.ui.MainView().GetRoom(editEvent.RoomID) + if roomView == nil { + debug.Printf("Failed to handle edit event %v: No room view found.", editEvent) + return + } + + if !room.Loaded() { + return + } + + roomView.AddEdit(origEvt) + if c.syncer.FirstSyncDone { + c.ui.Render() } } @@ -354,6 +380,11 @@ func (c *Container) HandleMessage(source EventSource, mxEvent *mautrix.Event) { return } + if editID := mxEvent.Content.GetRelatesTo().GetReplaceID(); len(editID) > 0 { + c.HandleEdit(room, editID, event.Wrap(mxEvent)) + return + } + events, err := c.history.Append(room, []*mautrix.Event{mxEvent}) if err != nil { debug.Printf("Failed to add event %s to history: %v", mxEvent.ID, err) @@ -384,10 +415,8 @@ func (c *Container) HandleMessage(source EventSource, mxEvent *mautrix.Event) { } } - // TODO switch to roomView.AddEvent - message := roomView.ParseEvent(evt) + message := roomView.AddEvent(evt) if message != nil { - roomView.AddMessage(message) roomView.MxRoom().LastReceivedMessage = message.Time() if c.syncer.FirstSyncDone { pushRules := c.PushRules().GetActions(roomView.MxRoom(), evt.Event).Should() diff --git a/ui/message-view.go b/ui/message-view.go index 9aa38a1..1773be0 100644 --- a/ui/message-view.go +++ b/ui/message-view.go @@ -143,8 +143,6 @@ func (view *MessageView) AddMessage(ifcMessage ifc.Message, direction MessageDir view.replaceMessage(oldMsg, message) view.deleteMessageID(message.TxnID) direction = IgnoreMessage - } else if oldMsg = view.getMessageByID(message.Relation.GetReplaceID()); oldMsg != nil { - direction = IgnoreMessage } view.updateWidestSender(message.Sender()) @@ -608,6 +606,10 @@ func (view *MessageView) Draw(screen mauview.Screen) { usernameX, line, view.widestSender(), msg.SenderColor()) //} + if msg.Edited { + // TODO add better indicator for edits + screen.SetCell(usernameX + view.widestSender(), line, tcell.StyleDefault.Foreground(tcell.ColorDarkRed), '*') + } prevMsg = msg } diff --git a/ui/messages/base.go b/ui/messages/base.go index d072943..567e614 100644 --- a/ui/messages/base.go +++ b/ui/messages/base.go @@ -54,6 +54,7 @@ type UIMessage struct { State event.OutgoingState IsHighlight bool IsService bool + Edited bool Source json.RawMessage ReplyTo *UIMessage Renderer MessageRenderer @@ -80,6 +81,7 @@ func newUIMessage(evt *event.Event, displayname string, renderer MessageRenderer State: evt.Gomuks.OutgoingState, IsHighlight: false, IsService: false, + Edited: len(evt.Gomuks.Edits) > 0, Source: evt.Content.VeryRaw, Renderer: renderer, } @@ -231,7 +233,6 @@ func (msg *UIMessage) SetID(id string) { } func (msg *UIMessage) SetIsHighlight(isHighlight bool) { - // TODO Textmessage cache needs to be cleared msg.IsHighlight = isHighlight } diff --git a/ui/messages/parser.go b/ui/messages/parser.go index 695dac6..e1c0053 100644 --- a/ui/messages/parser.go +++ b/ui/messages/parser.go @@ -127,8 +127,8 @@ func ParseMessage(matrix ifc.MatrixContainer, room *rooms.Room, evt *event.Event if len(evt.Content.GetReplyTo()) > 0 { evt.Content.RemoveReplyFallback() } - if evt.Content.GetRelatesTo().Type == mautrix.RelReplace && evt.Content.NewContent != nil { - evt.Content = *evt.Content.NewContent + if len(evt.Gomuks.Edits) > 0 { + evt.Content = *evt.Gomuks.Edits[len(evt.Gomuks.Edits)-1].Content.NewContent } switch evt.Content.MsgType { case "m.text", "m.notice", "m.emote": diff --git a/ui/messages/textmessage.go b/ui/messages/textmessage.go index 5527677..2e27e33 100644 --- a/ui/messages/textmessage.go +++ b/ui/messages/textmessage.go @@ -29,9 +29,10 @@ import ( ) type TextMessage struct { - cache tstring.TString - buffer []tstring.TString - Text string + cache tstring.TString + buffer []tstring.TString + isHighlight bool + Text string } // NewTextMessage creates a new UITextMessage object with the provided values and the default state. @@ -85,6 +86,9 @@ func (msg *TextMessage) String() string { } func (msg *TextMessage) CalculateBuffer(prefs config.UserPreferences, width int, uiMsg *UIMessage) { + if uiMsg.IsHighlight != msg.isHighlight { + msg.cache = nil + } msg.buffer = calculateBufferWithText(prefs, msg.getCache(uiMsg), width, uiMsg) } diff --git a/ui/room-view.go b/ui/room-view.go index 344b873..31da3c6 100644 --- a/ui/room-view.go +++ b/ui/room-view.go @@ -412,7 +412,7 @@ func (view *RoomView) SendMessage(msgtype mautrix.MessageType, text string) { } evt := view.parent.matrix.PrepareMarkdownMessage(view.Room.ID, msgtype, text) msg := view.parseEvent(evt) - view.AddMessage(msg) + view.content.AddMessage(msg, AppendMessage) eventID, err := view.parent.matrix.SendEvent(evt) if err != nil { msg.State = event.StateSendFail @@ -462,20 +462,32 @@ func (view *RoomView) AddServiceMessage(text string) { view.content.AddMessage(messages.NewServiceMessage(text), AppendMessage) } -func (view *RoomView) AddMessage(message ifc.Message) { - view.content.AddMessage(message, AppendMessage) -} - func (view *RoomView) parseEvent(evt *event.Event) *messages.UIMessage { return messages.ParseEvent(view.parent.matrix, view.parent, view.Room, evt) } -func (view *RoomView) ParseEvent(evt *event.Event) ifc.Message { - msg := view.parseEvent(evt) - if msg == nil { - return nil +func (view *RoomView) AddHistoryEvent(evt *event.Event) { + if msg := view.parseEvent(evt); msg != nil { + view.content.AddMessage(msg, PrependMessage) + } +} + +func (view *RoomView) AddEvent(evt *event.Event) ifc.Message { + if msg := view.parseEvent(evt); msg != nil { + view.content.AddMessage(msg, AppendMessage) + return msg + } + return nil +} + +func (view *RoomView) AddRedaction(redactedEvt *event.Event) { + view.AddEvent(redactedEvt) +} + +func (view *RoomView) AddEdit(evt *event.Event) { + if msg := view.parseEvent(evt); msg != nil { + view.content.AddMessage(msg, IgnoreMessage) } - return msg } func (view *RoomView) GetEvent(eventID string) ifc.Message { diff --git a/ui/view-main.go b/ui/view-main.go index 5357d24..67dbb4b 100644 --- a/ui/view-main.go +++ b/ui/view-main.go @@ -453,9 +453,7 @@ func (view *MainView) LoadHistory(roomID string) { return } for _, evt := range history { - if message := roomView.ParseEvent(evt); message != nil { - msgView.AddMessage(message, PrependMessage) - } + roomView.AddHistoryEvent(evt) } view.parent.Render() } |