2023-01-28 19:08:33 +01:00
|
|
|
module BroadcastUserData
|
|
|
|
( broadcastUserData,
|
|
|
|
)
|
|
|
|
where
|
|
|
|
|
|
|
|
import ClassyPrelude
|
|
|
|
import Data.Aeson (encode)
|
2023-02-07 20:30:25 +01:00
|
|
|
import Network.WebSockets qualified as WS
|
2023-01-28 19:08:33 +01:00
|
|
|
import Types.AppTypes (HasConnectedClientState (..))
|
2023-02-07 20:30:25 +01:00
|
|
|
import Types.ConnectionState (Client (..), ConnectedClients)
|
2023-01-28 19:08:33 +01:00
|
|
|
import Types.RoomsState (HasRoomsState (..))
|
|
|
|
import Types.UsersData (UsersData (..))
|
|
|
|
|
|
|
|
broadcastUserData ::
|
|
|
|
( MonadIO m,
|
|
|
|
HasConnectedClientState env,
|
|
|
|
HasRoomsState env,
|
|
|
|
MonadReader env m
|
|
|
|
) =>
|
|
|
|
m ()
|
|
|
|
broadcastUserData = do
|
2023-02-07 20:30:25 +01:00
|
|
|
putStrLn "broadcasting"
|
2023-01-28 19:08:33 +01:00
|
|
|
userWithOutRoom <- getUsersWithoutRoom
|
2023-02-07 20:30:25 +01:00
|
|
|
roomsData <- ask >>= readMVar . getRoomsState
|
|
|
|
let usersData = UsersData {usersWithOutRoom = userWithOutRoom, roomsData = roomsData}
|
2023-01-28 19:08:33 +01:00
|
|
|
broadCastToClients $ (decodeUtf8 . toStrict . encode) usersData
|
|
|
|
|
|
|
|
getUsersWithoutRoom ::
|
|
|
|
( MonadIO m,
|
|
|
|
HasConnectedClientState env,
|
|
|
|
MonadReader env m
|
|
|
|
) =>
|
|
|
|
m [Text]
|
|
|
|
getUsersWithoutRoom = do
|
2023-02-07 20:30:25 +01:00
|
|
|
state <- ask >>= readMVar . getConnectedClientState
|
2023-01-28 19:08:33 +01:00
|
|
|
return $ map name $ filter (not . joinedRoom) state
|
2023-02-07 20:30:25 +01:00
|
|
|
|
|
|
|
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
|