module BroadcastUserData ( broadcastUserData, ) where import ClassyPrelude import Data.Aeson (encode) import Network.WebSockets qualified as WS import Types.AppTypes (HasConnectedClientState (..)) import Types.ConnectionState (Client (..), ConnectedClients) import Types.RoomsState (HasRoomsState (..)) import Types.UsersData (UsersData (..)) broadcastUserData :: ( MonadIO m, HasConnectedClientState env, HasRoomsState env, MonadReader env m ) => m () broadcastUserData = do putStrLn "broadcasting" userWithOutRoom <- getUsersWithoutRoom roomsData <- ask >>= readMVar . getRoomsState let usersData = UsersData {usersWithOutRoom = userWithOutRoom, roomsData = roomsData} broadCastToClients $ (decodeUtf8 . toStrict . encode) usersData getUsersWithoutRoom :: ( MonadIO m, HasConnectedClientState env, MonadReader env m ) => m [Text] getUsersWithoutRoom = do state <- ask >>= readMVar . getConnectedClientState return $ map name $ filter (not . joinedRoom) state broadcast :: Text -> ConnectedClients -> IO () broadcast message clients = do putStrLn message forM_ clients $ \client -> WS.sendTextData (conn client) message broadCastToClients :: ( MonadIO m, HasConnectedClientState env, MonadReader env m ) => Text -> m () broadCastToClients message = do state <- getConnectedClientState <$> ask liftIO $ withMVar state $ \currenState -> broadcast message currenState