Take code review remarks into account

This commit is contained in:
Guillaume Lazzara
2020-01-01 13:33:59 +01:00
parent 390a33a32a
commit 2011c23edd
4 changed files with 95 additions and 82 deletions

View File

@@ -8,7 +8,7 @@ import (
"github.com/42wim/matterbridge/bridge" "github.com/42wim/matterbridge/bridge"
"github.com/42wim/matterbridge/bridge/config" "github.com/42wim/matterbridge/bridge/config"
"github.com/42wim/matterbridge/bridge/helper" "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 ( const (
@@ -56,9 +56,6 @@ func (b *Btelegram) JoinChannel(channel config.ChannelInfo) error {
} }
func (b *Btelegram) Send(msg config.Message) (string, error) { func (b *Btelegram) Send(msg config.Message) (string, error) {
var msgRes string
var msgErr error
b.Log.Debugf("=> Receiving %#v", msg) b.Log.Debugf("=> Receiving %#v", msg)
// get the chatid // get the chatid
@@ -84,7 +81,7 @@ func (b *Btelegram) Send(msg config.Message) (string, error) {
// Upload a file if it exists // Upload a file if it exists
if msg.Extra != nil { if msg.Extra != nil {
for _, rmsg := range helper.HandleExtra(&msg, b.General) { 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) 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 // Ignore empty text field needs for prevent double messages from whatsapp to telegram
// when sending media with text caption // when sending media with text caption
if msg.Text != "" { 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 { func (b *Btelegram) getFileDirectURL(id string) string {

View File

@@ -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 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 { if len(senderJID) == 0 {
// TODO workaround till https://github.com/Rhymen/go-whatsapp/issues/86 resolved // 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 // translate sender's JID to the nicest username we can get
senderName := b.getSenderName(senderJid) senderName := b.getSenderName(senderJID)
if senderName == "" { if senderName == "" {
senderName = "Someone" // don't expose telephone number senderName = "Someone" // don't expose telephone number
} }
@@ -56,8 +56,8 @@ func (b *Bwhatsapp) HandleTextMessage(message whatsapp.TextMessage) {
extText := message.Info.Source.Message.ExtendedTextMessage extText := message.Info.Source.Message.ExtendedTextMessage
if extText != nil && extText.ContextInfo != nil && extText.ContextInfo.MentionedJid != nil { if extText != nil && extText.ContextInfo != nil && extText.ContextInfo.MentionedJid != nil {
// handle user mentions // handle user mentions
for _, mentionedJid := range extText.ContextInfo.MentionedJid { for _, mentionedJID := range extText.ContextInfo.MentionedJid {
numberAndSuffix := strings.SplitN(mentionedJid, "@", 2) numberAndSuffix := strings.SplitN(mentionedJID, "@", 2)
// mentions comes as telephone numbers and we don't want to expose it to other bridges // mentions comes as telephone numbers and we don't want to expose it to other bridges
// replace it with something more meaninful to others // 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{ rmsg := config.Message{
UserID: senderJid, UserID: senderJID,
Username: senderName, Username: senderName,
Text: message.Text, Text: message.Text,
Timestamp: messageTime, Timestamp: messageTime,
Channel: groupJid, Channel: groupJID,
Account: b.Account, Account: b.Account,
Protocol: b.Protocol, Protocol: b.Protocol,
Extra: make(map[string][]interface{}), Extra: make(map[string][]interface{}),
@@ -84,7 +84,7 @@ func (b *Bwhatsapp) HandleTextMessage(message whatsapp.TextMessage) {
// Gateway string // will be added during message processing // Gateway string // will be added during message processing
ID: message.Info.Id} ID: message.Info.Id}
if avatarURL, exists := b.userAvatars[senderJid]; exists { if avatarURL, exists := b.userAvatars[senderJID]; exists {
rmsg.Avatar = avatarURL 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 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 { // if len(senderJid) == 0 {
// // TODO workaround till https://github.com/Rhymen/go-whatsapp/issues/86 resolved // // 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 // translate sender's Jid to the nicest username we can get
senderName := b.getSenderName(senderJid) senderName := b.getSenderName(senderJID)
if senderName == "" { if senderName == "" {
senderName = "Someone" // don't expose telephone number 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{ rmsg := config.Message{
UserID: senderJid, UserID: senderJID,
Username: senderName, Username: senderName,
Timestamp: messageTime, Timestamp: messageTime,
Channel: groupJid, Channel: groupJID,
Account: b.Account, Account: b.Account,
Protocol: b.Protocol, Protocol: b.Protocol,
Extra: make(map[string][]interface{}), Extra: make(map[string][]interface{}),
@@ -132,7 +132,7 @@ func (b *Bwhatsapp) HandleImageMessage(message whatsapp.ImageMessage) {
// Gateway string // will be added during message processing // Gateway string // will be added during message processing
ID: message.Info.Id} ID: message.Info.Id}
if avatarURL, exists := b.userAvatars[senderJid]; exists { if avatarURL, exists := b.userAvatars[senderJID]; exists {
rmsg.Avatar = avatarURL rmsg.Avatar = avatarURL
} }
@@ -144,13 +144,13 @@ func (b *Bwhatsapp) HandleImageMessage(message whatsapp.ImageMessage) {
} }
// Get file extension by mimetype // Get file extension by mimetype
fileext, err := mime.ExtensionsByType(message.Type) fileExt, err := mime.ExtensionsByType(message.Type)
if err != nil { if err != nil {
b.Log.Errorf("%v", err) b.Log.Errorf("%v", err)
return 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") b.Log.Debugf("<= Image downloaded and unencrypted")

View File

@@ -233,6 +233,66 @@ func (b *Bwhatsapp) JoinChannel(channel config.ChannelInfo) error {
return nil 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 // Send a message from the bridge to WhatsApp
// Required implementation of the Bridger interface // Required implementation of the Bridger interface
// https://github.com/42wim/matterbridge/blob/2cfd880cdb0df29771bf8f31df8d990ab897889d/bridge/bridge.go#L11-L16 // 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 // Handle Upload a file
if msg.Extra["file"] != nil { if msg.Extra["file"] != nil {
fi := msg.Extra["file"][0].(config.FileInfo) fi := msg.Extra["file"][0].(config.FileInfo)
filetype := mime.TypeByExtension(filepath.Ext(fi.Name)) filetype := mime.TypeByExtension(filepath.Ext(fi.Name))
b.Log.Debugf("Extra file is %#v", filetype) b.Log.Debugf("Extra file is %#v", filetype)
// TODO: add different types // TODO: add different types
// TODO: add webp conversion // TODO: add webp conversion
if filetype == "image/jpeg" || filetype == "image/png" || filetype == "image/gif" { switch filetype {
// Post image message case "image/jpeg", "image/png", "image/gif":
message := whatsapp.ImageMessage{ return b.PostImageMessage(msg, filetype)
Info: whatsapp.MessageInfo{ default:
RemoteJid: msg.Channel, return b.PostDocumentMessage(msg, filetype)
},
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
} }
// 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 // Post text message
@@ -336,11 +351,11 @@ func (b *Bwhatsapp) Send(msg config.Message) (string, error) {
// create message ID // create message ID
// TODO follow and act if https://github.com/Rhymen/go-whatsapp/issues/101 implemented // TODO follow and act if https://github.com/Rhymen/go-whatsapp/issues/101 implemented
idbytes := make([]byte, 10) idBytes := make([]byte, 10)
if _, err := rand.Read(idbytes); err != nil { if _, err := rand.Read(idBytes); err != nil {
b.Log.Warn(err.Error()) 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) _, err := b.conn.Send(message)

3
go.mod
View File

@@ -67,10 +67,11 @@ require (
go.uber.org/zap v1.9.1 // indirect go.uber.org/zap v1.9.1 // indirect
golang.org/x/image v0.0.0-20190220214146-31aff87c08e9 golang.org/x/image v0.0.0-20190220214146-31aff87c08e9
golang.org/x/net v0.0.0-20190110200230-915654e7eabc // indirect 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 golang.org/x/sys v0.0.0-20190222171317-cd391775e71e // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/fsnotify.v1 v1.4.7 // indirect gopkg.in/fsnotify.v1 v1.4.7 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
) )
go 1.13