Wrap events in custom struct to add gomuks-specific fields

This commit is contained in:
Tulir Asokan
2019-06-17 12:27:31 +03:00
parent 754f8e493d
commit fe439f076a
16 changed files with 167 additions and 113 deletions

View File

@ -22,6 +22,7 @@ import (
"time"
"maunium.net/go/gomuks/config"
"maunium.net/go/gomuks/matrix/event"
"maunium.net/go/mautrix"
"maunium.net/go/mauview"
"maunium.net/go/tcell"
@ -50,7 +51,7 @@ type UIMessage struct {
SenderName string
DefaultSenderColor tcell.Color
Timestamp time.Time
State mautrix.OutgoingEventState
State event.OutgoingState
IsHighlight bool
IsService bool
Source json.RawMessage
@ -61,25 +62,25 @@ type UIMessage struct {
const DateFormat = "January _2, 2006"
const TimeFormat = "15:04:05"
func newUIMessage(event *mautrix.Event, displayname string, renderer MessageRenderer) *UIMessage {
msgtype := event.Content.MsgType
func newUIMessage(evt *event.Event, displayname string, renderer MessageRenderer) *UIMessage {
msgtype := evt.Content.MsgType
if len(msgtype) == 0 {
msgtype = mautrix.MessageType(event.Type.String())
msgtype = mautrix.MessageType(evt.Type.String())
}
return &UIMessage{
SenderID: event.Sender,
SenderID: evt.Sender,
SenderName: displayname,
Timestamp: unixToTime(event.Timestamp),
DefaultSenderColor: widget.GetHashColor(event.Sender),
Timestamp: unixToTime(evt.Timestamp),
DefaultSenderColor: widget.GetHashColor(evt.Sender),
Type: msgtype,
EventID: event.ID,
TxnID: event.Unsigned.TransactionID,
Relation: *event.Content.GetRelatesTo(),
State: event.Unsigned.OutgoingState,
EventID: evt.ID,
TxnID: evt.Unsigned.TransactionID,
Relation: *evt.Content.GetRelatesTo(),
State: evt.Gomuks.OutgoingState,
IsHighlight: false,
IsService: false,
Source: event.Content.VeryRaw,
Source: evt.Content.VeryRaw,
Renderer: renderer,
}
}
@ -100,9 +101,9 @@ func unixToTime(unix int64) time.Time {
// In any other case, the sender is the display name of the user who sent the message.
func (msg *UIMessage) Sender() string {
switch msg.State {
case mautrix.EventStateLocalEcho:
case event.StateLocalEcho:
return "Sending..."
case mautrix.EventStateSendFail:
case event.StateSendFail:
return "Error"
}
switch msg.Type {
@ -124,11 +125,11 @@ func (msg *UIMessage) NotificationContent() string {
func (msg *UIMessage) getStateSpecificColor() tcell.Color {
switch msg.State {
case mautrix.EventStateLocalEcho:
case event.StateLocalEcho:
return tcell.ColorGray
case mautrix.EventStateSendFail:
case event.StateSendFail:
return tcell.ColorRed
case mautrix.EventStateDefault:
case event.StateDefault:
fallthrough
default:
return tcell.ColorDefault

View File

@ -21,7 +21,7 @@ import (
"time"
ifc "maunium.net/go/gomuks/interface"
"maunium.net/go/mautrix"
"maunium.net/go/gomuks/matrix/event"
"maunium.net/go/mauview"
"maunium.net/go/tcell"
@ -35,8 +35,8 @@ type ExpandedTextMessage struct {
}
// NewExpandedTextMessage creates a new ExpandedTextMessage object with the provided values and the default state.
func NewExpandedTextMessage(event *mautrix.Event, displayname string, text tstring.TString) *UIMessage {
return newUIMessage(event, displayname, &ExpandedTextMessage{
func NewExpandedTextMessage(evt *event.Event, displayname string, text tstring.TString) *UIMessage {
return newUIMessage(evt, displayname, &ExpandedTextMessage{
Text: text,
})
}

View File

@ -27,6 +27,7 @@ import (
"github.com/lucasb-eyer/go-colorful"
"golang.org/x/net/html"
"maunium.net/go/gomuks/matrix/event"
"maunium.net/go/mautrix"
"maunium.net/go/tcell"
@ -382,7 +383,7 @@ func (parser *htmlParser) Parse(htmlData string) Entity {
const TabLength = 4
// Parse parses a HTML-formatted Matrix event into a UIMessage.
func Parse(room *rooms.Room, evt *mautrix.Event, senderDisplayname string) Entity {
func Parse(room *rooms.Room, evt *event.Event, senderDisplayname string) Entity {
htmlData := evt.Content.FormattedBody
if evt.Content.Format != mautrix.FormatHTML {
htmlData = strings.Replace(html.EscapeString(evt.Content.Body), "\n", "<br/>", -1)

View File

@ -18,7 +18,7 @@ package messages
import (
ifc "maunium.net/go/gomuks/interface"
"maunium.net/go/mautrix"
"maunium.net/go/gomuks/matrix/event"
"maunium.net/go/mauview"
"maunium.net/go/tcell"
@ -33,8 +33,8 @@ type HTMLMessage struct {
focused bool
}
func NewHTMLMessage(event *mautrix.Event, displayname string, root html.Entity) *UIMessage {
return newUIMessage(event, displayname, &HTMLMessage{
func NewHTMLMessage(evt *event.Event, displayname string, root html.Entity) *UIMessage {
return newUIMessage(evt, displayname, &HTMLMessage{
Root: root,
})
}

View File

@ -22,7 +22,7 @@ import (
"image"
"image/color"
"maunium.net/go/mautrix"
"maunium.net/go/gomuks/matrix/event"
"maunium.net/go/mauview"
"maunium.net/go/tcell"
@ -44,8 +44,8 @@ type ImageMessage struct {
}
// NewImageMessage creates a new ImageMessage object with the provided values and the default state.
func NewImageMessage(matrix ifc.MatrixContainer, event *mautrix.Event, displayname string, body, homeserver, fileID string, data []byte) *UIMessage {
return newUIMessage(event, displayname, &ImageMessage{
func NewImageMessage(matrix ifc.MatrixContainer, evt *event.Event, displayname string, body, homeserver, fileID string, data []byte) *UIMessage {
return newUIMessage(evt, displayname, &ImageMessage{
Body: body,
Homeserver: homeserver,
FileID: fileID,

View File

@ -20,6 +20,7 @@ import (
"fmt"
"strings"
"maunium.net/go/gomuks/matrix/event"
"maunium.net/go/mautrix"
"maunium.net/go/tcell"
@ -42,7 +43,7 @@ func getCachedEvent(mainView ifc.MainView, roomID, eventID string) *UIMessage {
return nil
}
func ParseEvent(matrix ifc.MatrixContainer, mainView ifc.MainView, room *rooms.Room, evt *mautrix.Event) *UIMessage {
func ParseEvent(matrix ifc.MatrixContainer, mainView ifc.MainView, room *rooms.Room, evt *event.Event) *UIMessage {
msg := directParseEvent(matrix, room, evt)
if msg == nil {
return nil
@ -63,7 +64,7 @@ func ParseEvent(matrix ifc.MatrixContainer, mainView ifc.MainView, room *rooms.R
return msg
}
func directParseEvent(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix.Event) *UIMessage {
func directParseEvent(matrix ifc.MatrixContainer, room *rooms.Room, evt *event.Event) *UIMessage {
displayname := evt.Sender
member := room.GetMember(evt.Sender)
if member != nil {
@ -89,7 +90,7 @@ func directParseEvent(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix
return nil
}
func ParseStateEvent(evt *mautrix.Event, displayname string) *UIMessage {
func ParseStateEvent(evt *event.Event, displayname string) *UIMessage {
text := tstring.NewColorTString(displayname, widget.GetHashColor(evt.Sender))
switch evt.Type {
case mautrix.StateTopic:
@ -122,7 +123,7 @@ func ParseStateEvent(evt *mautrix.Event, displayname string) *UIMessage {
return NewExpandedTextMessage(evt, displayname, text)
}
func ParseMessage(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix.Event, displayname string) *UIMessage {
func ParseMessage(matrix ifc.MatrixContainer, room *rooms.Room, evt *event.Event, displayname string) *UIMessage {
if len(evt.Content.GetReplyTo()) > 0 {
evt.Content.RemoveReplyFallback()
}
@ -146,7 +147,7 @@ func ParseMessage(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix.Eve
return nil
}
func getMembershipChangeMessage(evt *mautrix.Event, membership, prevMembership mautrix.Membership, senderDisplayname, displayname, prevDisplayname string) (sender string, text tstring.TString) {
func getMembershipChangeMessage(evt *event.Event, membership, prevMembership mautrix.Membership, senderDisplayname, displayname, prevDisplayname string) (sender string, text tstring.TString) {
switch membership {
case "invite":
sender = "---"
@ -183,7 +184,7 @@ func getMembershipChangeMessage(evt *mautrix.Event, membership, prevMembership m
return
}
func getMembershipEventContent(room *rooms.Room, evt *mautrix.Event) (sender string, text tstring.TString) {
func getMembershipEventContent(room *rooms.Room, evt *event.Event) (sender string, text tstring.TString) {
member := room.GetMember(evt.Sender)
senderDisplayname := evt.Sender
if member != nil {
@ -220,7 +221,7 @@ func getMembershipEventContent(room *rooms.Room, evt *mautrix.Event) (sender str
return
}
func ParseMembershipEvent(room *rooms.Room, evt *mautrix.Event) *UIMessage {
func ParseMembershipEvent(room *rooms.Room, evt *event.Event) *UIMessage {
displayname, text := getMembershipEventContent(room, evt)
if len(text) == 0 {
return nil
@ -229,7 +230,7 @@ func ParseMembershipEvent(room *rooms.Room, evt *mautrix.Event) *UIMessage {
return NewExpandedTextMessage(evt, displayname, text)
}
func ParseAliasEvent(evt *mautrix.Event, displayname string) tstring.TString {
func ParseAliasEvent(evt *event.Event, displayname string) tstring.TString {
var prevAliases []string
if evt.Unsigned.PrevContent != nil {
prevAliases = evt.Unsigned.PrevContent.Aliases

View File

@ -18,7 +18,7 @@ package messages
import (
ifc "maunium.net/go/gomuks/interface"
"maunium.net/go/mautrix"
"maunium.net/go/gomuks/matrix/event"
"maunium.net/go/mauview"
"maunium.net/go/tcell"
@ -27,8 +27,8 @@ import (
type RedactedMessage struct{}
func NewRedactedMessage(event *mautrix.Event, displayname string) *UIMessage {
return newUIMessage(event, displayname, &RedactedMessage{})
func NewRedactedMessage(evt *event.Event, displayname string) *UIMessage {
return newUIMessage(evt, displayname, &RedactedMessage{})
}
func (msg *RedactedMessage) Clone() MessageRenderer {

View File

@ -21,7 +21,7 @@ import (
"time"
ifc "maunium.net/go/gomuks/interface"
"maunium.net/go/mautrix"
"maunium.net/go/gomuks/matrix/event"
"maunium.net/go/mauview"
"maunium.net/go/gomuks/config"
@ -35,8 +35,8 @@ type TextMessage struct {
}
// NewTextMessage creates a new UITextMessage object with the provided values and the default state.
func NewTextMessage(event *mautrix.Event, displayname string, text string) *UIMessage {
return newUIMessage(event, displayname, &TextMessage{
func NewTextMessage(evt *event.Event, displayname string, text string) *UIMessage {
return newUIMessage(evt, displayname, &TextMessage{
Text: text,
})
}

View File

@ -27,6 +27,7 @@ import (
"github.com/mattn/go-runewidth"
"maunium.net/go/gomuks/debug"
"maunium.net/go/gomuks/matrix/event"
"maunium.net/go/mauview"
@ -414,7 +415,7 @@ func (view *RoomView) SendMessage(msgtype mautrix.MessageType, text string) {
view.AddMessage(msg)
eventID, err := view.parent.matrix.SendEvent(evt)
if err != nil {
msg.State = mautrix.EventStateSendFail
msg.State = event.StateSendFail
// Show shorter version if available
if httpErr, ok := err.(mautrix.HTTPError); ok {
err = httpErr
@ -427,7 +428,7 @@ func (view *RoomView) SendMessage(msgtype mautrix.MessageType, text string) {
} else {
debug.Print("Event ID received:", eventID)
msg.EventID = eventID
msg.State = mautrix.EventStateDefault
msg.State = event.StateDefault
view.MessageView().setMessageID(msg)
view.parent.parent.Render()
}
@ -465,11 +466,11 @@ func (view *RoomView) AddMessage(message ifc.Message) {
view.content.AddMessage(message, AppendMessage)
}
func (view *RoomView) parseEvent(evt *mautrix.Event) *messages.UIMessage {
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 *mautrix.Event) ifc.Message {
func (view *RoomView) ParseEvent(evt *event.Event) ifc.Message {
msg := view.parseEvent(evt)
if msg == nil {
return nil