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)
|
sender := t.getEventSender(message, !portal.Metadata.(*PortalMetadata).IsSuperGroup)
|
||||||
intent := portal.GetIntentFor(ctx, sender, t.userLogin, bridgev2.RemoteEventBackfill)
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ func (t *TelegramClient) onUpdateNewMessage(ctx context.Context, entities tg.Ent
|
|||||||
},
|
},
|
||||||
ID: ids.GetMessageIDFromMessage(msg),
|
ID: ids.GetMessageIDFromMessage(msg),
|
||||||
Data: msg,
|
Data: msg,
|
||||||
ConvertMessageFunc: t.convertToMatrix,
|
ConvertMessageFunc: t.convertToMatrixWithRefetch,
|
||||||
})
|
})
|
||||||
case *tg.MessageService:
|
case *tg.MessageService:
|
||||||
sender := t.getEventSender(msg, false)
|
sender := t.getEventSender(msg, false)
|
||||||
@@ -766,7 +766,7 @@ func (t *TelegramClient) onMessageEdit(ctx context.Context, update IGetMessage)
|
|||||||
Data: msg,
|
Data: msg,
|
||||||
ConvertEditFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, existing []*database.Message, data *tg.Message) (*bridgev2.ConvertedEdit, error) {
|
ConvertEditFunc: func(ctx context.Context, portal *bridgev2.Portal, intent bridgev2.MatrixAPI, existing []*database.Message, data *tg.Message) (*bridgev2.ConvertedEdit, error) {
|
||||||
log := zerolog.Ctx(ctx)
|
log := zerolog.Ctx(ctx)
|
||||||
converted, err := t.convertToMatrix(ctx, portal, intent, msg)
|
converted, err := t.convertToMatrixWithRefetch(ctx, portal, intent, msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gotd/td/tg"
|
"github.com/gotd/td/tg"
|
||||||
|
"github.com/gotd/td/tgerr"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"go.mau.fi/util/exmime"
|
"go.mau.fi/util/exmime"
|
||||||
"go.mau.fi/util/ptr"
|
"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) {
|
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()
|
log := zerolog.Ctx(ctx).With().Str("conversion_direction", "to_matrix").Logger()
|
||||||
ctx = log.WithContext(ctx)
|
ctx = log.WithContext(ctx)
|
||||||
|
|||||||
Reference in New Issue
Block a user