media: add better error when media couldn't be retrieved due to WA deleting it from their servers

This commit is contained in:
Sumner Evans 2022-04-05 15:35:02 -06:00
parent eb0a13a753
commit 83d397900f
No known key found for this signature in database
GPG key ID: 8904527AB50022FD

View file

@ -1900,7 +1900,7 @@ func shallowCopyMap(data map[string]interface{}) map[string]interface{} {
return newMap
}
func (portal *Portal) makeMediaBridgeFailureMessage(info *types.MessageInfo, bridgeErr error, converted *ConvertedMessage, keys *FailedMediaKeys) *ConvertedMessage {
func (portal *Portal) makeMediaBridgeFailureMessage(info *types.MessageInfo, bridgeErr error, converted *ConvertedMessage, keys *FailedMediaKeys, userFriendlyError string) *ConvertedMessage {
portal.log.Errorfln("Failed to bridge media for %s: %v", info.ID, bridgeErr)
if keys != nil {
meta := &FailedMediaMeta{
@ -1913,9 +1913,13 @@ func (portal *Portal) makeMediaBridgeFailureMessage(info *types.MessageInfo, bri
portal.mediaErrorCache[info.ID] = meta
}
converted.Type = event.EventMessage
body := userFriendlyError
if body == "" {
body = fmt.Sprintf("Failed to bridge media: %v", bridgeErr)
}
converted.Content = &event.MessageEventContent{
MsgType: event.MsgNotice,
Body: fmt.Sprintf("Failed to bridge media: %v", bridgeErr),
Body: body,
}
return converted
}
@ -2164,24 +2168,24 @@ func (portal *Portal) convertMediaMessage(intent *appservice.IntentAPI, source *
Type: whatsmeow.GetMediaType(msg),
SHA256: msg.GetFileSha256(),
EncSHA256: msg.GetFileEncSha256(),
})
}, "Old photo or attachment. This will sync in a future update.")
} else if errors.Is(err, whatsmeow.ErrNoURLPresent) {
portal.log.Debugfln("No URL present error for media message %s, ignoring...", info.ID)
return nil
} else if errors.Is(err, whatsmeow.ErrFileLengthMismatch) || errors.Is(err, whatsmeow.ErrInvalidMediaSHA256) {
portal.log.Warnfln("Mismatching media checksums in %s: %v. Ignoring because WhatsApp seems to ignore them too", info.ID, err)
} else if err != nil {
return portal.makeMediaBridgeFailureMessage(info, err, converted, nil)
return portal.makeMediaBridgeFailureMessage(info, err, converted, nil, "")
}
err = portal.uploadMedia(intent, data, converted.Content)
if err != nil {
if errors.Is(err, mautrix.MTooLarge) {
return portal.makeMediaBridgeFailureMessage(info, errors.New("homeserver rejected too large file"), converted, nil)
return portal.makeMediaBridgeFailureMessage(info, errors.New("homeserver rejected too large file"), converted, nil, "")
} else if httpErr, ok := err.(mautrix.HTTPError); ok && httpErr.IsStatus(413) {
return portal.makeMediaBridgeFailureMessage(info, errors.New("proxy rejected too large file"), converted, nil)
return portal.makeMediaBridgeFailureMessage(info, errors.New("proxy rejected too large file"), converted, nil, "")
} else {
return portal.makeMediaBridgeFailureMessage(info, fmt.Errorf("failed to upload media: %w", err), converted, nil)
return portal.makeMediaBridgeFailureMessage(info, fmt.Errorf("failed to upload media: %w", err), converted, nil, "")
}
}
return converted