diff --git a/pkg/connector/backfill.go b/pkg/connector/backfill.go index 6a1e99ad..dd8783ee 100644 --- a/pkg/connector/backfill.go +++ b/pkg/connector/backfill.go @@ -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 } diff --git a/pkg/connector/telegram.go b/pkg/connector/telegram.go index 7cfa3502..e76f3ecc 100644 --- a/pkg/connector/telegram.go +++ b/pkg/connector/telegram.go @@ -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 } diff --git a/pkg/connector/tomatrix.go b/pkg/connector/tomatrix.go index 714c4082..40e25a57 100644 --- a/pkg/connector/tomatrix.go +++ b/pkg/connector/tomatrix.go @@ -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)