mirror of
https://github.com/mautrix/whatsapp.git
synced 2025-03-14 14:15:38 +00:00
backfill: fix bugs
This commit is contained in:
parent
a0d39bbdff
commit
f4a507bee0
6 changed files with 39 additions and 22 deletions
2
go.mod
2
go.mod
|
@ -18,7 +18,7 @@ require (
|
|||
golang.org/x/sync v0.8.0
|
||||
google.golang.org/protobuf v1.34.2
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
maunium.net/go/mautrix v0.21.1-0.20241001105237-37af19a01a61
|
||||
maunium.net/go/mautrix v0.21.1-0.20241001135537-c259682a7cc5
|
||||
)
|
||||
|
||||
require (
|
||||
|
|
4
go.sum
4
go.sum
|
@ -101,5 +101,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M=
|
||||
maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA=
|
||||
maunium.net/go/mautrix v0.21.1-0.20241001105237-37af19a01a61 h1:acO4UUl2NQgzCURgUP6SL+05/Vx0Kr09J3iiJD0WCrM=
|
||||
maunium.net/go/mautrix v0.21.1-0.20241001105237-37af19a01a61/go.mod h1:qN4yYKm3brOUWN8dlR0KPbKwSBGXQ4am/kzSQt/kLmY=
|
||||
maunium.net/go/mautrix v0.21.1-0.20241001135537-c259682a7cc5 h1:2NUYpChFGyrWcXcb2lgDBSyWQTLHmh3ZzEkpauA+Bvc=
|
||||
maunium.net/go/mautrix v0.21.1-0.20241001135537-c259682a7cc5/go.mod h1:qN4yYKm3brOUWN8dlR0KPbKwSBGXQ4am/kzSQt/kLmY=
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
@ -11,6 +12,7 @@ import (
|
|||
"github.com/rs/zerolog"
|
||||
"go.mau.fi/util/ptr"
|
||||
"go.mau.fi/whatsmeow"
|
||||
"go.mau.fi/whatsmeow/proto/waE2E"
|
||||
"go.mau.fi/whatsmeow/proto/waHistorySync"
|
||||
"go.mau.fi/whatsmeow/proto/waWeb"
|
||||
"go.mau.fi/whatsmeow/types"
|
||||
|
@ -277,11 +279,12 @@ func (wa *WhatsAppClient) FetchMessages(ctx context.Context, params bridgev2.Fet
|
|||
return nil, fmt.Errorf("failed to parse info of message %s: %w", msg.GetKey().GetID(), err)
|
||||
}
|
||||
var mediaReq *wadb.MediaRequest
|
||||
convertedMessages[i], mediaReq = wa.convertHistorySyncMessage(ctx, params.Portal, &evt.Info, msg)
|
||||
convertedMessages[i], mediaReq = wa.convertHistorySyncMessage(ctx, params.Portal, &evt.Info, evt.Message, msg.Reactions)
|
||||
if mediaReq != nil {
|
||||
mediaRequests = append(mediaRequests, mediaReq)
|
||||
}
|
||||
}
|
||||
slices.Reverse(convertedMessages)
|
||||
return &bridgev2.FetchMessagesResponse{
|
||||
Messages: convertedMessages,
|
||||
Cursor: networkid.PaginationCursor(strconv.FormatUint(messages[0].GetMessageTimestamp(), 10)),
|
||||
|
@ -306,7 +309,13 @@ func (wa *WhatsAppClient) FetchMessages(ctx context.Context, params bridgev2.Fet
|
|||
if len(mediaRequests) > 0 {
|
||||
go func(ctx context.Context) {
|
||||
for _, req := range mediaRequests {
|
||||
wa.sendMediaRequest(ctx, req)
|
||||
err := wa.Main.DB.MediaRequest.Put(ctx, req)
|
||||
if err != nil {
|
||||
zerolog.Ctx(ctx).Err(err).Msg("Failed to save media request to database")
|
||||
}
|
||||
if wa.Main.Config.HistorySync.MediaRequests.AutoRequestMedia && wa.Main.Config.HistorySync.MediaRequests.RequestMethod == MediaRequestMethodImmediate {
|
||||
wa.sendMediaRequest(ctx, req)
|
||||
}
|
||||
}
|
||||
}(context.WithoutCancel(ctx))
|
||||
}
|
||||
|
@ -315,20 +324,20 @@ func (wa *WhatsAppClient) FetchMessages(ctx context.Context, params bridgev2.Fet
|
|||
}
|
||||
|
||||
func (wa *WhatsAppClient) convertHistorySyncMessage(
|
||||
ctx context.Context, portal *bridgev2.Portal, info *types.MessageInfo, msg *waWeb.WebMessageInfo,
|
||||
ctx context.Context, portal *bridgev2.Portal, info *types.MessageInfo, msg *waE2E.Message, reactions []*waWeb.Reaction,
|
||||
) (*bridgev2.BackfillMessage, *wadb.MediaRequest) {
|
||||
// TODO use proper intent
|
||||
intent := wa.Main.Bridge.Bot
|
||||
wrapped := &bridgev2.BackfillMessage{
|
||||
ConvertedMessage: wa.Main.MsgConv.ToMatrix(ctx, portal, wa.Client, intent, msg.Message, info),
|
||||
ConvertedMessage: wa.Main.MsgConv.ToMatrix(ctx, portal, wa.Client, intent, msg, info),
|
||||
Sender: wa.makeEventSender(info.Sender),
|
||||
ID: waid.MakeMessageID(info.Chat, info.Sender, info.ID),
|
||||
TxnID: networkid.TransactionID(waid.MakeMessageID(info.Chat, info.Sender, info.ID)),
|
||||
Timestamp: info.Timestamp,
|
||||
Reactions: make([]*bridgev2.BackfillReaction, len(msg.Reactions)),
|
||||
Reactions: make([]*bridgev2.BackfillReaction, len(reactions)),
|
||||
}
|
||||
mediaReq := wa.processFailedMedia(ctx, portal.PortalKey, wrapped.ID, wrapped.ConvertedMessage, true)
|
||||
for i, reaction := range msg.Reactions {
|
||||
for i, reaction := range reactions {
|
||||
var sender types.JID
|
||||
if reaction.GetKey().GetFromMe() {
|
||||
sender = wa.JID
|
||||
|
|
|
@ -53,14 +53,14 @@ func (wa *WhatsAppClient) processFailedMedia(ctx context.Context, portalKey netw
|
|||
MediaKey: field.FailedKeys.Key,
|
||||
Status: wadb.MediaBackfillRequestStatusNotRequested,
|
||||
}
|
||||
if isBackfill {
|
||||
return req
|
||||
}
|
||||
err := wa.Main.DB.MediaRequest.Put(ctx, req)
|
||||
if err != nil {
|
||||
zerolog.Ctx(ctx).Err(err).Msg("Failed to save failed media request")
|
||||
}
|
||||
if wa.Main.Config.HistorySync.MediaRequests.AutoRequestMedia && wa.Main.Config.HistorySync.MediaRequests.RequestMethod == MediaRequestMethodImmediate {
|
||||
if isBackfill {
|
||||
return req
|
||||
}
|
||||
go wa.sendMediaRequest(context.WithoutCancel(ctx), req)
|
||||
}
|
||||
return nil
|
||||
|
|
|
@ -2,6 +2,7 @@ package wadb
|
|||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"time"
|
||||
|
||||
"go.mau.fi/util/dbutil"
|
||||
|
@ -132,12 +133,12 @@ func (cq *ConversationQuery) Delete(ctx context.Context, loginID networkid.UserL
|
|||
}
|
||||
|
||||
func (c *Conversation) sqlVariables() []any {
|
||||
var lastMessageTS, muteEndTime int64
|
||||
var lastMessageTS, muteEndTime *int64
|
||||
if !c.LastMessageTimestamp.IsZero() {
|
||||
lastMessageTS = c.LastMessageTimestamp.Unix()
|
||||
lastMessageTS = ptr.Ptr(c.LastMessageTimestamp.Unix())
|
||||
}
|
||||
if !c.MuteEndTime.IsZero() {
|
||||
muteEndTime = c.MuteEndTime.Unix()
|
||||
muteEndTime = ptr.Ptr(c.MuteEndTime.Unix())
|
||||
}
|
||||
return []any{
|
||||
c.BridgeID,
|
||||
|
@ -156,7 +157,7 @@ func (c *Conversation) sqlVariables() []any {
|
|||
}
|
||||
|
||||
func (c *Conversation) Scan(row dbutil.Scannable) (*Conversation, error) {
|
||||
var lastMessageTS, muteEndTime int64
|
||||
var lastMessageTS, muteEndTime sql.NullInt64
|
||||
err := row.Scan(
|
||||
&c.BridgeID,
|
||||
&c.UserLoginID,
|
||||
|
@ -174,11 +175,11 @@ func (c *Conversation) Scan(row dbutil.Scannable) (*Conversation, error) {
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if lastMessageTS != 0 {
|
||||
c.LastMessageTimestamp = time.Unix(lastMessageTS, 0)
|
||||
if lastMessageTS.Int64 != 0 {
|
||||
c.LastMessageTimestamp = time.Unix(lastMessageTS.Int64, 0)
|
||||
}
|
||||
if muteEndTime != 0 {
|
||||
c.MuteEndTime = time.Unix(muteEndTime, 0)
|
||||
if muteEndTime.Int64 != 0 {
|
||||
c.MuteEndTime = time.Unix(muteEndTime.Int64, 0)
|
||||
}
|
||||
return c, nil
|
||||
}
|
||||
|
|
|
@ -62,7 +62,7 @@ func (mc *MessageConverter) convertMediaMessage(ctx context.Context, msg MediaMe
|
|||
}, err)
|
||||
} else {
|
||||
part = &bridgev2.ConvertedMessagePart{
|
||||
Type: event.EventMessage,
|
||||
Type: preparedMedia.Type,
|
||||
Content: preparedMedia.MessageEventContent,
|
||||
Extra: preparedMedia.Extra,
|
||||
}
|
||||
|
@ -185,6 +185,9 @@ func prepareMediaMessage(rawMsg MediaMessage) *PreparedMedia {
|
|||
case *waE2E.StickerMessage:
|
||||
data.Type = event.EventSticker
|
||||
data.FileName = "sticker" + exmime.ExtensionFromMimetype(msg.GetMimetype())
|
||||
if msg.GetMimetype() == "application/was" && data.FileName == "sticker" {
|
||||
data.FileName = "sticker.json"
|
||||
}
|
||||
case *waE2E.VideoMessage:
|
||||
data.MsgType = event.MsgVideo
|
||||
if msg.GetGifPlayback() {
|
||||
|
@ -236,6 +239,10 @@ func (mc *MessageConverter) MediaRetryToMatrix(
|
|||
if err != nil {
|
||||
updatedPart = mc.makeMediaFailure(ctx, part, nil, err)
|
||||
} else {
|
||||
// Event type can't be changed when editing, so turn stickers into images
|
||||
if part.Type == event.EventSticker {
|
||||
part.MsgType = event.MsgImage
|
||||
}
|
||||
updatedPart = &bridgev2.ConvertedMessagePart{
|
||||
Type: event.EventMessage,
|
||||
Content: part.MessageEventContent,
|
||||
|
@ -402,7 +409,7 @@ func (mc *MessageConverter) convertAnimatedSticker(ctx context.Context, fileInfo
|
|||
func (mc *MessageConverter) makeMediaFailure(ctx context.Context, mediaInfo *PreparedMedia, keys *FailedMediaKeys, err error) *bridgev2.ConvertedMessagePart {
|
||||
logLevel := zerolog.ErrorLevel
|
||||
var extra map[string]any
|
||||
var dbMeta *waid.MessageMetadata
|
||||
var dbMeta any
|
||||
errorMsg := fmt.Sprintf("Failed to bridge %s, please view it on the WhatsApp app", mediaInfo.TypeDescription)
|
||||
if keys != nil && (errors.Is(err, whatsmeow.ErrMediaDownloadFailedWith403) || errors.Is(err, whatsmeow.ErrMediaDownloadFailedWith404) || errors.Is(err, whatsmeow.ErrMediaDownloadFailedWith410)) {
|
||||
logLevel = zerolog.DebugLevel
|
||||
|
|
Loading…
Add table
Reference in a new issue