From 8eb6ed563995d48e9835693d7a0af3155571113b Mon Sep 17 00:00:00 2001 From: Wim Date: Sun, 29 Dec 2019 23:57:41 +0100 Subject: [PATCH] Support receiving attachments from msteams --- bridge/msteams/handler.go | 46 +++++++++++++++++++++++++++++++++++++++ bridge/msteams/msteams.go | 28 +++++++++++++++++++++--- 2 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 bridge/msteams/handler.go diff --git a/bridge/msteams/handler.go b/bridge/msteams/handler.go new file mode 100644 index 00000000..3283588a --- /dev/null +++ b/bridge/msteams/handler.go @@ -0,0 +1,46 @@ +package bmsteams + +import ( + "fmt" + + "github.com/42wim/matterbridge/bridge/config" + "github.com/42wim/matterbridge/bridge/helper" +) + +func (b *Bmsteams) findFile(weburl string) (string, error) { + itemRB, err := b.gc.GetDriveItemByURL(b.ctx, weburl) + if err != nil { + return "", err + } + itemRB.Workbook().Worksheets() + b.gc.Workbooks() + item, err := itemRB.Request().Get(b.ctx) + if err != nil { + return "", err + } + if url, ok := item.GetAdditionalData("@microsoft.graph.downloadUrl"); ok { + return url.(string), nil + } + return "", nil +} + +// handleDownloadFile handles file download +func (b *Bmsteams) handleDownloadFile(rmsg *config.Message, filename, weburl string) error { + realURL, err := b.findFile(weburl) + if err != nil { + return err + } + // Actually download the file. + data, err := helper.DownloadFile(realURL) + if err != nil { + return fmt.Errorf("download %s failed %#v", weburl, err) + } + + // If a comment is attached to the file(s) it is in the 'Text' field of the teams messge event + // and should be added as comment to only one of the files. We reset the 'Text' field to ensure + // that the comment is not duplicated. + comment := rmsg.Text + rmsg.Text = "" + helper.HandleDownloadData(b.Log, rmsg, filename, comment, weburl, data, b.General) + return nil +} diff --git a/bridge/msteams/msteams.go b/bridge/msteams/msteams.go index f2f0308b..4f72bd29 100644 --- a/bridge/msteams/msteams.go +++ b/bridge/msteams/msteams.go @@ -1,8 +1,9 @@ -package bgitter +package bmsteams import ( "context" "os" + "regexp" "strings" "time" @@ -96,6 +97,7 @@ func (b *Bmsteams) getMessages(channel string) ([]msgraph.ChatMessage, error) { } func (b *Bmsteams) poll(channelName string) { + re := regexp.MustCompile(``) msgmap := make(map[string]time.Time) b.Log.Debug("getting initial messages") res, err := b.getMessages(channelName) @@ -136,8 +138,28 @@ func (b *Bmsteams) poll(channelName string) { } b.Log.Debugf("<= Sending message from %s on %s to gateway", *msg.From.User.DisplayName, b.Account) text := b.convertToMD(*msg.Body.Content) - rmsg := config.Message{Username: *msg.From.User.DisplayName, Text: text, Channel: channelName, - Account: b.Account, Avatar: "", UserID: *msg.From.User.ID, ID: *msg.ID} + rmsg := config.Message{ + Username: *msg.From.User.DisplayName, + Text: text, + Channel: channelName, + Account: b.Account, + Avatar: "", + UserID: *msg.From.User.ID, + ID: *msg.ID, + Extra: make(map[string][]interface{}), + } + + if len(msg.Attachments) > 0 { + for _, a := range msg.Attachments { + //remove the attachment tags from the text + rmsg.Text = re.ReplaceAllString(rmsg.Text, "") + //handle the download + err := b.handleDownloadFile(&rmsg, *a.Name, *a.ContentURL) + if err != nil { + b.Log.Errorf("download of %s failed: %s", *a.Name, err) + } + } + } b.Log.Debugf("<= Message is %#v", rmsg) b.Remote <- rmsg }