diff options
Diffstat (limited to 'vendor/go.mau.fi/whatsmeow/retry.go')
-rw-r--r-- | vendor/go.mau.fi/whatsmeow/retry.go | 72 |
1 files changed, 65 insertions, 7 deletions
diff --git a/vendor/go.mau.fi/whatsmeow/retry.go b/vendor/go.mau.fi/whatsmeow/retry.go index 95104c8f..a729cdab 100644 --- a/vendor/go.mau.fi/whatsmeow/retry.go +++ b/vendor/go.mau.fi/whatsmeow/retry.go @@ -169,7 +169,11 @@ func (cli *Client) handleRetryReceipt(receipt *events.Receipt, node *waBinary.No return fmt.Errorf("didn't get prekey bundle for %s (response size: %d)", senderAD, len(keys)) } } - encrypted, includeDeviceIdentity, err := cli.encryptMessageForDevice(plaintext, receipt.Sender, bundle) + encAttrs := waBinary.Attrs{} + if mediaType := getMediaTypeFromMessage(msg); mediaType != "" { + encAttrs["mediatype"] = mediaType + } + encrypted, includeDeviceIdentity, err := cli.encryptMessageForDevice(plaintext, receipt.Sender, bundle, encAttrs) if err != nil { return fmt.Errorf("failed to encrypt message for retry: %w", err) } @@ -193,14 +197,10 @@ func (cli *Client) handleRetryReceipt(receipt *events.Receipt, node *waBinary.No if edit, ok := node.Attrs["edit"]; ok { attrs["edit"] = edit } - content := []waBinary.Node{*encrypted} - if includeDeviceIdentity { - content = append(content, cli.makeDeviceIdentityNode()) - } err = cli.sendNode(waBinary.Node{ Tag: "message", Attrs: attrs, - Content: content, + Content: cli.getMessageContent(*encrypted, msg, attrs, includeDeviceIdentity), }) if err != nil { return fmt.Errorf("failed to send retry message: %w", err) @@ -209,8 +209,63 @@ func (cli *Client) handleRetryReceipt(receipt *events.Receipt, node *waBinary.No return nil } +func (cli *Client) cancelDelayedRequestFromPhone(msgID types.MessageID) { + if !cli.AutomaticMessageRerequestFromPhone { + return + } + cli.pendingPhoneRerequestsLock.RLock() + cancelPendingRequest, ok := cli.pendingPhoneRerequests[msgID] + if ok { + cancelPendingRequest() + } + cli.pendingPhoneRerequestsLock.RUnlock() +} + +// RequestFromPhoneDelay specifies how long to wait for the sender to resend the message before requesting from your phone. +// This is only used if Client.AutomaticMessageRerequestFromPhone is true. +var RequestFromPhoneDelay = 5 * time.Second + +func (cli *Client) delayedRequestMessageFromPhone(info *types.MessageInfo) { + if !cli.AutomaticMessageRerequestFromPhone { + return + } + cli.pendingPhoneRerequestsLock.Lock() + _, alreadyRequesting := cli.pendingPhoneRerequests[info.ID] + if alreadyRequesting { + cli.pendingPhoneRerequestsLock.Unlock() + return + } + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + cli.pendingPhoneRerequests[info.ID] = cancel + cli.pendingPhoneRerequestsLock.Unlock() + + defer func() { + cli.pendingPhoneRerequestsLock.Lock() + delete(cli.pendingPhoneRerequests, info.ID) + cli.pendingPhoneRerequestsLock.Unlock() + }() + select { + case <-time.After(RequestFromPhoneDelay): + case <-ctx.Done(): + cli.Log.Debugf("Cancelled delayed request for message %s from phone", info.ID) + return + } + _, err := cli.SendMessage( + ctx, + cli.Store.ID.ToNonAD(), + cli.BuildUnavailableMessageRequest(info.Chat, info.Sender, info.ID), + SendRequestExtra{Peer: true}, + ) + if err != nil { + cli.Log.Warnf("Failed to send request for unavailable message %s to phone: %v", info.ID, err) + } else { + cli.Log.Debugf("Requested message %s from phone", info.ID) + } +} + // sendRetryReceipt sends a retry receipt for an incoming message. -func (cli *Client) sendRetryReceipt(node *waBinary.Node, forceIncludeIdentity bool) { +func (cli *Client) sendRetryReceipt(node *waBinary.Node, info *types.MessageInfo, forceIncludeIdentity bool) { id, _ := node.Attrs["id"].(string) children := node.GetChildren() var retryCountInMsg int @@ -231,6 +286,9 @@ func (cli *Client) sendRetryReceipt(node *waBinary.Node, forceIncludeIdentity bo cli.Log.Warnf("Not sending any more retry receipts for %s", id) return } + if retryCount == 1 { + go cli.delayedRequestMessageFromPhone(info) + } var registrationIDBytes [4]byte binary.BigEndian.PutUint32(registrationIDBytes[:], cli.Store.RegistrationID) |