From ef2e95a29444ea0dbf80a8f5bb924163d317d811 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 13 Apr 2025 23:08:29 +0300 Subject: [PATCH] hicli/paginate: fill prev content when resyncing state --- pkg/hicli/paginate.go | 3 +++ pkg/hicli/sync.go | 21 ++++++++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pkg/hicli/paginate.go b/pkg/hicli/paginate.go index 0a7cf5e..e1786db 100644 --- a/pkg/hicli/paginate.go +++ b/pkg/hicli/paginate.go @@ -78,6 +78,9 @@ func (h *HiClient) processGetRoomState(ctx context.Context, roomID id.RoomID, fe mediaReferenceEntries := make([]*database.MediaReference, len(evts)) mediaCacheEntries := make([]*database.PlainMedia, 0, len(evts)) for i, evt := range evts { + if err := h.fillPrevContent(ctx, evt); err != nil { + return err + } dbEvts[i] = database.MautrixToEvent(evt) currentStateEntries[i] = &database.CurrentStateEntry{ EventType: evt.Type, diff --git a/pkg/hicli/sync.go b/pkg/hicli/sync.go index 47615dd..96a392e 100644 --- a/pkg/hicli/sync.go +++ b/pkg/hicli/sync.go @@ -630,6 +630,18 @@ func (h *HiClient) postDecryptProcess(ctx context.Context, llSummary *mautrix.La return } +func (h *HiClient) fillPrevContent(ctx context.Context, evt *event.Event) error { + if evt.StateKey != nil && evt.Unsigned.PrevContent == nil && evt.Unsigned.ReplacesState != "" { + replacesState, err := h.DB.Event.GetByID(ctx, evt.Unsigned.ReplacesState) + if err != nil { + return fmt.Errorf("failed to get prev content for %s from %s: %w", evt.ID, evt.Unsigned.ReplacesState, err) + } else if replacesState != nil { + evt.Unsigned.PrevContent = &event.Content{VeryRaw: replacesState.Content} + } + } + return nil +} + func (h *HiClient) processEvent( ctx context.Context, evt *event.Event, @@ -645,13 +657,8 @@ func (h *HiClient) processEvent( return dbEvt, nil } } - if evt.StateKey != nil && evt.Unsigned.PrevContent == nil && evt.Unsigned.ReplacesState != "" { - replacesState, err := h.DB.Event.GetByID(ctx, evt.Unsigned.ReplacesState) - if err != nil { - return nil, fmt.Errorf("failed to get prev content for %s from %s: %w", evt.ID, evt.Unsigned.ReplacesState, err) - } else if replacesState != nil { - evt.Unsigned.PrevContent = &event.Content{VeryRaw: replacesState.Content} - } + if err := h.fillPrevContent(ctx, evt); err != nil { + return nil, err } dbEvt := database.MautrixToEvent(evt) contentWithoutFallback := removeReplyFallback(evt)