forked from lug/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"
 | |
| }
 | 
