forked from lug/matterbridge
		
	
		
			
				
	
	
		
			202 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			202 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package brocketchat
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"io/ioutil"
 | |
| 	"mime"
 | |
| 	"net/http"
 | |
| 	"net/url"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/42wim/matterbridge/bridge/config"
 | |
| 	"github.com/42wim/matterbridge/bridge/helper"
 | |
| 	"github.com/42wim/matterbridge/hook/rockethook"
 | |
| 	"github.com/42wim/matterbridge/matterhook"
 | |
| 	"github.com/matterbridge/Rocket.Chat.Go.SDK/models"
 | |
| 	"github.com/matterbridge/Rocket.Chat.Go.SDK/realtime"
 | |
| 	"github.com/matterbridge/Rocket.Chat.Go.SDK/rest"
 | |
| 	"github.com/nelsonken/gomf"
 | |
| )
 | |
| 
 | |
| func (b *Brocketchat) doConnectWebhookBind() error {
 | |
| 	switch {
 | |
| 	case b.GetString("WebhookURL") != "":
 | |
| 		b.Log.Info("Connecting using webhookurl (sending) and webhookbindaddress (receiving)")
 | |
| 		b.mh = matterhook.New(b.GetString("WebhookURL"),
 | |
| 			matterhook.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"),
 | |
| 				DisableServer: true})
 | |
| 		b.rh = rockethook.New(b.GetString("WebhookURL"), rockethook.Config{BindAddress: b.GetString("WebhookBindAddress")})
 | |
| 	case b.GetString("Login") != "":
 | |
| 		b.Log.Info("Connecting using login/password (sending)")
 | |
| 		err := b.apiLogin()
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 	default:
 | |
| 		b.Log.Info("Connecting using webhookbindaddress (receiving)")
 | |
| 		b.rh = rockethook.New(b.GetString("WebhookURL"), rockethook.Config{BindAddress: b.GetString("WebhookBindAddress")})
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (b *Brocketchat) doConnectWebhookURL() error {
 | |
| 	b.Log.Info("Connecting using webhookurl (sending)")
 | |
| 	b.mh = matterhook.New(b.GetString("WebhookURL"),
 | |
| 		matterhook.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"),
 | |
| 			DisableServer: true})
 | |
| 	if b.GetString("Login") != "" {
 | |
| 		b.Log.Info("Connecting using login/password (receiving)")
 | |
| 		err := b.apiLogin()
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (b *Brocketchat) apiLogin() error {
 | |
| 	b.Log.Debugf("handling apiLogin()")
 | |
| 	credentials := &models.UserCredentials{Email: b.GetString("login"), Password: b.GetString("password")}
 | |
| 	if b.GetString("Token") != "" {
 | |
| 		credentials = &models.UserCredentials{ID: b.GetString("Login"), Token: b.GetString("Token")}
 | |
| 	}
 | |
| 	myURL, err := url.Parse(b.GetString("server"))
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	client, err := realtime.NewClient(myURL, b.GetBool("debug"))
 | |
| 	b.c = client
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	restclient := rest.NewClient(myURL, b.GetBool("debug"))
 | |
| 	user, err := b.c.Login(credentials)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	b.user = user
 | |
| 	b.r = restclient
 | |
| 	err = b.r.Login(credentials)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	b.Log.Info("Connection succeeded")
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (b *Brocketchat) getChannelName(id string) string {
 | |
| 	b.RLock()
 | |
| 	defer b.RUnlock()
 | |
| 	if name, ok := b.channelMap[id]; ok {
 | |
| 		return name
 | |
| 	}
 | |
| 	return ""
 | |
| }
 | |
| 
 | |
| func (b *Brocketchat) getChannelID(name string) string {
 | |
| 	b.RLock()
 | |
| 	defer b.RUnlock()
 | |
| 	for k, v := range b.channelMap {
 | |
| 		if v == name || v == "#"+name {
 | |
| 			return k
 | |
| 		}
 | |
| 	}
 | |
| 	return ""
 | |
| }
 | |
| 
 | |
| func (b *Brocketchat) skipMessage(message *models.Message) bool {
 | |
| 	return message.User.ID == b.user.ID
 | |
| }
 | |
| 
 | |
| func (b *Brocketchat) uploadFile(fi *config.FileInfo, channel string) error {
 | |
| 	fb := gomf.New()
 | |
| 	if err := fb.WriteField("description", fi.Comment); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	sp := strings.Split(fi.Name, ".")
 | |
| 	mtype := mime.TypeByExtension("." + sp[len(sp)-1])
 | |
| 	if !strings.Contains(mtype, "image") && !strings.Contains(mtype, "video") {
 | |
| 		return nil
 | |
| 	}
 | |
| 	if err := fb.WriteFile("file", fi.Name, mtype, *fi.Data); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	req, err := fb.GetHTTPRequest(context.TODO(), b.GetString("server")+"/api/v1/rooms.upload/"+channel)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	req.Header.Add("X-Auth-Token", b.user.Token)
 | |
| 	req.Header.Add("X-User-Id", b.user.ID)
 | |
| 	client := &http.Client{
 | |
| 		Timeout: time.Second * 5,
 | |
| 	}
 | |
| 	resp, err := client.Do(req)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	body, err := ioutil.ReadAll(resp.Body)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	if resp.StatusCode != 200 {
 | |
| 		b.Log.Errorf("failed: %#v", string(body))
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // sendWebhook uses the configured WebhookURL to send the message
 | |
| func (b *Brocketchat) sendWebhook(msg *config.Message) error {
 | |
| 	// skip events
 | |
| 	if msg.Event != "" {
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	if b.GetBool("PrefixMessagesWithNick") {
 | |
| 		msg.Text = msg.Username + msg.Text
 | |
| 	}
 | |
| 	if msg.Extra != nil {
 | |
| 		// this sends a message only if we received a config.EVENT_FILE_FAILURE_SIZE
 | |
| 		for _, rmsg := range helper.HandleExtra(msg, b.General) {
 | |
| 			rmsg := rmsg // scopelint
 | |
| 			iconURL := config.GetIconURL(&rmsg, b.GetString("iconurl"))
 | |
| 			matterMessage := matterhook.OMessage{
 | |
| 				IconURL:  iconURL,
 | |
| 				Channel:  rmsg.Channel,
 | |
| 				UserName: rmsg.Username,
 | |
| 				Text:     rmsg.Text,
 | |
| 				Props:    make(map[string]interface{}),
 | |
| 			}
 | |
| 			if err := b.mh.Send(matterMessage); err != nil {
 | |
| 				b.Log.Errorf("sendWebhook failed: %s ", err)
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// webhook doesn't support file uploads, so we add the url manually
 | |
| 		if len(msg.Extra["file"]) > 0 {
 | |
| 			for _, f := range msg.Extra["file"] {
 | |
| 				fi := f.(config.FileInfo)
 | |
| 				if fi.URL != "" {
 | |
| 					msg.Text += fi.URL
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	iconURL := config.GetIconURL(msg, b.GetString("iconurl"))
 | |
| 	matterMessage := matterhook.OMessage{
 | |
| 		IconURL:  iconURL,
 | |
| 		Channel:  msg.Channel,
 | |
| 		UserName: msg.Username,
 | |
| 		Text:     msg.Text,
 | |
| 	}
 | |
| 	if msg.Avatar != "" {
 | |
| 		matterMessage.IconURL = msg.Avatar
 | |
| 	}
 | |
| 	err := b.mh.Send(matterMessage)
 | |
| 	if err != nil {
 | |
| 		b.Log.Info(err)
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | 
