From 0f29daf8d5da5740b705c6c70585fc8ebb58fc7e Mon Sep 17 00:00:00 2001 From: Philipp Balzarek Date: Sat, 6 Sep 2014 16:22:06 +0200 Subject: [PATCH] add accessor functions for tracked presence --- source/Network/Xmpp/IM.hs | 6 ++++ source/Network/Xmpp/IM/PresenceTracker.hs | 34 +++++++++++++++---- .../Network/Xmpp/IM/PresenceTracker/Types.hs | 4 +++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/source/Network/Xmpp/IM.hs b/source/Network/Xmpp/IM.hs index 5c1b682..731d9db 100644 --- a/source/Network/Xmpp/IM.hs +++ b/source/Network/Xmpp/IM.hs @@ -24,9 +24,15 @@ module Network.Xmpp.IM , getRoster , rosterAdd , rosterRemove + -- * presenceTracker + , isPeerAvailable + , getEntityStatus + , getAvailablePeers + , getPeerEntities ) where import Network.Xmpp.IM.Message import Network.Xmpp.IM.Presence import Network.Xmpp.IM.Roster import Network.Xmpp.IM.Roster.Types +import Network.Xmpp.IM.PresenceTracker diff --git a/source/Network/Xmpp/IM/PresenceTracker.hs b/source/Network/Xmpp/IM/PresenceTracker.hs index 0663e28..82c331d 100644 --- a/source/Network/Xmpp/IM/PresenceTracker.hs +++ b/source/Network/Xmpp/IM/PresenceTracker.hs @@ -20,10 +20,6 @@ import Network.Xmpp.IM.PresenceTracker.Types _peers :: Iso Peers (Map Jid (Map Jid (Maybe IMPresence))) _peers = mkIso unPeers Peers -data PeerStatus = PeerAvailable (Maybe IMPresence) - | PeerUnavailable - deriving (Show) - _PeerAvailable :: Prism PeerStatus (Maybe IMPresence) _PeerAvailable = prism' PeerAvailable fromPeerAvailable where @@ -52,11 +48,14 @@ maybeMap = mkIso maybeToMap mapToMaybe mapToMaybe m | Map.null m = Nothing | otherwise = Just m + +-- | Status of give full JID peerStatusL :: Jid -> Lens' Peers PeerStatus peerStatusL j = _peers . at (toBare j) . maybeMap . at j . _PeerStatus peerMapPeerAvailable :: Jid -> Peers -> Bool -peerMapPeerAvailable j = not . nullOf (peerStatusL j . _PeerAvailable) +peerMapPeerAvailable j | isFull j = not . nullOf (peerStatusL j . _PeerAvailable) + | otherwise = not . nullOf (_peers . at j . _Just) handlePresence :: TVar Peers -> StanzaHandler handlePresence peers _ st _ = do @@ -74,5 +73,26 @@ handlePresence peers _ st _ = do _ -> return () return [(st, [])] -isPeerAvailable :: Jid -> TVar Peers -> STM Bool -isPeerAvailable j peerRef = peerMapPeerAvailable j <$> readTVar peerRef +-- | Check whether a given jid is available +isPeerAvailable :: Jid -> Session -> STM Bool +isPeerAvailable j sess = peerMapPeerAvailable j <$> readTVar (presenceRef sess) + +-- | Get status of given full JID +getEntityStatus :: Jid -> Session -> STM PeerStatus +getEntityStatus j sess = do + peers <- readTVar (presenceRef sess) + return $ peers ^. peerStatusL j + +-- | Get list of (bare) Jids with available entities +getAvailablePeers :: Session -> STM [Jid] +getAvailablePeers sess = do + Peers peers <- readTVar (presenceRef sess) + return $ Map.keys peers + +-- | Get all available full JIDs to the given JID +getPeerEntities :: Jid -> Session -> STM (Map Jid (Maybe IMPresence)) +getPeerEntities j sess = do + Peers peers <- readTVar (presenceRef sess) + case Map.lookup (toBare j) peers of + Nothing -> return Map.empty + Just js -> return js diff --git a/source/Network/Xmpp/IM/PresenceTracker/Types.hs b/source/Network/Xmpp/IM/PresenceTracker/Types.hs index 4dc412c..334c066 100644 --- a/source/Network/Xmpp/IM/PresenceTracker/Types.hs +++ b/source/Network/Xmpp/IM/PresenceTracker/Types.hs @@ -14,3 +14,7 @@ import Network.Xmpp.IM.Presence -- * The inner map keys' local and domain part coincide with the outer keys' newtype Peers = Peers { unPeers :: Map Jid (Map Jid (Maybe IMPresence))} deriving (Show) + +data PeerStatus = PeerAvailable (Maybe IMPresence) + | PeerUnavailable + deriving (Show)