Add initial support for rendering replies
This commit is contained in:
parent
fe439f076a
commit
b76c301145
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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":
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user