diff --git a/src/Simplex/Chat.hs b/src/Simplex/Chat.hs index 3e897fdbd1..cd4c910f4e 100644 --- a/src/Simplex/Chat.hs +++ b/src/Simplex/Chat.hs @@ -253,29 +253,27 @@ processChatCommand user@User {userId, profile} = \case AddMember gName cName memRole -> do (group, contact) <- withStore $ \st -> (,) <$> getGroup st user gName <*> getContact st userId cName let Group {groupId, groupProfile, membership, members} = group - userRole = memberRole membership - userMemberId = memberId membership + GroupMember {memberRole = userRole, memberId = userMemberId} = membership when (userRole < GRAdmin || userRole < memRole) $ chatError CEGroupUserRole when (memberStatus membership == GSMemInvited) $ chatError (CEGroupNotJoined gName) unless (memberActive membership) $ chatError CEGroupMemberNotActive + let sendInvitation memberId cReq = do + sendDirectMessage (contactConn contact) $ + XGrpInv $ GroupInvitation (userMemberId, userRole) (memberId, memRole) cReq groupProfile + showSentGroupInvitation gName cName + setActive $ ActiveG gName case contactMember contact members of Nothing -> do gVar <- asks idsDrg (agentConnId, cReq) <- withAgent (`createConnection` SCMInvitation) - GroupMember {memberId} <- withStore $ \st -> createContactGroupMemberWithInvitation st gVar user groupId contact memRole agentConnId cReq - sendInvitation contact userMemberId userRole memberId groupProfile cReq + GroupMember {memberId} <- withStore $ \st -> createContactMember st gVar user groupId contact memRole agentConnId cReq + sendInvitation memberId cReq Just GroupMember {groupMemberId, memberId, memberStatus} | memberStatus == GSMemInvited -> - withStore (\st -> getContactGroupMemberInvitation st user groupMemberId) >>= \case - Just cReq -> sendInvitation contact userMemberId userRole memberId groupProfile cReq + withStore (\st -> getMemberInvitation st user groupMemberId) >>= \case + Just cReq -> sendInvitation memberId cReq Nothing -> showCannotResendInvitation gName cName | otherwise -> chatError (CEGroupDuplicateMember cName) - where - sendInvitation contact userMemberId userRole memberId groupProfile cReq = do - let msg = XGrpInv $ GroupInvitation (userMemberId, userRole) (memberId, memRole) cReq groupProfile - sendDirectMessage (contactConn contact) msg - showSentGroupInvitation gName cName - setActive $ ActiveG gName JoinGroup gName -> do ReceivedGroupInvitation {fromMember, userMember, connRequest} <- withStore $ \st -> getGroupInvitation st user gName agentConnId <- withAgent $ \a -> joinConnection a connRequest . directMessage . XGrpAcpt $ memberId userMember diff --git a/src/Simplex/Chat/Store.hs b/src/Simplex/Chat/Store.hs index 3454154cf5..bc4a493bc9 100644 --- a/src/Simplex/Chat/Store.hs +++ b/src/Simplex/Chat/Store.hs @@ -51,8 +51,8 @@ module Simplex.Chat.Store getUserGroups, getUserGroupDetails, getGroupInvitation, - createContactGroupMemberWithInvitation, - getContactGroupMemberInvitation, + createContactMember, + getMemberInvitation, createMemberConnection, updateGroupMemberStatus, createNewGroupMember, @@ -1031,16 +1031,16 @@ toGroupMember userContactId (groupMemberId, groupId, memberId, memberRole, membe activeConn = Nothing in GroupMember {..} -createContactGroupMemberWithInvitation :: StoreMonad m => SQLiteStore -> TVar ChaChaDRG -> User -> Int64 -> Contact -> GroupMemberRole -> ConnId -> ConnReqInvitation -> m GroupMember -createContactGroupMemberWithInvitation st gVar user groupId contact memberRole agentConnId connRequest = +createContactMember :: StoreMonad m => SQLiteStore -> TVar ChaChaDRG -> User -> Int64 -> Contact -> GroupMemberRole -> ConnId -> ConnReqInvitation -> m GroupMember +createContactMember st gVar user groupId contact memberRole agentConnId connRequest = liftIOEither . withTransaction st $ \db -> createWithRandomId gVar $ \memId -> do - member@GroupMember {groupMemberId} <- createContactMemberWithInvitation_ db user groupId contact (memId, memberRole) GCInviteeMember GSMemInvited IBUser (Just connRequest) + member@GroupMember {groupMemberId} <- createContactMemberInv_ db user groupId contact (memId, memberRole) GCInviteeMember GSMemInvited IBUser (Just connRequest) void $ createMemberConnection_ db (userId user) groupMemberId agentConnId Nothing 0 pure member -getContactGroupMemberInvitation :: StoreMonad m => SQLiteStore -> User -> Int64 -> m (Maybe ConnReqInvitation) -getContactGroupMemberInvitation st User {userId} groupMemberId = +getMemberInvitation :: StoreMonad m => SQLiteStore -> User -> Int64 -> m (Maybe ConnReqInvitation) +getMemberInvitation st User {userId} groupMemberId = liftIO . withTransaction st $ \db -> join . listToMaybe . map fromOnly <$> DB.query db "SELECT inv_queue_info FROM group_members WHERE group_member_id = ? AND user_id = ?;" (groupMemberId, userId) @@ -1271,10 +1271,10 @@ createMemberConnection_ db userId groupMemberId = createConnection_ db userId Co createContactMember_ :: IsContact a => DB.Connection -> User -> Int64 -> a -> (MemberId, GroupMemberRole) -> GroupMemberCategory -> GroupMemberStatus -> InvitedBy -> IO GroupMember createContactMember_ db user groupId userOrContact (memberId, memberRole) memberCategory memberStatus invitedBy = - createContactMemberWithInvitation_ db user groupId userOrContact (memberId, memberRole) memberCategory memberStatus invitedBy Nothing + createContactMemberInv_ db user groupId userOrContact (memberId, memberRole) memberCategory memberStatus invitedBy Nothing -createContactMemberWithInvitation_ :: IsContact a => DB.Connection -> User -> Int64 -> a -> (MemberId, GroupMemberRole) -> GroupMemberCategory -> GroupMemberStatus -> InvitedBy -> Maybe ConnReqInvitation -> IO GroupMember -createContactMemberWithInvitation_ db User {userId, userContactId} groupId userOrContact (memberId, memberRole) memberCategory memberStatus invitedBy connRequest = do +createContactMemberInv_ :: IsContact a => DB.Connection -> User -> Int64 -> a -> (MemberId, GroupMemberRole) -> GroupMemberCategory -> GroupMemberStatus -> InvitedBy -> Maybe ConnReqInvitation -> IO GroupMember +createContactMemberInv_ db User {userId, userContactId} groupId userOrContact (memberId, memberRole) memberCategory memberStatus invitedBy connRequest = do insertMember_ groupMemberId <- insertedRowId db let memberProfile = profile' userOrContact