diff --git a/bridge/telegram/telegram.go b/bridge/telegram/telegram.go index 1692a5c4..c7ead21f 100644 --- a/bridge/telegram/telegram.go +++ b/bridge/telegram/telegram.go @@ -8,7 +8,7 @@ import ( "github.com/42wim/matterbridge/bridge" "github.com/42wim/matterbridge/bridge/config" "github.com/42wim/matterbridge/bridge/helper" - "github.com/go-telegram-bot-api/telegram-bot-api" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api" ) const ( @@ -56,9 +56,6 @@ func (b *Btelegram) JoinChannel(channel config.ChannelInfo) error { } func (b *Btelegram) Send(msg config.Message) (string, error) { - var msgRes string - var msgErr error - b.Log.Debugf("=> Receiving %#v", msg) // get the chatid @@ -84,7 +81,7 @@ func (b *Btelegram) Send(msg config.Message) (string, error) { // Upload a file if it exists if msg.Extra != nil { for _, rmsg := range helper.HandleExtra(&msg, b.General) { - if msgRes, msgErr = b.sendMessage(chatid, rmsg.Username, rmsg.Text); msgErr != nil { + if _, msgErr := b.sendMessage(chatid, rmsg.Username, rmsg.Text); msgErr != nil { b.Log.Errorf("sendMessage failed: %s", msgErr) } } @@ -104,10 +101,10 @@ func (b *Btelegram) Send(msg config.Message) (string, error) { // Ignore empty text field needs for prevent double messages from whatsapp to telegram // when sending media with text caption if msg.Text != "" { - msgRes, msgErr = b.sendMessage(chatid, msg.Username, msg.Text) + return b.sendMessage(chatid, msg.Username, msg.Text) } - return msgRes, msgErr + return "", nil } func (b *Btelegram) getFileDirectURL(id string) string { diff --git a/bridge/whatsapp/handlers.go b/bridge/whatsapp/handlers.go index a0ef7b21..2873f0c4 100644 --- a/bridge/whatsapp/handlers.go +++ b/bridge/whatsapp/handlers.go @@ -39,16 +39,16 @@ func (b *Bwhatsapp) HandleTextMessage(message whatsapp.TextMessage) { } messageTime := time.Unix(int64(message.Info.Timestamp), 0) // TODO check how behaves between timezones - groupJid := message.Info.RemoteJid + groupJID := message.Info.RemoteJid - senderJid := message.Info.SenderJid - if len(senderJid) == 0 { + senderJID := message.Info.SenderJid + if len(senderJID) == 0 { // TODO workaround till https://github.com/Rhymen/go-whatsapp/issues/86 resolved - senderJid = *message.Info.Source.Participant + senderJID = *message.Info.Source.Participant } - // translate sender's Jid to the nicest username we can get - senderName := b.getSenderName(senderJid) + // translate sender's JID to the nicest username we can get + senderName := b.getSenderName(senderJID) if senderName == "" { senderName = "Someone" // don't expose telephone number } @@ -56,8 +56,8 @@ func (b *Bwhatsapp) HandleTextMessage(message whatsapp.TextMessage) { extText := message.Info.Source.Message.ExtendedTextMessage if extText != nil && extText.ContextInfo != nil && extText.ContextInfo.MentionedJid != nil { // handle user mentions - for _, mentionedJid := range extText.ContextInfo.MentionedJid { - numberAndSuffix := strings.SplitN(mentionedJid, "@", 2) + for _, mentionedJID := range extText.ContextInfo.MentionedJid { + numberAndSuffix := strings.SplitN(mentionedJID, "@", 2) // mentions comes as telephone numbers and we don't want to expose it to other bridges // replace it with something more meaninful to others @@ -69,13 +69,13 @@ func (b *Bwhatsapp) HandleTextMessage(message whatsapp.TextMessage) { } } - b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJid, b.Account) + b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJID, b.Account) rmsg := config.Message{ - UserID: senderJid, + UserID: senderJID, Username: senderName, Text: message.Text, Timestamp: messageTime, - Channel: groupJid, + Channel: groupJID, Account: b.Account, Protocol: b.Protocol, Extra: make(map[string][]interface{}), @@ -84,7 +84,7 @@ func (b *Bwhatsapp) HandleTextMessage(message whatsapp.TextMessage) { // Gateway string // will be added during message processing ID: message.Info.Id} - if avatarURL, exists := b.userAvatars[senderJid]; exists { + if avatarURL, exists := b.userAvatars[senderJID]; exists { rmsg.Avatar = avatarURL } @@ -104,26 +104,26 @@ func (b *Bwhatsapp) HandleImageMessage(message whatsapp.ImageMessage) { } messageTime := time.Unix(int64(message.Info.Timestamp), 0) // TODO check how behaves between timezones - groupJid := message.Info.RemoteJid + groupJID := message.Info.RemoteJid - senderJid := message.Info.SenderJid + senderJID := message.Info.SenderJid // if len(senderJid) == 0 { // // TODO workaround till https://github.com/Rhymen/go-whatsapp/issues/86 resolved // senderJid = *message.Info.Source.Participant // } // translate sender's Jid to the nicest username we can get - senderName := b.getSenderName(senderJid) + senderName := b.getSenderName(senderJID) if senderName == "" { senderName = "Someone" // don't expose telephone number } - b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJid, b.Account) + b.Log.Debugf("<= Sending message from %s on %s to gateway", senderJID, b.Account) rmsg := config.Message{ - UserID: senderJid, + UserID: senderJID, Username: senderName, Timestamp: messageTime, - Channel: groupJid, + Channel: groupJID, Account: b.Account, Protocol: b.Protocol, Extra: make(map[string][]interface{}), @@ -132,7 +132,7 @@ func (b *Bwhatsapp) HandleImageMessage(message whatsapp.ImageMessage) { // Gateway string // will be added during message processing ID: message.Info.Id} - if avatarURL, exists := b.userAvatars[senderJid]; exists { + if avatarURL, exists := b.userAvatars[senderJID]; exists { rmsg.Avatar = avatarURL } @@ -144,13 +144,13 @@ func (b *Bwhatsapp) HandleImageMessage(message whatsapp.ImageMessage) { } // Get file extension by mimetype - fileext, err := mime.ExtensionsByType(message.Type) + fileExt, err := mime.ExtensionsByType(message.Type) if err != nil { b.Log.Errorf("%v", err) return } - filename := fmt.Sprintf("%v%v", message.Info.Id, fileext[0]) + filename := fmt.Sprintf("%v%v", message.Info.Id, fileExt[0]) b.Log.Debugf("<= Image downloaded and unencrypted") diff --git a/bridge/whatsapp/whatsapp.go b/bridge/whatsapp/whatsapp.go index 54c1228f..a4d828e0 100644 --- a/bridge/whatsapp/whatsapp.go +++ b/bridge/whatsapp/whatsapp.go @@ -233,6 +233,66 @@ func (b *Bwhatsapp) JoinChannel(channel config.ChannelInfo) error { return nil } +// Post a document message from the bridge to WhatsApp +func (b *Bwhatsapp) PostDocumentMessage(msg config.Message, filetype string) (string, error) { + fi := msg.Extra["file"][0].(config.FileInfo) + + // Post document message + message := whatsapp.DocumentMessage{ + Info: whatsapp.MessageInfo{ + RemoteJid: msg.Channel, + }, + Title: fi.Name, + FileName: fi.Name, + Type: filetype, + Content: bytes.NewReader(*fi.Data), + } + + b.Log.Debugf("=> Sending %#v", msg) + + // create message ID + // TODO follow and act if https://github.com/Rhymen/go-whatsapp/issues/101 implemented + idBytes := make([]byte, 10) + if _, err := rand.Read(idBytes); err != nil { + b.Log.Warn(err.Error()) + } + + message.Info.Id = strings.ToUpper(hex.EncodeToString(idBytes)) + _, err := b.conn.Send(message) + + return message.Info.Id, err +} + +// Post an image message from the bridge to WhatsApp +// Handle, for sure image/jpeg, image/png and image/gif MIME types +func (b *Bwhatsapp) PostImageMessage(msg config.Message, filetype string) (string, error) { + fi := msg.Extra["file"][0].(config.FileInfo) + + // Post image message + message := whatsapp.ImageMessage{ + Info: whatsapp.MessageInfo{ + RemoteJid: msg.Channel, + }, + Type: filetype, + Caption: msg.Username + fi.Comment, + Content: bytes.NewReader(*fi.Data), + } + + b.Log.Debugf("=> Sending %#v", msg) + + // create message ID + // TODO follow and act if https://github.com/Rhymen/go-whatsapp/issues/101 implemented + idBytes := make([]byte, 10) + if _, err := rand.Read(idBytes); err != nil { + b.Log.Warn(err.Error()) + } + + message.Info.Id = strings.ToUpper(hex.EncodeToString(idBytes)) + _, err := b.conn.Send(message) + + return message.Info.Id, err +} + // Send a message from the bridge to WhatsApp // Required implementation of the Bridger interface // https://github.com/42wim/matterbridge/blob/2cfd880cdb0df29771bf8f31df8d990ab897889d/bridge/bridge.go#L11-L16 @@ -265,63 +325,18 @@ func (b *Bwhatsapp) Send(msg config.Message) (string, error) { // Handle Upload a file if msg.Extra["file"] != nil { fi := msg.Extra["file"][0].(config.FileInfo) - filetype := mime.TypeByExtension(filepath.Ext(fi.Name)) b.Log.Debugf("Extra file is %#v", filetype) // TODO: add different types // TODO: add webp conversion - if filetype == "image/jpeg" || filetype == "image/png" || filetype == "image/gif" { - // Post image message - message := whatsapp.ImageMessage{ - Info: whatsapp.MessageInfo{ - RemoteJid: msg.Channel, - }, - Type: filetype, - Caption: msg.Username + fi.Comment, - Content: bytes.NewReader(*fi.Data), - } - - b.Log.Debugf("=> Sending %#v", msg) - - // create message ID - // TODO follow and act if https://github.com/Rhymen/go-whatsapp/issues/101 implemented - idbytes := make([]byte, 10) - if _, err := rand.Read(idbytes); err != nil { - b.Log.Warn(err.Error()) - } - - message.Info.Id = strings.ToUpper(hex.EncodeToString(idbytes)) - _, err := b.conn.Send(message) - - return message.Info.Id, err + switch filetype { + case "image/jpeg", "image/png", "image/gif": + return b.PostImageMessage(msg, filetype) + default: + return b.PostDocumentMessage(msg, filetype) } - - // Post document message - message := whatsapp.DocumentMessage{ - Info: whatsapp.MessageInfo{ - RemoteJid: msg.Channel, - }, - Title: fi.Name, - FileName: fi.Name, - Type: filetype, - Content: bytes.NewReader(*fi.Data), - } - - b.Log.Debugf("=> Sending %#v", msg) - - // create message ID - // TODO follow and act if https://github.com/Rhymen/go-whatsapp/issues/101 implemented - idbytes := make([]byte, 10) - if _, err := rand.Read(idbytes); err != nil { - b.Log.Warn(err.Error()) - } - - message.Info.Id = strings.ToUpper(hex.EncodeToString(idbytes)) - _, err := b.conn.Send(message) - - return message.Info.Id, err } // Post text message @@ -336,11 +351,11 @@ func (b *Bwhatsapp) Send(msg config.Message) (string, error) { // create message ID // TODO follow and act if https://github.com/Rhymen/go-whatsapp/issues/101 implemented - idbytes := make([]byte, 10) - if _, err := rand.Read(idbytes); err != nil { + idBytes := make([]byte, 10) + if _, err := rand.Read(idBytes); err != nil { b.Log.Warn(err.Error()) } - message.Info.Id = strings.ToUpper(hex.EncodeToString(idbytes)) + message.Info.Id = strings.ToUpper(hex.EncodeToString(idBytes)) _, err := b.conn.Send(message) diff --git a/go.mod b/go.mod index 8a4fad3b..a0ec5fb9 100644 --- a/go.mod +++ b/go.mod @@ -67,10 +67,11 @@ require ( go.uber.org/zap v1.9.1 // indirect golang.org/x/image v0.0.0-20190220214146-31aff87c08e9 golang.org/x/net v0.0.0-20190110200230-915654e7eabc // indirect - golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect golang.org/x/sys v0.0.0-20190222171317-cd391775e71e // indirect gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect gopkg.in/fsnotify.v1 v1.4.7 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect ) + +go 1.13