{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} {-# HLINT ignore "Redundant <$>" #-} {-# HLINT ignore "Redundant $" #-} {-# HLINT ignore "Redundant bracket" #-} module BroadcastUserData ( broadcastUserData, ) where import ClassyPrelude import Data.Aeson (encode) import Types.AppTypes (HasConnectedClientState (..)) import Types.ConnectionState (Client (..)) import Types.RoomsState (HasRoomsState (..)) import Types.UsersData (UsersData (..)) import WebSocket (broadCastToClients) broadcastUserData :: ( MonadIO m, HasConnectedClientState env, HasRoomsState env, MonadReader env m ) => m () broadcastUserData = do userWithOutRoom <- getUsersWithoutRoom roomsData <- (getRoomsState <$> ask) >>= readMVar let usersData = UsersData {userWithOutRoom = userWithOutRoom, roomsData = roomsData} broadCastToClients $ (decodeUtf8 . toStrict . encode) usersData getUsersWithoutRoom :: ( MonadIO m, HasConnectedClientState env, MonadReader env m ) => m [Text] getUsersWithoutRoom = do state <- (getConnectedClientState <$> ask) >>= readMVar return $ map name $ filter (not . joinedRoom) state