From 635e3f408bd66408616009614a7a0fdb3cafd7e0 Mon Sep 17 00:00:00 2001 From: qvalentin Date: Sun, 9 Apr 2023 10:37:15 +0200 Subject: [PATCH] Timestamp and uuid for chat messages --- backend/jitsi-rooms.cabal | 2 ++ backend/package.yaml | 1 + .../WebSocketMessages/WebSocketMessages.hs | 6 +++++- backend/src/WebSocket/AllChat.hs | 21 ++++++++++++++++--- backend/src/WebSocket/WSApp.hs | 8 ++++--- 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/backend/jitsi-rooms.cabal b/backend/jitsi-rooms.cabal index 13ee870..51a353c 100644 --- a/backend/jitsi-rooms.cabal +++ b/backend/jitsi-rooms.cabal @@ -62,6 +62,7 @@ library , lifted-base , mtl , text + , time , uuid , wai , warp @@ -87,6 +88,7 @@ executable jitsi-rooms-exe , lifted-base , mtl , text + , time , uuid , wai , warp diff --git a/backend/package.yaml b/backend/package.yaml index d35a14c..2e64954 100644 --- a/backend/package.yaml +++ b/backend/package.yaml @@ -32,6 +32,7 @@ dependencies: - uuid - lifted-base - mtl + - time ghc-options: - -Wall diff --git a/backend/src/Types/WebSocketMessages/WebSocketMessages.hs b/backend/src/Types/WebSocketMessages/WebSocketMessages.hs index 30049ba..641bc5d 100644 --- a/backend/src/Types/WebSocketMessages/WebSocketMessages.hs +++ b/backend/src/Types/WebSocketMessages/WebSocketMessages.hs @@ -19,6 +19,8 @@ import Data.Aeson defaultOptions, genericParseJSON, ) +import Data.Time.Clock.POSIX (POSIXTime) +import Data.UUID (UUID) import Types.User (User) data WebSocketMessage = ClientInfoMessage SetClientInfo | JoinRoomMessage JoinRoom | AllChatMessageIncomingMessage AllChatMessageIncoming @@ -50,7 +52,9 @@ instance FromJSON AllChatMessageIncoming data AllChatMessageOutgoing = AllChatMessageOutgoing { content :: Text, - sender :: User + sender :: User, + uuid :: UUID, + timestamp :: POSIXTime } deriving (Generic, Show) diff --git a/backend/src/WebSocket/AllChat.hs b/backend/src/WebSocket/AllChat.hs index fce86ef..2f66419 100644 --- a/backend/src/WebSocket/AllChat.hs +++ b/backend/src/WebSocket/AllChat.hs @@ -1,18 +1,33 @@ +{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE LambdaCase #-} -module WebSocket.AllChat (broadCastAllChatMessage) where +module WebSocket.AllChat (broadCastAllChatMessage, MonadAllChat) where import BroadcastUserData (MonadBroadcast (..)) import ClassyPrelude import Data.Aeson (encode) +import Data.Time.Clock.POSIX +import Data.UUID (UUID) +import Data.UUID.V4 (nextRandom) import Types.User (clientToUser) import Types.WebSocketMessages.WebSocketMessages (AllChatMessageIncoming (..), AllChatMessageOutgoing (AllChatMessageOutgoing)) import WebSocket.MonadWebSocketSession (MonadWebSocketSession (getClient)) +import WebSocket.WSReaderTApp -broadCastAllChatMessage :: (MonadBroadcast m, MonadWebSocketSession m) => AllChatMessageIncoming -> m () +class (Monad m) => MonadAllChat m where + getMessageId :: m UUID + getTimestamp :: m POSIXTime + +instance MonadAllChat (WSApp WSEnv) where + getMessageId = liftIO nextRandom + getTimestamp = liftIO getPOSIXTime + +broadCastAllChatMessage :: (MonadBroadcast m, MonadWebSocketSession m, MonadAllChat m) => AllChatMessageIncoming -> m () broadCastAllChatMessage AllChatMessageIncoming {content = message} = do getClient >>= \case Nothing -> return () Just client -> do - let broadCastValue = AllChatMessageOutgoing message (clientToUser client) + uuid <- getMessageId + timestamp <- getTimestamp + let broadCastValue = AllChatMessageOutgoing message (clientToUser client) uuid timestamp broadCastToClients $ (decodeUtf8 . toStrict . encode) broadCastValue diff --git a/backend/src/WebSocket/WSApp.hs b/backend/src/WebSocket/WSApp.hs index aea7ad3..6d613ad 100644 --- a/backend/src/WebSocket/WSApp.hs +++ b/backend/src/WebSocket/WSApp.hs @@ -13,7 +13,7 @@ import Types.WebSocketMessages.WebSocketMessages ( SetClientInfo (displayName), WebSocketMessage (..), ) -import WebSocket.AllChat (broadCastAllChatMessage) +import WebSocket.AllChat (MonadAllChat, broadCastAllChatMessage) import WebSocket.MonadWebSocketSession import WebSocket.WSReaderTApp @@ -22,7 +22,8 @@ wsApp :: MonadWebSocketSessionInit m, MonadConnectedClientsModify m, MonadRoomDataStateRead m, - MonadBroadcast m + MonadBroadcast m, + MonadAllChat m ) => m () wsApp = do @@ -37,7 +38,8 @@ wsApp = do handleWSAction :: ( MonadWebSocketSession m, MonadConnectedClientsModify m, - MonadBroadcast m + MonadBroadcast m, + MonadAllChat m ) => m () handleWSAction = do