updateDMSubscriptions :: InboxModelEff es => PubKeyXO -> Eff es ()
updateDMSubscriptions xo = do
kp <- getKeyPair
let ownPubkey = keyPairToPubKeyXO kp
when (xo == ownPubkey) $ do
dmRelayURIs <- getDMRelays xo
let dmRelaySet = Set.fromList dmRelayURIs
pool <- get @RelayPool
let giftwrapSubs =
[ (relayUri, subId)
| (subId, sd) <- Map.toList (subscriptions pool)
, GiftWrap `elem` fromMaybe [] (kinds $ subscriptionFilter sd)
, relayUri <- Map.keys (activeConnections pool)
, not (relayUri `Set.member` dmRelaySet)
]
-- Stop giftwrap subscriptions for relays not in dmRelaySet
void $ forConcurrently giftwrapSubs $ \(relayUri, subId) -> do
stopSubscription subId
let hasOtherSubs = any (\_ -> relayUri == relayUri)
(Map.elems $ subscriptions pool)
when (not hasOtherSubs) $ do
disconnect relayUri
let currentRelaySet = Map.keysSet (activeConnections pool)
let relaysToAdd = Set.difference dmRelaySet currentRelaySet
void $ forConcurrently (Set.toList relaysToAdd) $ \relayUri -> do
connected <- connect relayUri
when connected $ do
subscribeToGiftwraps relayUri xo