summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bridge/msteams/handler.go46
-rw-r--r--bridge/msteams/msteams.go28
2 files changed, 71 insertions, 3 deletions
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(`<attachment id=.*?attachment>`)
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
}