client: refetch message during conversion if file reference expired
Signed-off-by: Sumner Evans <sumner.evans@automattic.com>
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user