From c147ba1da1d4d5f181c4de796e414a72248447cc Mon Sep 17 00:00:00 2001 From: Tadeo Kondrak Date: Mon, 15 Feb 2021 14:34:14 -0700 Subject: [PATCH] Handle Rocket.Chat attachments (#1395) --- bridge/helper/helper.go | 24 +++++++++++++++++++++ bridge/rocketchat/handlers.go | 39 +++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/bridge/helper/helper.go b/bridge/helper/helper.go index cbb319ac..2d16dc93 100644 --- a/bridge/helper/helper.go +++ b/bridge/helper/helper.go @@ -51,6 +51,30 @@ func DownloadFileAuth(url string, auth string) (*[]byte, error) { return &data, nil } +// DownloadFileAuthRocket downloads the given URL using the specified Rocket user ID and authentication token. +func DownloadFileAuthRocket(url, token, userID string) (*[]byte, error) { + var buf bytes.Buffer + client := &http.Client{ + Timeout: time.Second * 5, + } + req, err := http.NewRequest("GET", url, nil) + + req.Header.Add("X-Auth-Token", token) + req.Header.Add("X-User-Id", userID) + + if err != nil { + return nil, err + } + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + _, err = io.Copy(&buf, resp.Body) + data := buf.Bytes() + return &data, err +} + // GetSubLines splits messages in newline-delimited lines. If maxLineLength is // specified as non-zero GetSubLines will also clip long lines to the maximum // length and insert a warning marker that the line was clipped. diff --git a/bridge/rocketchat/handlers.go b/bridge/rocketchat/handlers.go index 80adb31e..03b66eac 100644 --- a/bridge/rocketchat/handlers.go +++ b/bridge/rocketchat/handlers.go @@ -1,7 +1,10 @@ package brocketchat import ( + "fmt" + "github.com/42wim/matterbridge/bridge/config" + "github.com/42wim/matterbridge/bridge/helper" "github.com/matterbridge/Rocket.Chat.Go.SDK/models" ) @@ -58,6 +61,7 @@ func (b *Brocketchat) handleStatusEvent(ev models.Message, rmsg *config.Message) func (b *Brocketchat) handleRocketClient(messages chan *config.Message) { for message := range b.messageChan { + message := message // skip messages with same ID, apparently messages get duplicated for an unknown reason if _, ok := b.cache.Get(message.ID); ok { continue @@ -76,8 +80,11 @@ func (b *Brocketchat) handleRocketClient(messages chan *config.Message) { Account: b.Account, UserID: message.User.ID, ID: message.ID, + Extra: make(map[string][]interface{}), } + b.handleAttachments(&message, rmsg) + // handleStatusEvent returns false if the message should be dropped // in that case it is probably some modification to the channel we do not want to relay if b.handleStatusEvent(m, rmsg) { @@ -86,6 +93,38 @@ func (b *Brocketchat) handleRocketClient(messages chan *config.Message) { } } +func (b *Brocketchat) handleAttachments(message *models.Message, rmsg *config.Message) { + if rmsg.Text == "" { + for _, attachment := range message.Attachments { + if attachment.Title != "" { + rmsg.Text = attachment.Title + "\n" + } + if attachment.Title != "" && attachment.Text != "" { + rmsg.Text += "\n" + } + if attachment.Text != "" { + rmsg.Text += attachment.Text + } + } + } + + for i := range message.Attachments { + if err := b.handleDownloadFile(rmsg, &message.Attachments[i]); err != nil { + b.Log.Errorf("Could not download incoming file: %#v", err) + } + } +} + +func (b *Brocketchat) handleDownloadFile(rmsg *config.Message, file *models.Attachment) error { + downloadURL := b.GetString("server") + file.TitleLink + data, err := helper.DownloadFileAuthRocket(downloadURL, b.user.Token, b.user.ID) + if err != nil { + return fmt.Errorf("download %s failed %#v", downloadURL, err) + } + helper.HandleDownloadData(b.Log, rmsg, file.Title, rmsg.Text, downloadURL, data, b.General) + return nil +} + func (b *Brocketchat) handleUploadFile(msg *config.Message) error { for _, f := range msg.Extra["file"] { fi := f.(config.FileInfo)