From 9f6385f763a1bfac8ff221ed89fc02a48aeebedb Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Wed, 2 Feb 2022 11:31:01 +0000 Subject: [PATCH] update connection status in entity used in controller notifications (#252) * update connection status in entity used in controller notifications * remove unused code --- src/Simplex/Chat.hs | 15 ++++++++++----- src/Simplex/Chat/Protocol.hs | 20 ++++++-------------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 900e5d2e6d..8de74e46bd 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -487,11 +487,8 @@ subscribeUserConnections = void . runExceptT $ do forM_ conns $ subscribeConnection a . aConnId processAgentMessage :: forall m. ChatMonad m => User -> ConnId -> ACommand 'Agent -> m () -processAgentMessage user@User {userId, profile} agentConnId agentMessage = do - acEntity <- withStore $ \st -> getConnectionEntity st user agentConnId - forM_ (agentMsgConnStatus agentMessage) $ \status -> - withStore $ \st -> updateConnectionStatus st (fromConnection acEntity) status - case acEntity of +processAgentMessage user@User {userId, profile} agentConnId agentMessage = + (withStore (\st -> getConnectionEntity st user agentConnId) >>= updateConnStatus) >>= \case RcvDirectMsgConnection conn contact_ -> processDirectMessage agentMessage conn contact_ RcvGroupMsgConnection conn gInfo m -> @@ -503,6 +500,14 @@ processAgentMessage user@User {userId, profile} agentConnId agentMessage = do UserContactConnection conn uc -> processUserContactRequest agentMessage conn uc where + updateConnStatus :: ConnectionEntity -> m ConnectionEntity + updateConnStatus acEntity = case agentMsgConnStatus agentMessage of + Just connStatus -> do + let conn = (entityConnection acEntity) {connStatus} + withStore $ \st -> updateConnectionStatus st conn connStatus + pure acEntity {entityConnection = conn} + Nothing -> pure acEntity + isMember :: MemberId -> GroupInfo -> [GroupMember] -> Bool isMember memId GroupInfo {membership} members = sameMemberId memId membership || isJust (find (sameMemberId memId) members) diff --git a/src/Simplex/Chat/Protocol.hs b/src/Simplex/Chat/Protocol.hs index 5107ada98a..a6ac03be05 100644 --- a/src/Simplex/Chat/Protocol.hs +++ b/src/Simplex/Chat/Protocol.hs @@ -15,10 +15,10 @@ module Simplex.Chat.Protocol where import Control.Monad ((<=<)) import Data.Aeson (FromJSON, ToJSON, (.:), (.:?), (.=)) import qualified Data.Aeson as J +import qualified Data.Aeson.KeyMap as JM import qualified Data.Aeson.Types as JT import qualified Data.Attoparsec.ByteString.Char8 as A import qualified Data.ByteString.Lazy.Char8 as LB -import qualified Data.Aeson.KeyMap as JM import Data.Text (Text) import Data.Text.Encoding (decodeLatin1, encodeUtf8) import Database.SQLite.Simple.FromField (FromField (..)) @@ -31,21 +31,13 @@ import Simplex.Messaging.Encoding.String import Simplex.Messaging.Util ((<$?>)) data ConnectionEntity - = RcvDirectMsgConnection Connection (Maybe Contact) - | RcvGroupMsgConnection Connection GroupInfo GroupMember - | SndFileConnection Connection SndFileTransfer - | RcvFileConnection Connection RcvFileTransfer - | UserContactConnection Connection UserContact + = RcvDirectMsgConnection {entityConnection :: Connection, contact :: Maybe Contact} + | RcvGroupMsgConnection {entityConnection :: Connection, groupInfo :: GroupInfo, groupMember :: GroupMember} + | SndFileConnection {entityConnection :: Connection, sndFileTransfer :: SndFileTransfer} + | RcvFileConnection {entityConnection :: Connection, rcvFileTransfer :: RcvFileTransfer} + | UserContactConnection {entityConnection :: Connection, userContact :: UserContact} deriving (Eq, Show) -fromConnection :: ConnectionEntity -> Connection -fromConnection = \case - RcvDirectMsgConnection conn _ -> conn - RcvGroupMsgConnection conn _ _ -> conn - SndFileConnection conn _ -> conn - RcvFileConnection conn _ -> conn - UserContactConnection conn _ -> conn - -- chat message is sent as JSON with these properties data AppMessage = AppMessage { event :: Text,