mirror of
				https://github.com/42wim/matterbridge.git
				synced 2025-10-27 20:07:35 +01:00 
			
		
		
		
	Send chat notification if media is too big to be re-uploaded to MediaServer. See #359
This commit is contained in:
		
							parent
							
								
									78f1011f52
								
							
						
					
					
						commit
						80822b7fff
					
				| @ -10,12 +10,13 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	EVENT_JOIN_LEAVE      = "join_leave" | ||||
| 	EVENT_TOPIC_CHANGE    = "topic_change" | ||||
| 	EVENT_FAILURE         = "failure" | ||||
| 	EVENT_REJOIN_CHANNELS = "rejoin_channels" | ||||
| 	EVENT_USER_ACTION     = "user_action" | ||||
| 	EVENT_MSG_DELETE      = "msg_delete" | ||||
| 	EVENT_JOIN_LEAVE        = "join_leave" | ||||
| 	EVENT_TOPIC_CHANGE      = "topic_change" | ||||
| 	EVENT_FAILURE           = "failure" | ||||
| 	EVENT_FILE_FAILURE_SIZE = "file_failure_size" | ||||
| 	EVENT_REJOIN_CHANNELS   = "rejoin_channels" | ||||
| 	EVENT_USER_ACTION       = "user_action" | ||||
| 	EVENT_MSG_DELETE        = "msg_delete" | ||||
| ) | ||||
| 
 | ||||
