diff options
author | Tulir Asokan <tulir@maunium.net> | 2020-04-08 15:30:29 +0300 |
---|---|---|
committer | Tulir Asokan <tulir@maunium.net> | 2020-04-08 15:30:29 +0300 |
commit | a6f6fb3ef22658508671296a31367a198205da99 (patch) | |
tree | 448766b706b0dab25e6541fd1d9cb5e2a7439c51 /ui/messages | |
parent | 80564b2887085a088a4f753042dbe345092e45a1 (diff) |
Display thumbnail for all files and add commands to download and open files
Diffstat (limited to 'ui/messages')
-rw-r--r-- | ui/messages/base.go | 2 | ||||
-rw-r--r-- | ui/messages/expandedtextmessage.go | 3 | ||||
-rw-r--r-- | ui/messages/filemessage.go | 97 | ||||
-rw-r--r-- | ui/messages/htmlmessage.go | 3 | ||||
-rw-r--r-- | ui/messages/parser.go | 14 | ||||
-rw-r--r-- | ui/messages/redactedmessage.go | 3 | ||||
-rw-r--r-- | ui/messages/textmessage.go | 3 |
7 files changed, 63 insertions, 62 deletions
diff --git a/ui/messages/base.go b/ui/messages/base.go index 58d9b6e..745bfcd 100644 --- a/ui/messages/base.go +++ b/ui/messages/base.go @@ -27,7 +27,6 @@ import ( "maunium.net/go/mauview" "maunium.net/go/tcell" - "maunium.net/go/gomuks/interface" "maunium.net/go/gomuks/ui/widget" ) @@ -36,7 +35,6 @@ type MessageRenderer interface { NotificationContent() string PlainText() string CalculateBuffer(prefs config.UserPreferences, width int, msg *UIMessage) - RegisterMatrix(matrix ifc.MatrixContainer, prefs config.UserPreferences) Height() int Clone() MessageRenderer String() string diff --git a/ui/messages/expandedtextmessage.go b/ui/messages/expandedtextmessage.go index c666613..bd5aba9 100644 --- a/ui/messages/expandedtextmessage.go +++ b/ui/messages/expandedtextmessage.go @@ -20,7 +20,6 @@ import ( "fmt" "time" - ifc "maunium.net/go/gomuks/interface" "maunium.net/go/gomuks/matrix/event" "maunium.net/go/mauview" "maunium.net/go/tcell" @@ -88,5 +87,3 @@ func (msg *ExpandedTextMessage) Draw(screen mauview.Screen) { line.Draw(screen, 0, y) } } - -func (msg *ExpandedTextMessage) RegisterMatrix(matrix ifc.MatrixContainer, prefs config.UserPreferences) {} diff --git a/ui/messages/filemessage.go b/ui/messages/filemessage.go index 9fb3499..daf6c00 100644 --- a/ui/messages/filemessage.go +++ b/ui/messages/filemessage.go @@ -23,6 +23,7 @@ import ( "image/color" "maunium.net/go/gomuks/matrix/event" + "maunium.net/go/mautrix" "maunium.net/go/mauview" "maunium.net/go/tcell" @@ -34,72 +35,86 @@ import ( ) type FileMessage struct { - Body string - Homeserver string - FileID string - data []byte - buffer []tstring.TString + Type mautrix.MessageType + Body string + URL mautrix.ContentURI + Thumbnail mautrix.ContentURI + imageData []byte + buffer []tstring.TString matrix ifc.MatrixContainer } // NewFileMessage creates a new FileMessage object with the provided values and the default state. -func NewFileMessage(matrix ifc.MatrixContainer, evt *event.Event, displayname string, body, homeserver, fileID string, data []byte) *UIMessage { +func NewFileMessage(matrix ifc.MatrixContainer, evt *event.Event, displayname string) *UIMessage { + url, _ := mautrix.ParseContentURI(evt.Content.URL) + thumbnail, _ := mautrix.ParseContentURI(evt.Content.GetInfo().ThumbnailURL) return newUIMessage(evt, displayname, &FileMessage{ - Body: body, - Homeserver: homeserver, - FileID: fileID, - data: data, - matrix: matrix, + Type: evt.Content.MsgType, + Body: evt.Content.Body, + URL: url, + Thumbnail: thumbnail, + matrix: matrix, }) } func (msg *FileMessage) Clone() MessageRenderer { - data := make([]byte, len(msg.data)) - copy(data, msg.data) + data := make([]byte, len(msg.imageData)) + copy(data, msg.imageData) return &FileMessage{ - Body: msg.Body, - Homeserver: msg.Homeserver, - FileID: msg.FileID, - data: data, - matrix: msg.matrix, - } -} - -func (msg *FileMessage) RegisterMatrix(matrix ifc.MatrixContainer, prefs config.UserPreferences) { - msg.matrix = matrix - - if len(msg.data) == 0 && !prefs.DisableDownloads { - go msg.updateData() + Body: msg.Body, + URL: msg.URL, + Thumbnail: msg.Thumbnail, + imageData: data, + matrix: msg.matrix, } } func (msg *FileMessage) NotificationContent() string { - return "Sent a file" + switch msg.Type { + case mautrix.MsgImage: + return "Sent an image" + case mautrix.MsgAudio: + return "Sent an audio file" + case mautrix.MsgVideo: + return "Sent a video" + case mautrix.MsgFile: + fallthrough + default: + return "Sent a file" + } } func (msg *FileMessage) PlainText() string { - return fmt.Sprintf("%s: %s", msg.Body, msg.matrix.GetDownloadURL(msg.Homeserver, msg.FileID)) + return fmt.Sprintf("%s: %s", msg.Body, msg.matrix.GetDownloadURL(msg.URL)) } func (msg *FileMessage) String() string { - return fmt.Sprintf(`&messages.FileMessage{Body="%s", Homeserver="%s", FileID="%s"}`, msg.Body, msg.Homeserver, msg.FileID) + return fmt.Sprintf(`&messages.FileMessage{Body="%s", URL="%s", Thumbnail="%s"}`, msg.Body, msg.URL, msg.Thumbnail) } -func (msg *FileMessage) updateData() { - defer debug.Recover() - debug.Print("Loading file:", msg.Homeserver, msg.FileID) - data, _, _, err := msg.matrix.Download(fmt.Sprintf("mxc://%s/%s", msg.Homeserver, msg.FileID)) +func (msg *FileMessage) DownloadPreview() { + url := msg.Thumbnail + if url.IsEmpty() { + if msg.Type == mautrix.MsgImage && !msg.URL.IsEmpty() { + msg.Thumbnail = msg.URL + url = msg.Thumbnail + } else { + return + } + } + debug.Print("Loading file:", url) + data, err := msg.matrix.Download(url) if err != nil { - debug.Printf("Failed to download file %s/%s: %v", msg.Homeserver, msg.FileID, err) + debug.Printf("Failed to download file %s: %v", url, err) return } - debug.Print("File", msg.Homeserver, msg.FileID, "loaded.") - msg.data = data + debug.Print("File", url, "loaded.") + msg.imageData = data } -func (msg *FileMessage) Path() string { - return msg.matrix.GetCachePath(msg.Homeserver, msg.FileID) +func (msg *FileMessage) ThumbnailPath() string { + return msg.matrix.GetCachePath(msg.Thumbnail) } func (msg *FileMessage) CalculateBuffer(prefs config.UserPreferences, width int, uiMsg *UIMessage) { @@ -107,12 +122,12 @@ func (msg *FileMessage) CalculateBuffer(prefs config.UserPreferences, width int, return } - if prefs.BareMessageView || prefs.DisableImages || uiMsg.Type != "m.image" { + if prefs.BareMessageView || prefs.DisableImages || len(msg.imageData) == 0 { msg.buffer = calculateBufferWithText(prefs, tstring.NewTString(msg.PlainText()), width, uiMsg) return } - img, _, err := image.DecodeConfig(bytes.NewReader(msg.data)) + img, _, err := image.DecodeConfig(bytes.NewReader(msg.imageData)) if err != nil { debug.Print("File could not be decoded:", err) } @@ -121,7 +136,7 @@ func (msg *FileMessage) CalculateBuffer(prefs config.UserPreferences, width int, imgWidth = width / 3 } - ansFile, err := ansimage.NewScaledFromReader(bytes.NewReader(msg.data), 0, imgWidth, color.Black) + ansFile, err := ansimage.NewScaledFromReader(bytes.NewReader(msg.imageData), 0, imgWidth, color.Black) if err != nil { msg.buffer = []tstring.TString{tstring.NewColorTString("Failed to display image", tcell.ColorRed)} debug.Print("Failed to display image:", err) diff --git a/ui/messages/htmlmessage.go b/ui/messages/htmlmessage.go index ff49e57..af3ce41 100644 --- a/ui/messages/htmlmessage.go +++ b/ui/messages/htmlmessage.go @@ -17,7 +17,6 @@ package messages import ( - ifc "maunium.net/go/gomuks/interface" "maunium.net/go/gomuks/matrix/event" "maunium.net/go/mauview" "maunium.net/go/tcell" @@ -39,8 +38,6 @@ func NewHTMLMessage(evt *event.Event, displayname string, root html.Entity) *UIM }) } -func (hw *HTMLMessage) RegisterMatrix(matrix ifc.MatrixContainer, prefs config.UserPreferences) {} - func (hw *HTMLMessage) Clone() MessageRenderer { return &HTMLMessage{ Root: hw.Root.Clone(), diff --git a/ui/messages/parser.go b/ui/messages/parser.go index 1c145e5..d0bc6e0 100644 --- a/ui/messages/parser.go +++ b/ui/messages/parser.go @@ -24,7 +24,6 @@ import ( "maunium.net/go/mautrix" "maunium.net/go/tcell" - "maunium.net/go/gomuks/debug" "maunium.net/go/gomuks/interface" "maunium.net/go/gomuks/matrix/rooms" "maunium.net/go/gomuks/ui/messages/html" @@ -132,18 +131,19 @@ func ParseMessage(matrix ifc.MatrixContainer, room *rooms.Room, evt *event.Event evt.Content = *evt.Gomuks.Edits[len(evt.Gomuks.Edits)-1].Content.NewContent } switch evt.Content.MsgType { - case "m.text", "m.notice", "m.emote": + case mautrix.MsgText, mautrix.MsgNotice, mautrix.MsgEmote: if evt.Content.Format == mautrix.FormatHTML { return NewHTMLMessage(evt, displayname, html.Parse(room, evt, displayname)) } evt.Content.Body = strings.Replace(evt.Content.Body, "\t", " ", -1) return NewTextMessage(evt, displayname, evt.Content.Body) - case "m.file", "m.video", "m.audio", "m.image": - data, hs, id, err := matrix.Download(evt.Content.URL) - if err != nil { - debug.Printf("Failed to download %s: %v", evt.Content.URL, err) + case mautrix.MsgImage, mautrix.MsgVideo, mautrix.MsgAudio, mautrix.MsgFile: + msg := NewFileMessage(matrix, evt, displayname) + if !matrix.Preferences().DisableDownloads { + renderer := msg.Renderer.(*FileMessage) + renderer.DownloadPreview() } - return NewFileMessage(matrix, evt, displayname, evt.Content.Body, hs, id, data) + return msg } return nil } diff --git a/ui/messages/redactedmessage.go b/ui/messages/redactedmessage.go index 56b4822..34d880b 100644 --- a/ui/messages/redactedmessage.go +++ b/ui/messages/redactedmessage.go @@ -17,7 +17,6 @@ package messages import ( - ifc "maunium.net/go/gomuks/interface" "maunium.net/go/gomuks/matrix/event" "maunium.net/go/mauview" "maunium.net/go/tcell" @@ -64,5 +63,3 @@ func (msg *RedactedMessage) Draw(screen mauview.Screen) { screen.SetContent(x, 0, RedactionChar, nil, RedactionStyle) } } - -func (msg *RedactedMessage) RegisterMatrix(matrix ifc.MatrixContainer, prefs config.UserPreferences) {} diff --git a/ui/messages/textmessage.go b/ui/messages/textmessage.go index 0bfa27b..2e59c8f 100644 --- a/ui/messages/textmessage.go +++ b/ui/messages/textmessage.go @@ -20,7 +20,6 @@ import ( "fmt" "time" - ifc "maunium.net/go/gomuks/interface" "maunium.net/go/gomuks/matrix/event" "maunium.net/go/mauview" @@ -101,5 +100,3 @@ func (msg *TextMessage) Draw(screen mauview.Screen) { line.Draw(screen, 0, y) } } - -func (msg *TextMessage) RegisterMatrix(matrix ifc.MatrixContainer, prefs config.UserPreferences) {} |