summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorilmaisin <iiro.laiho@iki.fi>2022-12-15 00:47:30 +0200
committerGitHub <noreply@github.com>2022-12-14 23:47:30 +0100
commit4cf313c4c6b25d19c4128f8e79d22d9a2a001cf0 (patch)
treef017c72eee1fcae1c36850f43dbc35698d0744c3
parent91353d0a4daba4d6453deb718848acddf51d7dc4 (diff)
downloadmatterbridge-msglm-4cf313c4c6b25d19c4128f8e79d22d9a2a001cf0.tar.gz
matterbridge-msglm-4cf313c4c6b25d19c4128f8e79d22d9a2a001cf0.tar.bz2
matterbridge-msglm-4cf313c4c6b25d19c4128f8e79d22d9a2a001cf0.zip
Fix the "Someone" nickname problem (whatsapp) (#1931)
* Apply patch to work around the "Someone" nickname problem * Code cleanup (whatsapp) * Cleanup * Code cleanup (whatsapp) * Re-examine if sender exists * Cleanup (whatsapp)
-rw-r--r--bridge/whatsappmulti/handlers.go16
-rw-r--r--bridge/whatsappmulti/helpers.go79
2 files changed, 50 insertions, 45 deletions
diff --git a/bridge/whatsappmulti/handlers.go b/bridge/whatsappmulti/handlers.go
index 379699d9..34dce471 100644
--- a/bridge/whatsappmulti/handlers.go
+++ b/bridge/whatsappmulti/handlers.go
@@ -51,10 +51,7 @@ func (b *Bwhatsapp) handleTextMessage(messageInfo types.MessageInfo, msg *proto.
senderJID := messageInfo.Sender
channel := messageInfo.Chat
- senderName := b.getSenderName(messageInfo.Sender)
- if senderName == "" {
- senderName = "Someone" // don't expose telephone number
- }
+ senderName := b.getSenderName(messageInfo)
if msg.GetExtendedTextMessage() == nil && msg.GetConversation() == "" {
b.Log.Debugf("message without text content? %#v", msg)
@@ -82,9 +79,6 @@ func (b *Bwhatsapp) handleTextMessage(messageInfo types.MessageInfo, msg *proto.
// mentions comes as telephone numbers and we don't want to expose it to other bridges
// replace it with something more meaninful to others
mention := b.getSenderNotify(types.NewJID(numberAndSuffix[0], types.DefaultUserServer))
- if mention == "" {
- mention = "someone"
- }
text = strings.Replace(text, "@"+numberAndSuffix[0], "@"+mention, 1)
}
@@ -118,7 +112,7 @@ func (b *Bwhatsapp) handleImageMessage(msg *events.Message) {
imsg := msg.Message.GetImageMessage()
senderJID := msg.Info.Sender
- senderName := b.getSenderName(senderJID)
+ senderName := b.getSenderName(msg.Info)
ci := imsg.GetContextInfo()
if senderJID == (types.JID{}) && ci.Participant != nil {
@@ -181,7 +175,7 @@ func (b *Bwhatsapp) handleVideoMessage(msg *events.Message) {
imsg := msg.Message.GetVideoMessage()
senderJID := msg.Info.Sender
- senderName := b.getSenderName(senderJID)
+ senderName := b.getSenderName(msg.Info)
ci := imsg.GetContextInfo()
if senderJID == (types.JID{}) && ci.Participant != nil {
@@ -238,7 +232,7 @@ func (b *Bwhatsapp) handleAudioMessage(msg *events.Message) {
imsg := msg.Message.GetAudioMessage()
senderJID := msg.Info.Sender
- senderName := b.getSenderName(senderJID)
+ senderName := b.getSenderName(msg.Info)
ci := imsg.GetContextInfo()
if senderJID == (types.JID{}) && ci.Participant != nil {
@@ -295,7 +289,7 @@ func (b *Bwhatsapp) handleDocumentMessage(msg *events.Message) {
imsg := msg.Message.GetDocumentMessage()
senderJID := msg.Info.Sender
- senderName := b.getSenderName(senderJID)
+ senderName := b.getSenderName(msg.Info)
ci := imsg.GetContextInfo()
if senderJID == (types.JID{}) && ci.Participant != nil {
diff --git a/bridge/whatsappmulti/helpers.go b/bridge/whatsappmulti/helpers.go
index 5b1ec86c..c3c9d018 100644
--- a/bridge/whatsappmulti/helpers.go
+++ b/bridge/whatsappmulti/helpers.go
@@ -18,24 +18,7 @@ type ProfilePicInfo struct {
Status int16 `json:"status"`
}
-func (b *Bwhatsapp) getSenderName(senderJid types.JID) string {
- if sender, exists := b.contacts[senderJid]; exists {
- if sender.FullName != "" {
- return sender.FullName
- }
- // if user is not in phone contacts
- // it is the most obvious scenario unless you sync your phone contacts with some remote updated source
- // users can change it in their WhatsApp settings -> profile -> click on Avatar
- if sender.PushName != "" {
- return sender.PushName
- }
-
- if sender.FirstName != "" {
- return sender.FirstName
- }
- }
-
- // try to reload this contact
+func (b *Bwhatsapp) reloadContacts(){
if _, err := b.wc.Store.Contacts.GetAllContacts(); err != nil {
b.Log.Errorf("error on update of contacts: %v", err)
}
@@ -48,32 +31,60 @@ func (b *Bwhatsapp) getSenderName(senderJid types.JID) string {
if len(allcontacts) > 0 {
b.contacts = allcontacts
}
+}
+
+func (b *Bwhatsapp) getSenderName(info types.MessageInfo) string {
+ // Parse AD JID
+ var senderJid types.JID
+ senderJid.User, senderJid.Server = info.Sender.User, info.Sender.Server
+
+ sender, exists := b.contacts[senderJid]
+
+ if !exists || (sender.FullName == "" && sender.FirstName == "") {
+ b.reloadContacts() // Contacts may need to be reloaded
+ sender, exists = b.contacts[senderJid]
+ }
- if sender, exists := b.contacts[senderJid]; exists {
- if sender.FullName != "" {
- return sender.FullName
- }
- // if user is not in phone contacts
- // it is the most obvious scenario unless you sync your phone contacts with some remote updated source
- // users can change it in their WhatsApp settings -> profile -> click on Avatar
- if sender.PushName != "" {
- return sender.PushName
- }
-
- if sender.FirstName != "" {
- return sender.FirstName
- }
+ if exists && sender.FullName != "" {
+ return sender.FullName
+ }
+
+ if info.PushName != "" {
+ return info.PushName
}
+ if exists && sender.FirstName != "" {
+ return sender.FirstName
+ }
+
return "Someone"
}
func (b *Bwhatsapp) getSenderNotify(senderJid types.JID) string {
- if sender, exists := b.contacts[senderJid]; exists {
+ sender, exists := b.contacts[senderJid]
+
+ if !exists || (sender.FullName == "" && sender.PushName == "" && sender.FirstName == "") {
+ b.reloadContacts() // Contacts may need to be reloaded
+ sender, exists = b.contacts[senderJid]
+ }
+
+ if !exists {
+ return "someone"
+ }
+
+ if exists && sender.FullName != "" {
+ return sender.FullName
+ }
+
+ if exists && sender.PushName != "" {
return sender.PushName
}
- return ""
+ if exists && sender.FirstName != "" {
+ return sender.FirstName
+ }
+
+ return "someone"
}
func (b *Bwhatsapp) GetProfilePicThumb(jid string) (*types.ProfilePictureInfo, error) {