| type Message struct { | ||||
| @ -38,6 +39,7 @@ type FileInfo struct { | ||||
| 	Data    *[]byte | ||||
| 	Comment string | ||||
| 	URL     string | ||||
| 	Size    int64 | ||||
| } | ||||
| 
 | ||||
| type ChannelInfo struct { | ||||
|  | ||||
| @ -3,6 +3,7 @@ package bdiscord | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"github.com/42wim/matterbridge/bridge/config" | ||||
| 	"github.com/42wim/matterbridge/bridge/helper" | ||||
| 	log "github.com/Sirupsen/logrus" | ||||
| 	"github.com/bwmarrin/discordgo" | ||||
| 	"regexp" | ||||
| @ -139,6 +140,9 @@ func (b *bdiscord) Send(msg config.Message) (string, error) { | ||||
| 		} | ||||
| 
 | ||||
| 		if msg.Extra != nil { | ||||
| 			for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 				b.c.ChannelMessageSend(channelID, rmsg.Username+rmsg.Text) | ||||
| 			} | ||||
| 			// check if we have files to upload (from slack, telegram or mattermost) | ||||
| 			if len(msg.Extra["file"]) > 0 { | ||||
| 				var err error | ||||
|  | ||||
| @ -4,6 +4,7 @@ import ( | ||||
| 	"fmt" | ||||
| 	"github.com/42wim/go-gitter" | ||||
| 	"github.com/42wim/matterbridge/bridge/config" | ||||
| 	"github.com/42wim/matterbridge/bridge/helper" | ||||
| 	log "github.com/Sirupsen/logrus" | ||||
| 	"strings" | ||||
| ) | ||||
| @ -121,6 +122,9 @@ func (b *Bgitter) Send(msg config.Message) (string, error) { | ||||
| 	} | ||||
| 
 | ||||
| 	if msg.Extra != nil { | ||||
| 		for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 			b.c.SendMessage(roomID, rmsg.Username+rmsg.Text) | ||||
| 		} | ||||
| 		if len(msg.Extra["file"]) > 0 { | ||||
| 			for _, f := range msg.Extra["file"] { | ||||
| 				fi := f.(config.FileInfo) | ||||
|  | ||||
| @ -2,6 +2,8 @@ package helper | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"github.com/42wim/matterbridge/bridge/config" | ||||
| 	"io" | ||||
| 	"net/http" | ||||
| 	"time" | ||||
| @ -38,3 +40,18 @@ func SplitStringLength(input string, length int) string { | ||||
| 	} | ||||
| 	return str | ||||
| } | ||||
| 
 | ||||
| // handle all the stuff we put into extra | ||||
| func HandleExtra(msg *config.Message, general *config.Protocol) []config.Message { | ||||
| 	extra := msg.Extra | ||||
| 	rmsg := []config.Message{} | ||||
| 	if len(extra[config.EVENT_FILE_FAILURE_SIZE]) > 0 { | ||||
| 		for _, f := range extra[config.EVENT_FILE_FAILURE_SIZE] { | ||||
| 			fi := f.(config.FileInfo) | ||||
| 			text := fmt.Sprintf("file %s too big to download (%#v > allowed size: %#v)", fi.Name, fi.Size, general.MediaDownloadSize) | ||||
| 			rmsg = append(rmsg, config.Message{Text: text, Username: "<system> ", Channel: msg.Channel}) | ||||
| 		} | ||||
| 		return rmsg | ||||
| 	} | ||||
| 	return rmsg | ||||
| } | ||||
|  | ||||
| @ -177,6 +177,9 @@ func (b *Birc) Send(msg config.Message) (string, error) { | ||||
| 	} | ||||
| 
 | ||||
| 	if msg.Extra != nil { | ||||
| 		for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 			b.Local <- rmsg | ||||
| 		} | ||||
| 		if len(msg.Extra["file"]) > 0 { | ||||
| 			for _, f := range msg.Extra["file"] { | ||||
| 				fi := f.(config.FileInfo) | ||||
|  | ||||
| @ -98,6 +98,9 @@ func (b *Bmatrix) Send(msg config.Message) (string, error) { | ||||
| 	} | ||||
| 
 | ||||
| 	if msg.Extra != nil { | ||||
| 		for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 			b.mc.SendText(channel, rmsg.Username+rmsg.Text) | ||||
| 		} | ||||
| 		// check if we have files to upload (from slack, telegram or mattermost) | ||||
| 		if len(msg.Extra["file"]) > 0 { | ||||
| 			for _, f := range msg.Extra["file"] { | ||||
| @ -234,6 +237,10 @@ func (b *Bmatrix) handleEvent(ev *matrix.Event) { | ||||
| 					flog.Debugf("download OK %#v %#v %#v", name, len(*data), len(url)) | ||||
| 					rmsg.Extra["file"] = append(rmsg.Extra["file"], config.FileInfo{Name: name, Data: data}) | ||||
| 				} | ||||
| 			} else { | ||||
| 				flog.Errorf("File %#v to large to download (%#v). MediaDownloadSize is %#v", name, size, b.General.MediaDownloadSize) | ||||
| 				rmsg.Event = config.EVENT_FILE_FAILURE_SIZE | ||||
| 				rmsg.Extra[rmsg.Event] = append(rmsg.Extra[rmsg.Event], config.FileInfo{Name: name, Size: int64(size)}) | ||||
| 			} | ||||
| 			rmsg.Text = "" | ||||
| 		} | ||||
|  | ||||
| @ -4,6 +4,7 @@ import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"github.com/42wim/matterbridge/bridge/config" | ||||
| 	"github.com/42wim/matterbridge/bridge/helper" | ||||
| 	"github.com/42wim/matterbridge/matterclient" | ||||
| 	"github.com/42wim/matterbridge/matterhook" | ||||
| 	log "github.com/Sirupsen/logrus" | ||||
| @ -154,6 +155,12 @@ func (b *Bmattermost) Send(msg config.Message) (string, error) { | ||||
| 	if b.Config.WebhookURL != "" { | ||||
| 
 | ||||
| 		if msg.Extra != nil { | ||||
| 			for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 				matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL, Channel: channel, UserName: rmsg.Username, | ||||
| 					Text: rmsg.Text, Props: make(map[string]interface{})} | ||||
| 				matterMessage.Props["matterbridge"] = true | ||||
| 				b.mh.Send(matterMessage) | ||||
| 			} | ||||
| 			if len(msg.Extra["file"]) > 0 { | ||||
| 				for _, f := range msg.Extra["file"] { | ||||
| 					fi := f.(config.FileInfo) | ||||
| @ -186,6 +193,9 @@ func (b *Bmattermost) Send(msg config.Message) (string, error) { | ||||
| 		return msg.ID, b.mc.DeleteMessage(msg.ID) | ||||
| 	} | ||||
| 	if msg.Extra != nil { | ||||
| 		for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 			b.mc.PostMessage(b.mc.GetChannelId(channel, ""), rmsg.Username+rmsg.Text) | ||||
| 		} | ||||
| 		if len(msg.Extra["file"]) > 0 { | ||||
| 			var err error | ||||
| 			var res, id string | ||||
| @ -296,6 +306,8 @@ func (b *Bmattermost) handleMatterClient(mchan chan *MMMessage) { | ||||
| 					flog.Debugf("trying to download %#v fileid %#v with size %#v", finfo.Name, finfo.Id, finfo.Size) | ||||
| 					if int(finfo.Size) > b.General.MediaDownloadSize { | ||||
| 						flog.Errorf("File %#v to large to download (%#v). MediaDownloadSize is %#v", finfo.Name, finfo.Size, b.General.MediaDownloadSize) | ||||
| 						m.Event = config.EVENT_FILE_FAILURE_SIZE | ||||
| 						m.Extra[m.Event] = append(m.Extra[m.Event], config.FileInfo{Name: finfo.Name, Comment: message.Text, Size: int64(finfo.Size)}) | ||||
| 						continue | ||||
| 					} | ||||
| 					data, resp := b.mc.Client.DownloadFile(id, true) | ||||
|  | ||||
| @ -2,6 +2,7 @@ package brocketchat | ||||
| 
 | ||||
| import ( | ||||
| 	"github.com/42wim/matterbridge/bridge/config" | ||||
| 	"github.com/42wim/matterbridge/bridge/helper" | ||||
| 	"github.com/42wim/matterbridge/hook/rockethook" | ||||
| 	"github.com/42wim/matterbridge/matterhook" | ||||
| 	log "github.com/Sirupsen/logrus" | ||||
| @ -57,6 +58,22 @@ func (b *Brocketchat) Send(msg config.Message) (string, error) { | ||||
| 		return "", nil | ||||
| 	} | ||||
| 	flog.Debugf("Receiving %#v", msg) | ||||
| 	if msg.Extra != nil { | ||||
| 		for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 			matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL, Channel: rmsg.Channel, UserName: rmsg.Username, | ||||
| 				Text: rmsg.Text} | ||||
| 			b.mh.Send(matterMessage) | ||||
| 		} | ||||
| 		if len(msg.Extra["file"]) > 0 { | ||||
| 			for _, f := range msg.Extra["file"] { | ||||
| 				fi := f.(config.FileInfo) | ||||
| 				if fi.URL != "" { | ||||
| 					msg.Text += fi.URL | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL} | ||||
| 	matterMessage.Channel = msg.Channel | ||||
| 	matterMessage.UserName = msg.Username | ||||
|  | ||||
| @ -5,6 +5,7 @@ import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"github.com/42wim/matterbridge/bridge/config" | ||||
| 	"github.com/42wim/matterbridge/bridge/helper" | ||||
| 	"github.com/42wim/matterbridge/matterhook" | ||||
| 	log "github.com/Sirupsen/logrus" | ||||
| 	"github.com/nlopes/slack" | ||||
| @ -134,6 +135,22 @@ func (b *Bslack) Send(msg config.Message) (string, error) { | ||||
| 		message = nick + " " + message | ||||
| 	} | ||||
| 	if b.Config.WebhookURL != "" { | ||||
| 		if msg.Extra != nil { | ||||
| 			for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 				matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL, Channel: channel, UserName: rmsg.Username, | ||||
| 					Text: rmsg.Text} | ||||
| 				b.mh.Send(matterMessage) | ||||
| 			} | ||||
| 			if len(msg.Extra["file"]) > 0 { | ||||
| 				for _, f := range msg.Extra["file"] { | ||||
| 					fi := f.(config.FileInfo) | ||||
| 					if fi.URL != "" { | ||||
| 						message += fi.URL | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL} | ||||
| 		matterMessage.Channel = channel | ||||
| 		matterMessage.UserName = nick | ||||
| @ -183,6 +200,9 @@ func (b *Bslack) Send(msg config.Message) (string, error) { | ||||
| 	} | ||||
| 
 | ||||
| 	if msg.Extra != nil { | ||||
| 		for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 			b.sc.PostMessage(schannel.ID, rmsg.Username+rmsg.Text, np) | ||||
| 		} | ||||
| 		// check if we have files to upload (from slack, telegram or mattermost) | ||||
| 		if len(msg.Extra["file"]) > 0 { | ||||
| 			var err error | ||||
| @ -291,16 +311,21 @@ func (b *Bslack) handleSlack() { | ||||
| 		// if we have a file attached, download it (in memory) and put a pointer to it in msg.Extra | ||||
| 		if message.Raw.File != nil { | ||||
| 			// limit to 1MB for now | ||||
| 			if message.Raw.File.Size <= b.General.MediaDownloadSize { | ||||
| 				comment := "" | ||||
| 			comment := "" | ||||
| 			results := regexp.MustCompile(`.*?commented: (.*)`).FindAllStringSubmatch(msg.Text, -1) | ||||
| 			if len(results) > 0 { | ||||
| 				comment = results[0][1] | ||||
| 			} | ||||
| 
 | ||||
| 			if message.Raw.File.Size > b.General.MediaDownloadSize { | ||||
| 				flog.Errorf("File %#v to large to download (%#v). MediaDownloadSize is %#v", message.Raw.File.Name, message.Raw.File.Size, b.General.MediaDownloadSize) | ||||
| 				msg.Event = config.EVENT_FILE_FAILURE_SIZE | ||||
| 				msg.Extra[msg.Event] = append(msg.Extra[msg.Event], config.FileInfo{Name: message.Raw.File.Name, Comment: comment, Size: int64(message.Raw.File.Size)}) | ||||
| 			} else { | ||||
| 				data, err := b.downloadFile(message.Raw.File.URLPrivateDownload) | ||||
| 				if err != nil { | ||||
| 					flog.Errorf("download %s failed %#v", message.Raw.File.URLPrivateDownload, err) | ||||
| 				} else { | ||||
| 					results := regexp.MustCompile(`.*?commented: (.*)`).FindAllStringSubmatch(msg.Text, -1) | ||||
| 					if len(results) > 0 { | ||||
| 						comment = results[0][1] | ||||
| 					} | ||||
| 					msg.Extra["file"] = append(msg.Extra["file"], config.FileInfo{Name: message.Raw.File.Name, Data: data, Comment: comment}) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| @ -3,6 +3,7 @@ package bsshchat | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"github.com/42wim/matterbridge/bridge/config" | ||||
| 	"github.com/42wim/matterbridge/bridge/helper" | ||||
| 	log "github.com/Sirupsen/logrus" | ||||
| 	"github.com/shazow/ssh-chat/sshd" | ||||
| 	"io" | ||||
| @ -62,6 +63,9 @@ func (b *Bsshchat) Send(msg config.Message) (string, error) { | ||||
| 	} | ||||
| 	flog.Debugf("Receiving %#v", msg) | ||||
| 	if msg.Extra != nil { | ||||
| 		for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 			b.w.Write([]byte(rmsg.Username + rmsg.Text + "\r\n")) | ||||
| 		} | ||||
| 		if len(msg.Extra["file"]) > 0 { | ||||
| 			for _, f := range msg.Extra["file"] { | ||||
| 				fi := f.(config.FileInfo) | ||||
|  | ||||
| @ -97,6 +97,9 @@ func (b *Btelegram) Send(msg config.Message) (string, error) { | ||||
| 	} | ||||
| 
 | ||||
| 	if msg.Extra != nil { | ||||
| 		for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 			b.sendMessage(chatid, rmsg.Username+rmsg.Text) | ||||
| 		} | ||||
| 		// check if we have files to upload (from slack, telegram or mattermost) | ||||
| 		if len(msg.Extra["file"]) > 0 { | ||||
| 			var c tgbotapi.Chattable | ||||
| @ -309,6 +312,10 @@ func (b *Btelegram) handleDownload(file interface{}, comment string, msg *config | ||||
| 			flog.Debugf("download OK %#v %#v %#v", name, len(*data), len(url)) | ||||
| 			msg.Extra["file"] = append(msg.Extra["file"], config.FileInfo{Name: name, Data: data, Comment: comment}) | ||||
| 		} | ||||
| 	} else { | ||||
| 		flog.Errorf("File %#v to large to download (%#v). MediaDownloadSize is %#v", name, size, b.General.MediaDownloadSize) | ||||
| 		msg.Event = config.EVENT_FILE_FAILURE_SIZE | ||||
| 		msg.Extra[msg.Event] = append(msg.Extra[msg.Event], config.FileInfo{Name: name, Comment: comment, Size: int64(size)}) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -3,6 +3,7 @@ package bxmpp | ||||
| import ( | ||||
| 	"crypto/tls" | ||||
| 	"github.com/42wim/matterbridge/bridge/config" | ||||
| 	"github.com/42wim/matterbridge/bridge/helper" | ||||
| 	log "github.com/Sirupsen/logrus" | ||||
| 	"github.com/jpillora/backoff" | ||||
| 	"github.com/mattn/go-xmpp" | ||||
| @ -81,6 +82,9 @@ func (b *Bxmpp) Send(msg config.Message) (string, error) { | ||||
| 	} | ||||
| 	flog.Debugf("Receiving %#v", msg) | ||||
| 	if msg.Extra != nil { | ||||
| 		for _, rmsg := range helper.HandleExtra(&msg, b.General) { | ||||
| 			b.xc.Send(xmpp.Chat{Type: "groupchat", Remote: rmsg.Channel + "@" + b.Config.Muc, Text: rmsg.Username + rmsg.Text}) | ||||
| 		} | ||||
| 		if len(msg.Extra["file"]) > 0 { | ||||
| 			for _, f := range msg.Extra["file"] { | ||||
| 				fi := f.(config.FileInfo) | ||||
|  | ||||
| @ -171,7 +171,8 @@ func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrM | ||||
| 			dest.Protocol != "mattermost" && | ||||
| 			dest.Protocol != "telegram" && | ||||
| 			dest.Protocol != "matrix" && | ||||
| 			dest.Protocol != "xmpp" { | ||||
| 			dest.Protocol != "xmpp" && | ||||
| 			len(msg.Extra[config.EVENT_FILE_FAILURE_SIZE]) == 0 { | ||||
| 			if msg.Text == "" { | ||||
| 				return brMsgIDs | ||||
| 			} | ||||
| @ -235,7 +236,10 @@ func (gw *Gateway) ignoreMessage(msg *config.Message) bool { | ||||
| 	} | ||||
| 	if msg.Text == "" { | ||||
| 		// we have an attachment or actual bytes | ||||
| 		if msg.Extra != nil && (msg.Extra["attachments"] != nil || len(msg.Extra["file"]) > 0) { | ||||
| 		if msg.Extra != nil && | ||||
| 			(msg.Extra["attachments"] != nil || | ||||
| 				len(msg.Extra["file"]) > 0 || | ||||
| 				len(msg.Extra[config.EVENT_FILE_FAILURE_SIZE]) > 0) { | ||||
| 			return false | ||||
| 		} | ||||
| 		log.Debugf("ignoring empty message %#v from %s", msg, msg.Account) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Wim
						Wim