jitsi-roomsv2/backend/src/BroadcastUserData.hs

53 lines
1.4 KiB
Haskell
Raw Normal View History

module BroadcastUserData
( broadcastUserData,
)
where
import ClassyPrelude
import Data.Aeson (encode)
2023-02-07 20:30:25 +01:00
import Network.WebSockets qualified as WS
import Types.AppTypes (HasConnectedClientState (..))
2023-02-07 20:30:25 +01:00
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
2023-02-07 20:30:25 +01:00
putStrLn "broadcasting"
userWithOutRoom <- getUsersWithoutRoom
2023-02-07 20:30:25 +01:00
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
2023-02-07 20:30:25 +01:00
state <- ask >>= readMVar . getConnectedClientState
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