Skip to content

Commit

Permalink
backfill: fix bugs
Browse files Browse the repository at this point in the history
  • Loading branch information
tulir committed Oct 1, 2024
1 parent a0d39bb commit f4a507b
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 22 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
21 changes: 15 additions & 6 deletions pkg/connector/backfill.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import (
"context"
"errors"
"fmt"
"slices"
"strconv"
"strings"
"time"

"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"
Expand Down Expand Up @@ -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)),
Expand All @@ -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))
}
Expand All @@ -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
Expand Down
6 changes: 3 additions & 3 deletions pkg/connector/mediarequest.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
17 changes: 9 additions & 8 deletions pkg/connector/wadb/conversation.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package wadb

import (
"context"
"database/sql"
"time"

"go.mau.fi/util/dbutil"
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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
}
11 changes: 9 additions & 2 deletions pkg/msgconv/wa-media.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit f4a507b

Please sign in to comment.