From c404dfbbc550e01f9b9eb400b32e849aba24ee3d Mon Sep 17 00:00:00 2001 From: Douglas Andrade Date: Tue, 8 Sep 2026 18:16:40 -0300 Subject: [PATCH 1/2] fix(whatsmeow): rotear Chat para DestinationJID em mensagens outbound multi-device --- pkg/whatsmeow/service/whatsmeow.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pkg/whatsmeow/service/whatsmeow.go b/pkg/whatsmeow/service/whatsmeow.go index 366f0edb..a8e0c4b2 100644 --- a/pkg/whatsmeow/service/whatsmeow.go +++ b/pkg/whatsmeow/service/whatsmeow.go @@ -1223,6 +1223,17 @@ func (mycli *MyClient) myEventHandler(rawEvt interface{}) { } } + // Trata mensagens enviadas em multi-device (celular primário / WhatsApp Web) + // O whatsmeow preenche evt.Info.Chat como o próprio número da empresa e armazena o lead de destino + // em evt.Info.DeviceSentMeta.DestinationJID. + if evt.Info.IsFromMe && evt.Info.DeviceSentMeta != nil && evt.Info.DeviceSentMeta.DestinationJID != "" && !evt.Info.IsGroup { + if destJID, err := types.ParseJID(evt.Info.DeviceSentMeta.DestinationJID); err == nil && !destJID.IsEmpty() { + mycli.loggerWrapper.GetLogger(mycli.userID).LogInfo("[%s] Outbound multi-device message detected - routing Chat from %s to DestinationJID %s", + mycli.userID, evt.Info.Chat.String(), destJID.String()) + evt.Info.Chat = destJID + } + } + // Auto-marca mensagens como lidas se configurado if mycli.Instance.ReadMessages && !evt.Info.IsFromMe { go func() { @@ -1266,6 +1277,15 @@ func (mycli *MyClient) myEventHandler(rawEvt interface{}) { dataMap = make(map[string]interface{}) } + if evt.Info.IsFromMe && evt.Info.DeviceSentMeta != nil && evt.Info.DeviceSentMeta.DestinationJID != "" { + dataMap["recipient"] = evt.Info.DeviceSentMeta.DestinationJID + dataMap["Recipient"] = evt.Info.DeviceSentMeta.DestinationJID + if !evt.Info.IsGroup { + dataMap["chat"] = evt.Info.Chat.String() + dataMap["Chat"] = evt.Info.Chat.String() + } + } + referral := extractReferralFromMessage(evt.Message) if evt.Message.GetPollUpdateMessage() != nil { From f58565c217aa2b2ecaa52feca1ed1905fab5c758 Mon Sep 17 00:00:00 2001 From: Douglas Andrade Date: Tue, 8 Sep 2026 18:24:27 -0300 Subject: [PATCH 2/2] fix(whatsmeow): validar DestinationJID antes de popular recipient e rotear chat --- pkg/whatsmeow/service/whatsmeow.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/pkg/whatsmeow/service/whatsmeow.go b/pkg/whatsmeow/service/whatsmeow.go index a8e0c4b2..4e7f1b1f 100644 --- a/pkg/whatsmeow/service/whatsmeow.go +++ b/pkg/whatsmeow/service/whatsmeow.go @@ -1226,11 +1226,18 @@ func (mycli *MyClient) myEventHandler(rawEvt interface{}) { // Trata mensagens enviadas em multi-device (celular primário / WhatsApp Web) // O whatsmeow preenche evt.Info.Chat como o próprio número da empresa e armazena o lead de destino // em evt.Info.DeviceSentMeta.DestinationJID. - if evt.Info.IsFromMe && evt.Info.DeviceSentMeta != nil && evt.Info.DeviceSentMeta.DestinationJID != "" && !evt.Info.IsGroup { + var validDestJID *types.JID + if evt.Info.IsFromMe && evt.Info.DeviceSentMeta != nil && evt.Info.DeviceSentMeta.DestinationJID != "" { if destJID, err := types.ParseJID(evt.Info.DeviceSentMeta.DestinationJID); err == nil && !destJID.IsEmpty() { - mycli.loggerWrapper.GetLogger(mycli.userID).LogInfo("[%s] Outbound multi-device message detected - routing Chat from %s to DestinationJID %s", - mycli.userID, evt.Info.Chat.String(), destJID.String()) - evt.Info.Chat = destJID + validDestJID = &destJID + if !evt.Info.IsGroup { + mycli.loggerWrapper.GetLogger(mycli.userID).LogInfo("[%s] Outbound multi-device message detected - routing Chat from %s to DestinationJID %s", + mycli.userID, evt.Info.Chat.String(), destJID.String()) + evt.Info.Chat = destJID + } + } else if err != nil { + mycli.loggerWrapper.GetLogger(mycli.userID).LogWarn("[%s] Failed to parse DestinationJID '%s': %v", + mycli.userID, evt.Info.DeviceSentMeta.DestinationJID, err) } } @@ -1277,12 +1284,13 @@ func (mycli *MyClient) myEventHandler(rawEvt interface{}) { dataMap = make(map[string]interface{}) } - if evt.Info.IsFromMe && evt.Info.DeviceSentMeta != nil && evt.Info.DeviceSentMeta.DestinationJID != "" { - dataMap["recipient"] = evt.Info.DeviceSentMeta.DestinationJID - dataMap["Recipient"] = evt.Info.DeviceSentMeta.DestinationJID + if validDestJID != nil { + destStr := validDestJID.String() + dataMap["recipient"] = destStr + dataMap["Recipient"] = destStr if !evt.Info.IsGroup { - dataMap["chat"] = evt.Info.Chat.String() - dataMap["Chat"] = evt.Info.Chat.String() + dataMap["chat"] = destStr + dataMap["Chat"] = destStr } }