forked from jshiffer/matterbridge
102 lines
2.8 KiB
Go
102 lines
2.8 KiB
Go
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"
|
|
}
|