jitsi-roomsv2/backend/src/BroadcastUserData.hs

52 lines
1.6 KiB
Haskell
Raw Normal View History

module BroadcastUserData
( broadcastUserData,
2023-02-19 11:41:32 +01:00
broadCastToClientsGeneric,
MonadBroadcast (..),
)
where
2023-02-19 11:41:32 +01:00
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 ::
2023-02-19 11:41:32 +01:00
( MonadRoomDataStateRead m,
MonadBroadcast m
) =>
m ()
broadcastUserData = do
userWithOutRoom <- getUsersWithoutRoom
2023-02-19 11:41:32 +01:00
roomsData <- getRoomDataState
2023-02-07 20:30:25 +01:00
let usersData = UsersData {usersWithOutRoom = userWithOutRoom, roomsData = roomsData}
broadCastToClients $ (decodeUtf8 . toStrict . encode) usersData
getUsersWithoutRoom ::
2023-02-19 11:41:32 +01:00
( MonadConnectedClientsRead m
) =>
m [Text]
2023-02-19 11:41:32 +01:00
getUsersWithoutRoom = map name . filter (not . joinedRoom) <$> getConnctedClients
2023-02-07 20:30:25 +01:00
2023-02-19 11:41:32 +01:00
broadCastToClientsGeneric ::
2023-02-07 20:30:25 +01:00
( MonadIO m,
2023-02-19 11:41:32 +01:00
MonadConnectedClientsRead m
2023-02-07 20:30:25 +01:00
) =>
Text ->
m ()
2023-02-19 11:41:32 +01:00
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