Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit 8973389c274a69941948f85672e9105263adb654 Author: Wim <wim@42.be> Date: Fri Nov 24 22:36:19 2017 +0000 Add initial support for an external mediaserver. #278 Add 2 extra options `MediaServerUpload` and `MediaServerDownload`, where the URL for upload and download can be specified. See https://github.com/42wim/matterbridge/wiki/Mediaserver-setup-%5Badvanced%5D for an example with caddy diff --git a/bridge/config/config.go b/bridge/config/config.go index afb9f1a..8a13b48 100644 --- a/bridge/config/config.go +++ b/bridge/config/config.go @@ -366 +367 @@ type FileInfo struct {   Name string   Data *[]byte   Comment string + URL string  }    type ChannelInfo struct { @@ -4817 +4919 @@ type ChannelInfo struct {  }    type Protocol struct { - AuthCode string // steam - BindAddress string // mattermost, slack // DEPRECATED - Buffer int // api - Charset string // irc - EditSuffix string // mattermost, slack, discord, telegram, gitter - EditDisable bool // mattermost, slack, discord, telegram, gitter - IconURL string // mattermost, slack - IgnoreNicks string // all protocols - IgnoreMessages string // all protocols - Jid string // xmpp - Login string // mattermost, matrix + AuthCode string // steam + BindAddress string // mattermost, slack // DEPRECATED + Buffer int // api + Charset string // irc + EditSuffix string // mattermost, slack, discord, telegram, gitter + EditDisable bool // mattermost, slack, discord, telegram, gitter + IconURL string // mattermost, slack + IgnoreNicks string // all protocols + IgnoreMessages string // all protocols + Jid string // xmpp + Login string // mattermost, matrix + MediaServerDownload string + MediaServerUpload string   MessageQueue int // IRC, size of message queue for flood control   MessageDelay int // IRC, time in millisecond to wait between messages   MessageLength int // IRC, max length of a message allowed diff --git a/bridge/irc/irc.go b/bridge/irc/irc.go index 78981f0..f1ed5bd 100644 --- a/bridge/irc/irc.go +++ b/bridge/irc/irc.go @@ -1786 +17821 @@ func (b *Birc) Send(msg config.Message) (string, error) {   msg.Text = buf.String()   }   + if msg.Extra != nil { + if len(msg.Extra["file"]) > 0 { + for _, f := range msg.Extra["file"] { + fi := f.(config.FileInfo) + if fi.URL != "" { + msg.Text = fi.URL + b.Local <- config.Message{Text: msg.Text, Username: msg.Username, Channel: msg.Channel, Event: msg.Event} + } else { + b.Local <- config.Message{Text: msg.Text, Username: msg.Username, Channel: msg.Channel, Event: msg.Event} + } + } + } + return "", nil + } +   for _, text := range strings.Split(msg.Text, "\n") {   if len(text) > b.Config.MessageLength {   text = text[:b.Config.MessageLength] + " <message clipped>" diff --git a/gateway/gateway.go b/gateway/gateway.go index e5d74ff..8b1223f 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -113 +116 @@  package gateway    import ( + "bytes"   "fmt"   "github.com/42wim/matterbridge/bridge"   "github.com/42wim/matterbridge/bridge/config"   log "github.com/Sirupsen/logrus"   // "github.com/davecgh/go-spew/spew" + "crypto/sha1"   "github.com/hashicorp/golang-lru"   "github.com/peterhellberg/emojilib" + "net/http"   "regexp"   "strings"   "time" @@ -3186 +32134 @@ func (gw *Gateway) modifyMessage(msg *config.Message) {   msg.Gateway = gw.Name  }   +func (gw *Gateway) handleFiles(msg *config.Message) { + if msg.Extra == nil || gw.Config.General.MediaServerUpload == "" { + return + } + if len(msg.Extra["file"]) > 0 { + client := &http.Client{ + Timeout: time.Second * 5, + } + for i, f := range msg.Extra["file"] { + fi := f.(config.FileInfo) + sha1sum := fmt.Sprintf("%x", sha1.Sum(*fi.Data)) + reader := bytes.NewReader(*fi.Data) + url := gw.Config.General.MediaServerUpload + "/" + sha1sum + "/" + fi.Name + durl := gw.Config.General.MediaServerDownload + "/" + sha1sum + "/" + fi.Name + extra := msg.Extra["file"][i].(config.FileInfo) + extra.URL = durl + msg.Extra["file"][i] = extra + req, _ := http.NewRequest("PUT", url, reader) + req.Header.Set("Content-Type", "binary/octet-stream") + _, err := client.Do(req) + if err != nil { + log.Errorf("mediaserver upload failed: %#v", err) + } + log.Debugf("mediaserver download URL = %s", durl) + } + } +} +  func getChannelID(msg config.Message) string {   return msg.Channel + msg.Account  } diff --git a/gateway/router.go b/gateway/router.go index 28f8133..192fa9a 100644 --- a/gateway/router.go +++ b/gateway/router.go @@ -996 +997 @@ func (r *Router) handleReceive() {   if !gw.ignoreMessage(&msg) {   msg.Timestamp = time.Now()   gw.modifyMessage(&msg) + gw.handleFiles(&msg)   for _, br := range gw.Bridges {   msgIDs = append(msgIDs, gw.handleMessage(msg, br)...)   }