From 519c3d67c2d170cadeea8ef29ba64dc73f4a3f33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Mon, 9 Mar 2026 22:16:30 +0100 Subject: Trigger peer search only for dm threads changed since last check --- src/Erebos/DirectMessage.hs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'src/Erebos') diff --git a/src/Erebos/DirectMessage.hs b/src/Erebos/DirectMessage.hs index e88bcce..0b0665c 100644 --- a/src/Erebos/DirectMessage.hs +++ b/src/Erebos/DirectMessage.hs @@ -26,6 +26,7 @@ import Control.Monad.Reader import Data.List import Data.Ord +import Data.Proxy import Data.Set (Set) import Data.Set qualified as S import Data.Text (Text) @@ -85,12 +86,21 @@ defaultDirectMessageAttributes = DirectMessageAttributes { dmOwnerMismatch = svcPrint "Owner mismatch" } +data DirectMessageGlobalState = DirectMessageGlobalState + { dmgsLastState :: Maybe [ Stored MessageState ] + } + instance Service DirectMessage where serviceID _ = mkServiceID "c702076c-4928-4415-8b6b-3e839eafcb0d" type ServiceAttributes DirectMessage = DirectMessageAttributes defaultServiceAttributes _ = defaultDirectMessageAttributes + type ServiceGlobalState DirectMessage = DirectMessageGlobalState + emptyServiceGlobalState _ = DirectMessageGlobalState + { dmgsLastState = Nothing + } + serviceHandler smsg = do let msg = fromStored smsg powner <- asks $ finalOwner . svcPeerIdentity @@ -293,8 +303,12 @@ syncDirectMessageToPeer (DirectMessageThreads mss _) = do return unchanged findMissingPeers :: Server -> DirectMessageThreads -> ExceptT ErebosError IO () -findMissingPeers server threads = do - forM_ (dmThreadList threads) $ \thread -> do +findMissingPeers server (DirectMessageThreads states threads) = do + prev <- modifyServiceGlobalState server (Proxy @DirectMessage) $ \gs -> + ( gs { dmgsLastState = Just states }, dmgsLastState gs ) + let diffPeers = map (msPeer . fromStored) $ maybe states (storedDifference states) prev + + forM_ (takeWhile (\t -> any (sameIdentity $ msgPeer t) diffPeers) threads) $ \thread -> do when (msgHead thread /= msgReceived thread) $ do mapM_ (discoverySearch server) $ map (refDigest . storedRef) $ idDataF $ msgPeer thread -- cgit v1.2.3