@@ -64,25 +64,39 @@ func (cli *Client) addRecentMessage(to types.JID, id types.MessageID, wa *waE2E.
6464
6565func (cli * Client ) getRecentMessage (to types.JID , id types.MessageID ) RecentMessage {
6666 cli .recentMessagesLock .RLock ()
67- msg , _ := cli .recentMessagesMap [recentMessageKey {to , id }]
68- cli .recentMessagesLock .RUnlock ()
69- return msg
67+ defer cli .recentMessagesLock .RUnlock ()
68+ return cli .recentMessagesMap [recentMessageKey {to , id }]
7069}
7170
72- func (cli * Client ) getMessageForRetry (ctx context.Context , receipt * events.Receipt , messageID types.MessageID ) (RecentMessage , error ) {
71+ func (cli * Client ) getMessageForRetry (ctx context.Context , receipt * events.Receipt , messageID types.MessageID ) (* RecentMessage , error ) {
7372 msg := cli .getRecentMessage (receipt .Chat , messageID )
74- if msg .IsEmpty () {
75- waMsg := cli .GetMessageForRetry (receipt .Sender , receipt .Chat , messageID )
76- if waMsg == nil {
77- return RecentMessage {}, fmt .Errorf ("couldn't find message %s" , messageID )
78- } else {
79- cli .Log .Debugf ("Found message in GetMessageForRetry to accept retry receipt for %s/%s from %s" , receipt .Chat , messageID , receipt .Sender )
80- }
81- msg = RecentMessage {wa : waMsg }
82- } else {
73+ if ! msg .IsEmpty () {
8374 cli .Log .Debugf ("Found message in local cache to accept retry receipt for %s/%s from %s" , receipt .Chat , messageID , receipt .Sender )
75+ return & msg , nil
76+ }
77+ var altChat types.JID
78+ var err error
79+ switch receipt .Chat .Server {
80+ case types .DefaultUserServer :
81+ altChat , err = cli .Store .LIDs .GetLIDForPN (ctx , receipt .Chat )
82+ case types .HiddenUserServer :
83+ altChat , err = cli .Store .LIDs .GetPNForLID (ctx , receipt .Chat )
84+ }
85+ if err != nil {
86+ return nil , fmt .Errorf ("failed to get alternate JID for %s: %w" , receipt .Chat , err )
87+ } else if ! altChat .IsEmpty () {
88+ msg = cli .getRecentMessage (altChat , messageID )
89+ if ! msg .IsEmpty () {
90+ cli .Log .Debugf ("Found message in local cache with alternate chat JID %s to accept retry receipt for %s/%s from %s" , altChat , receipt .Chat , messageID , receipt .Sender )
91+ return & msg , nil
92+ }
93+ }
94+ waMsg := cli .GetMessageForRetry (receipt .Sender , receipt .Chat , messageID )
95+ if waMsg != nil {
96+ cli .Log .Debugf ("Found message in GetMessageForRetry to accept retry receipt for %s/%s from %s" , receipt .Chat , messageID , receipt .Sender )
97+ return & RecentMessage {wa : waMsg }, nil
8498 }
85- return msg , nil
99+ return nil , nil
86100}
87101
88102const recreateSessionTimeout = 1 * time .Hour
@@ -127,6 +141,8 @@ func (cli *Client) handleRetryReceipt(ctx context.Context, receipt *events.Recei
127141 msg , err := cli .getMessageForRetry (ctx , receipt , messageID )
128142 if err != nil {
129143 return err
144+ } else if msg == nil {
145+ return fmt .Errorf ("couldn't find message %s" , messageID )
130146 }
131147 var fbConsumerMsg * waConsumerApplication.ConsumerApplication
132148 if msg .fb != nil {
0 commit comments