1package bmsteams
2
3import (
4	"encoding/json"
5	"fmt"
6	"io/ioutil"
7	"strings"
8
9	"github.com/42wim/matterbridge/bridge/config"
10	"github.com/42wim/matterbridge/bridge/helper"
11
12	msgraph "github.com/yaegashi/msgraph.go/beta"
13)
14
15func (b *Bmsteams) findFile(weburl string) (string, error) {
16	itemRB, err := b.gc.GetDriveItemByURL(b.ctx, weburl)
17	if err != nil {
18		return "", err
19	}
20	itemRB.Workbook().Worksheets()
21	b.gc.Workbooks()
22	item, err := itemRB.Request().Get(b.ctx)
23	if err != nil {
24		return "", err
25	}
26	if url, ok := item.GetAdditionalData("@microsoft.graph.downloadUrl"); ok {
27		return url.(string), nil
28	}
29	return "", nil
30}
31
32// handleDownloadFile handles file download
33func (b *Bmsteams) handleDownloadFile(rmsg *config.Message, filename, weburl string) error {
34	realURL, err := b.findFile(weburl)
35	if err != nil {
36		return err
37	}
38	// Actually download the file.
39	data, err := helper.DownloadFile(realURL)
40	if err != nil {
41		return fmt.Errorf("download %s failed %#v", weburl, err)
42	}
43
44	// If a comment is attached to the file(s) it is in the 'Text' field of the teams messge event
45	// and should be added as comment to only one of the files. We reset the 'Text' field to ensure
46	// that the comment is not duplicated.
47	comment := rmsg.Text
48	rmsg.Text = ""
49	helper.HandleDownloadData(b.Log, rmsg, filename, comment, weburl, data, b.General)
50	return nil
51}
52
53func (b *Bmsteams) handleAttachments(rmsg *config.Message, msg msgraph.ChatMessage) {
54	for _, a := range msg.Attachments {
55		//remove the attachment tags from the text
56		rmsg.Text = attachRE.ReplaceAllString(rmsg.Text, "")
57
58		//handle a code snippet (code block)
59		if *a.ContentType == "application/vnd.microsoft.card.codesnippet" {
60			b.handleCodeSnippet(rmsg, a)
61			continue
62		}
63
64		//handle the download
65		err := b.handleDownloadFile(rmsg, *a.Name, *a.ContentURL)
66		if err != nil {
67			b.Log.Errorf("download of %s failed: %s", *a.Name, err)
68		}
69	}
70}
71
72type AttachContent struct {
73	Language       string `json:"language"`
74	CodeSnippetURL string `json:"codeSnippetUrl"`
75}
76
77func (b *Bmsteams) handleCodeSnippet(rmsg *config.Message, attach msgraph.ChatMessageAttachment) {
78	var content AttachContent
79	err := json.Unmarshal([]byte(*attach.Content), &content)
80	if err != nil {
81		b.Log.Errorf("unmarshal codesnippet failed: %s", err)
82		return
83	}
84	s := strings.Split(content.CodeSnippetURL, "/")
85	if len(s) != 13 {
86		b.Log.Errorf("codesnippetUrl has unexpected size: %s", content.CodeSnippetURL)
87		return
88	}
89	resp, err := b.gc.Teams().Request().Client().Get(content.CodeSnippetURL)
90	if err != nil {
91		b.Log.Errorf("retrieving snippet content failed:%s", err)
92		return
93	}
94	defer resp.Body.Close()
95	res, err := ioutil.ReadAll(resp.Body)
96	if err != nil {
97		b.Log.Errorf("reading snippet data failed: %s", err)
98		return
99	}
100	rmsg.Text = rmsg.Text + "\n```" + content.Language + "\n" + string(res) + "\n```\n"
101}
102