client: refetch message during conversion if file reference expired

Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
This commit is contained in:
Sumner Evans
2025-02-24 11:45:21 -07:00
parent f0f92c9dd9
commit 36bb741c68
3 changed files with 34 additions and 3 deletions
+1 -1
View File
@@ -279,7 +279,7 @@ func (t *TelegramClient) FetchMessages(ctx context.Context, fetchParams bridgev2
sender := t.getEventSender(message, !portal.Metadata.(*PortalMetadata).IsSuperGroup)
intent := portal.GetIntentFor(ctx, sender, t.userLogin, bridgev2.RemoteEventBackfill)
converted, err := t.convertToMatrix(ctx, portal, intent, message)
converted, err := t.convertToMatrixWithRefetch(ctx, portal, intent, message)
if err != nil {
return nil, err
}
+2 -2
View File
@@ -146,7 +146,7 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, entities tg.Ent
},
ID: ids.GetMessageIDFromMessage(msg),
Data: msg,
ConvertMessageFunc: t.convertToMatrix,
ConvertMessageFunc: t.convertToMatrixWithRefetch,
})
case *tg.MessageService:
sender := t.getEventSender(msg, false)
@@ -766,7 +766,7 @@ func (t *TelegramClient) onMessageEdit(ctx context.Context, update IGetMessage)
Data: msg,
ConvertEditFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, existing []*database.Message, data *tg.Message) (*bridgev2.ConvertedEdit, error) {
log := zerolog.Ctx(ctx)
converted, err := t.convertToMatrix(ctx, portal, intent, msg)
converted, err := t.convertToMatrixWithRefetch(ctx, portal, intent, msg)
if err != nil {
return nil, err
}
+31
View File
@@ -10,6 +10,7 @@ import (
"time"
"github.com/gotd/td/tg"
"github.com/gotd/td/tgerr"
"github.com/rs/zerolog"
"go.mau.fi/util/exmime"
"go.mau.fi/util/ptr"
@@ -102,6 +103,36 @@ func (c *TelegramClient) mediaToMatrix(ctx context.Context, portal *bridgev2.Por
}
}
func (c *TelegramClient) convertToMatrixWithRefetch(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, msg *tg.Message) (cm *bridgev2.ConvertedMessage, err error) {
cm, err = c.convertToMatrix(ctx, portal, intent, msg)
if !tgerr.Is(err, tg.ErrFileReferenceExpired) {
return cm, err
}
// If the error is that the file reference expired, refetch the message and
// try to convert it again.
log := zerolog.Ctx(ctx).With().Bool("message_refetch", true).Logger()
ctx = log.WithContext(ctx)
log.Warn().Err(err).Msg("Refetching message to convert media")
m, err := c.client.API().MessagesGetMessages(ctx, []tg.InputMessageClass{
&tg.InputMessageID{ID: msg.ID},
})
if err != nil {
return nil, err
} else if messages, ok := m.(tg.ModifiedMessagesMessages); !ok {
return nil, fmt.Errorf("unsupported messages type %T", messages)
} else if len(messages.GetMessages()) != 1 {
return nil, fmt.Errorf("wrong number of messages retrieved %d", len(messages.GetMessages()))
} else if refetchedMsg, ok := messages.GetMessages()[0].(*tg.Message); !ok {
return nil, fmt.Errorf("message was of the wrong type %s", messages.GetMessages()[0].TypeName())
} else if refetchedMsg.ID != msg.ID {
return nil, fmt.Errorf("no media found with ID %d", msg.ID)
} else {
return c.convertToMatrix(ctx, portal, intent, refetchedMsg)
}
}
func (c *TelegramClient) convertToMatrix(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, msg *tg.Message) (cm *bridgev2.ConvertedMessage, err error) {
log := zerolog.Ctx(ctx).With().Str("conversion_direction", "to_matrix").Logger()
ctx = log.WithContext(ctx)