module BroadcastUserData ( broadcastUserData, broadCastToClientsGeneric, MonadBroadcast (..), ) where import ClassyPrelude import Data.Aeson (encode) import qualified Network.WebSockets as WS import State.ConnectedClientsState (MonadConnectedClientsRead (getConnctedClients)) import State.RoomDataState (MonadRoomDataStateRead (getRoomDataState)) import Types.AppTypes (HasConnectedClientState (..)) import Types.ConnectionState (Client (..), ConnectedClients) import Types.RoomsState (HasRoomsState (..)) import Types.UsersData (UsersData (..)) class (Monad m, MonadConnectedClientsRead m) => MonadBroadcast m where broadCastToClients :: Text -> m () broadcastUserData :: ( MonadRoomDataStateRead m, MonadBroadcast m ) => m () broadcastUserData = do userWithOutRoom <- getUsersWithoutRoom roomsData <- getRoomDataState let usersData = UsersData {usersWithOutRoom = userWithOutRoom, roomsData = roomsData} broadCastToClients $ (decodeUtf8 . toStrict . encode) usersData getUsersWithoutRoom :: ( MonadConnectedClientsRead m ) => m [Text] getUsersWithoutRoom = map name . filter (not . joinedRoom) <$> getConnctedClients broadCastToClientsGeneric :: ( MonadIO m, MonadConnectedClientsRead m ) => Text -> m () broadCastToClientsGeneric message = do state <- getConnctedClients liftIO $ broadcast message state broadcast :: Text -> ConnectedClients -> IO () broadcast message clients = do putStrLn message forM_ clients $ \client -> WS.sendTextData (conn client) message