Add support for file URLs

This commit is contained in:
s3lph
2020-09-26 19:51:58 +02:00
parent 75b9cb7364
commit dceb003d1f
3 changed files with 38 additions and 33 deletions

View File

@@ -2,9 +2,9 @@ package bmumble
import (
"strconv"
"time"
"layeh.com/gumble/gumble"
"layeh.com/gumble/gumbleutil"
"github.com/42wim/matterbridge/bridge/config"
"github.com/42wim/matterbridge/bridge/helper"
@@ -20,6 +20,7 @@ func (b *Bmumble) handleTextMessage(event *gumble.TextMessageEvent) {
if err != nil {
b.Log.Error(err)
}
now := time.Now().UTC()
for i, part := range parts {
// Construct matterbridge message and pass on to the gateway
rmsg := config.Message{
@@ -31,14 +32,14 @@ func (b *Bmumble) handleTextMessage(event *gumble.TextMessageEvent) {
if part.Image == nil {
rmsg.Text = part.Text
} else {
fname := b.Account + "_" + strconv.FormatInt(now.UnixNano(), 10) + "_" + strconv.Itoa(i) + part.FileExtension
rmsg.Extra = make(map[string][]interface{})
if err = helper.HandleDownloadSize(b.Log, &rmsg, "image"+strconv.Itoa(i)+part.FileExtension, int64(len(part.Image)), b.General); err != nil {
if err = helper.HandleDownloadSize(b.Log, &rmsg, fname, int64(len(part.Image)), b.General); err != nil {
b.Log.WithError(err).Warn("not including image in message")
continue
}
helper.HandleDownloadData(b.Log, &rmsg, "image"+strconv.Itoa(i)+part.FileExtension, "", "", &part.Image, b.General)
helper.HandleDownloadData(b.Log, &rmsg, fname, "", "", &part.Image, b.General)
}
b.Log.Debugf("<= Remote message is %+v", rmsg)
b.Remote <- rmsg
}
}
@@ -82,20 +83,3 @@ func (b *Bmumble) handleUserChange(event *gumble.UserChangeEvent) {
func (b *Bmumble) handleDisconnect(event *gumble.DisconnectEvent) {
b.connected <- *event
}
func (b *Bmumble) makeDebugHandler() *gumbleutil.Listener {
handler := gumbleutil.Listener{
Connect: func(e *gumble.ConnectEvent) { b.Log.Debugf("Received connect event: %+v", e) },
Disconnect: func(e *gumble.DisconnectEvent) { b.Log.Debugf("Received disconnect event: %+v", e) },
TextMessage: func(e *gumble.TextMessageEvent) { b.Log.Debugf("Received textmessage event: %+v", e) },
UserChange: func(e *gumble.UserChangeEvent) { b.Log.Debugf("Received userchange event: %+v", e) },
ChannelChange: func(e *gumble.ChannelChangeEvent) { b.Log.Debugf("Received channelchange event: %+v", e) },
PermissionDenied: func(e *gumble.PermissionDeniedEvent) { b.Log.Debugf("Received permissiondenied event: %+v", e) },
UserList: func(e *gumble.UserListEvent) { b.Log.Debugf("Received userlist event: %+v", e) },
ACL: func(e *gumble.ACLEvent) { b.Log.Debugf("Received acl event: %+v", e) },
BanList: func(e *gumble.BanListEvent) { b.Log.Debugf("Received banlist event: %+v", e) },
ContextActionChange: func(e *gumble.ContextActionChangeEvent) { b.Log.Debugf("Received contextactionchange event: %+v", e) },
ServerConfig: func(e *gumble.ServerConfigEvent) { b.Log.Debugf("Received serverconfig event: %+v", e) },
}
return &handler
}

View File

@@ -49,7 +49,6 @@ func (b *Bmumble) tokenize(t *string) ([]MessagePart, error) {
tokens := p.FindStringSubmatch(remaining)
if tokens == nil {
b.Log.Debugf("Last text token: %s", remaining)
// no match -> remaining string is non-image text
if len(remaining) > 0 {
parts = append(parts, MessagePart{remaining, "", nil})
@@ -67,7 +66,6 @@ func (b *Bmumble) tokenize(t *string) ([]MessagePart, error) {
remaining = tokens[3]
continue
}
b.Log.Debugf("Raw data: URL: %s", uri)
err = b.decodeImage(uri, &parts)
if err != nil {
b.Log.WithError(err).Info("Decoding the image failed")
@@ -94,14 +92,43 @@ func (b *Bmumble) extractFiles(msg *config.Message) []config.Message {
for _, f := range msg.Extra["file"] {
fi := f.(config.FileInfo)
if fi.Data == nil || len(*fi.Data) == 0 {
// Mumble needs the raw data
b.Log.Info("Not forwarding file without local data")
if len(fi.URL) > 0 {
// no data, send link instead
imsg := config.Message{
Text: fmt.Sprintf(`<a href="%s">%s</a>`, fi.URL, fi.URL),
Channel: msg.Channel,
Username: msg.Username,
UserID: msg.UserID,
Account: msg.Account,
Protocol: msg.Protocol,
Timestamp: msg.Timestamp,
Event: "mumble_image",
}
messages = append(messages, imsg)
} else {
// Mumble needs the raw data
b.Log.Info("Not forwarding file without local data")
}
continue
}
mimeType := http.DetectContentType(*fi.Data)
if !strings.HasPrefix(mimeType, "image/") {
// Mumble only supports images
b.Log.Infof("Not forwarding file of type %s", mimeType)
// Mumble only supports images, send link instead
if len(fi.URL) > 0 {
imsg := config.Message{
Text: fmt.Sprintf(`<a href="%s">%s</a>`, fi.URL, fi.URL),
Channel: msg.Channel,
Username: msg.Username,
UserID: msg.UserID,
Account: msg.Account,
Protocol: msg.Protocol,
Timestamp: msg.Timestamp,
Event: "mumble_image",
}
messages = append(messages, imsg)
} else {
b.Log.Infof("Not forwarding file of type %s", mimeType)
}
continue
}
mimeType = strings.TrimSpace(strings.Split(mimeType, ";")[0])
@@ -120,7 +147,6 @@ func (b *Bmumble) extractFiles(msg *config.Message) []config.Message {
Account: msg.Account,
Protocol: msg.Protocol,
Timestamp: msg.Timestamp,
Extra: make(map[string][]interface{}),
Event: "mumble_image",
}
messages = append(messages, imsg)

View File

@@ -173,9 +173,6 @@ func (b *Bmumble) doConnect() error {
Disconnect: b.handleDisconnect,
UserChange: b.handleUserChange,
})
if b.GetInt("DebugLevel") == 0 {
gumbleConfig.Attach(b.makeDebugHandler())
}
gumbleConfig.Username = b.GetString("Nick")
if password := b.GetString("Password"); password != "" {
gumbleConfig.Password = password
@@ -225,7 +222,6 @@ func (b *Bmumble) processMessage(msg *config.Message) {
// If this is a specially generated image message, send it unmodified
if msg.Event == "mumble_image" {
if allowHTML {
b.Log.Debugf("Sending image message: %s%s", msg.Username, msg.Text)
b.client.Self.Channel.Send(msg.Username+msg.Text, false)
} else {
b.Log.Info("Can't send image, server does not allow HTML messages")
@@ -253,7 +249,6 @@ func (b *Bmumble) processMessage(msg *config.Message) {
}
// Send the individual lindes
for i := range msgLines {
b.Log.Debugf("Sending line: %s", msgLines[i])
b.client.Self.Channel.Send(msg.Username+msgLines[i], false)
}
}