diff options
Diffstat (limited to 'teleirc/matterbridge/bridge/msteams/handler.go')
| -rw-r--r-- | teleirc/matterbridge/bridge/msteams/handler.go | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/teleirc/matterbridge/bridge/msteams/handler.go b/teleirc/matterbridge/bridge/msteams/handler.go new file mode 100644 index 0000000..c8f0c46 --- /dev/null +++ b/teleirc/matterbridge/bridge/msteams/handler.go @@ -0,0 +1,101 @@ +package bmsteams + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "strings" + + "github.com/42wim/matterbridge/bridge/config" + "github.com/42wim/matterbridge/bridge/helper" + + msgraph "github.com/yaegashi/msgraph.go/beta" +) + +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 +} + +func (b *Bmsteams) handleAttachments(rmsg *config.Message, msg msgraph.ChatMessage) { + for _, a := range msg.Attachments { + //remove the attachment tags from the text + rmsg.Text = attachRE.ReplaceAllString(rmsg.Text, "") + + //handle a code snippet (code block) + if *a.ContentType == "application/vnd.microsoft.card.codesnippet" { + b.handleCodeSnippet(rmsg, a) + continue + } + + //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) + } + } +} + +type AttachContent struct { + Language string `json:"language"` + CodeSnippetURL string `json:"codeSnippetUrl"` +} + +func (b *Bmsteams) handleCodeSnippet(rmsg *config.Message, attach msgraph.ChatMessageAttachment) { + var content AttachContent + err := json.Unmarshal([]byte(*attach.Content), &content) + if err != nil { + b.Log.Errorf("unmarshal codesnippet failed: %s", err) + return + } + s := strings.Split(content.CodeSnippetURL, "/") + if len(s) != 13 { + b.Log.Errorf("codesnippetUrl has unexpected size: %s", content.CodeSnippetURL) + return + } + resp, err := b.gc.Teams().Request().Client().Get(content.CodeSnippetURL) + if err != nil { + b.Log.Errorf("retrieving snippet content failed:%s", err) + return + } + defer resp.Body.Close() + res, err := ioutil.ReadAll(resp.Body) + if err != nil { + b.Log.Errorf("reading snippet data failed: %s", err) + return + } + rmsg.Text = rmsg.Text + "\n```" + content.Language + "\n" + string(res) + "\n```\n" +} |
