diff --git a/pkg/connector/backfill.go b/pkg/connector/backfill.go index e2c7d114..27b23a5b 100644 --- a/pkg/connector/backfill.go +++ b/pkg/connector/backfill.go @@ -96,6 +96,16 @@ func (wa *WhatsAppClient) historySyncLoop(ctx context.Context) { } if resetTimer { timerPending.Store(true) + wa.historySyncPortalLock.Lock() + wa.historySyncPortalGen++ + if meta := wa.UserLogin.Metadata.(*waid.UserLoginMetadata); !meta.HistorySyncPortalsNeedCreating { + meta.HistorySyncPortalsNeedCreating = true + err := wa.UserLogin.Save(ctx) + if err != nil { + wa.UserLogin.Log.Err(err).Msg("Failed to save user login history sync portals need creating flag") + } + } + wa.historySyncPortalLock.Unlock() } if timerPending.Load() { dispatchTimer.Reset(wa.Main.Config.HistorySync.DispatchWait) @@ -417,6 +427,9 @@ func (wa *WhatsAppClient) createPortalsFromHistorySync(ctx context.Context) { } }() ctx = log.WithContext(ctx) + wa.historySyncPortalLock.Lock() + gen := wa.historySyncPortalGen + wa.historySyncPortalLock.Unlock() limit := wa.Main.Config.HistorySync.MaxInitialConversations loginTS := wa.UserLogin.Metadata.(*waid.UserLoginMetadata).LoggedInAt conversations, err := wa.Main.DB.Conversation.GetRecent(ctx, wa.UserLogin.ID, limit, loginTS) @@ -517,6 +530,11 @@ func (wa *WhatsAppClient) createPortalsFromHistorySync(ctx context.Context) { log.Info().Int("conversation_count", len(conversations)).Msg("Finished creating portals from history sync") go func() { wg.Wait() + wa.historySyncPortalLock.Lock() + defer wa.historySyncPortalLock.Unlock() + if wa.historySyncPortalGen != gen { + return + } wa.UserLogin.Metadata.(*waid.UserLoginMetadata).HistorySyncPortalsNeedCreating = false err = wa.UserLogin.Save(ctx) if err != nil { diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 678c8d22..cfb48708 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -128,6 +128,9 @@ type WhatsAppClient struct { lastPresence types.Presence blocklistLock sync.Mutex + historySyncPortalLock sync.Mutex + historySyncPortalGen uint64 + disableNewsletter bool appStateRecoveryLock sync.Mutex