Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit 995ff4d7081b86224adf4b89747f42bf42706707 Author: Tadeo Kondrak <me@tadeo.ca> Date: Mon Feb 15 14:34:14 2021 +0000 Handle Rocket.Chat attachments (#1395) diff --git a/bridge/helper/helper.go b/bridge/helper/helper.go index cbb319a..2d16dc9 100644 --- a/bridge/helper/helper.go +++ b/bridge/helper/helper.go @@ -516 +5130 @@ 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 80adb31..03b66ea 100644 --- a/bridge/rocketchat/handlers.go +++ b/bridge/rocketchat/handlers.go @@ -17 +110 @@  package brocketchat    import ( + "fmt" +   "github.com/42wim/matterbridge/bridge/config" + "github.com/42wim/matterbridge/bridge/helper"   "github.com/matterbridge/Rocket.Chat.Go.SDK/models"  )   @@ -586 +617 @@ 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 @@ -768 +8011 @@ 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) { @@ -866 +9338 @@ 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)