diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 3cf28e3f7a..07d19c9621 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -1120,7 +1120,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = checkSndInlineFTComplete conn msgId updateGroupItemsStatus gInfo m conn msgId GSSSent (Just $ isJust proxy) when continued $ do - sendRosterCatchUp gInfo m -- roster ahead of the resumed backlog + when (isUserGrpFwdRelay gInfo) $ forwardCachedRoster user gInfo m -- roster ahead of the resumed backlog sendPendingGroupMessages user gInfo m conn SWITCH qd phase cStats -> do toView $ CEvtGroupMemberSwitch user gInfo m (SwitchProgress qd phase cStats) @@ -1218,7 +1218,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = QCONT -> do continued <- continueSending connEntity conn when continued $ do - sendRosterCatchUp gInfo m -- roster ahead of the resumed backlog + when (isUserGrpFwdRelay gInfo) $ forwardCachedRoster user gInfo m -- roster ahead of the resumed backlog sendPendingGroupMessages user gInfo m conn MWARN msgId err -> do withStore' $ \db -> updateGroupItemsErrorStatus db msgId (groupMemberId' m) (GSSWarning $ agentSndError err) @@ -1656,11 +1656,6 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = pure True else pure False - -- Relay: on a subscriber's queue draining, forward the cached roster ahead of - -- the resumed backlog, so it holds the privileged set before the events it verifies. - sendRosterCatchUp :: GroupInfo -> GroupMember -> CM () - sendRosterCatchUp gInfo m = when (isUserGrpFwdRelay gInfo) $ forwardCachedRoster user gInfo m - -- TODO v5.7 / v6.0 - together with deprecating old group protocol establishing direct connections? -- we could save command records only for agent APIs we process continuations for (INV) withCompletedCommand :: forall e. AEntityI e => Connection -> AEvent e -> (CommandData -> CM ()) -> CM () @@ -2979,7 +2974,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = | fromRelay && isRosterRole memRole -> if memberRole' unknownMember == memRole then do - updatedMember <- withStore $ \db -> updateRosterMemberProfileAnnounced db vr user m unknownMember memInfo initialStatus + updatedMember <- withStore $ \db -> updateRosterMemberAnnounced db vr user m unknownMember memInfo initialStatus announceUnknownMember unknownMember updatedMember else messageError "x.grp.mem.new: privileged role not established by roster" $> Nothing Right unknownMember@GroupMember {memberStatus = GSMemUnknown} -> do diff --git a/src/Simplex/Chat/Store/Groups.hs b/src/Simplex/Chat/Store/Groups.hs index 12fb71ff05..8e8ad01324 100644 --- a/src/Simplex/Chat/Store/Groups.hs +++ b/src/Simplex/Chat/Store/Groups.hs @@ -172,7 +172,7 @@ module Simplex.Chat.Store.Groups createLinkOwnerMember, updatePreparedChannelMember, updateUnknownMemberAnnounced, - updateRosterMemberProfileAnnounced, + updateRosterMemberAnnounced, updateUserMemberProfileSentAt, setGroupCustomData, setGroupUIThemes, @@ -3195,8 +3195,8 @@ updateUnknownMemberAnnounced db vr user@User {userId} invitingMember unknownMemb -- Like updateUnknownMemberAnnounced but preserves member_role and member_pub_key -- (roster-established for moderators/admins; the dissemination carries only the profile). -updateRosterMemberProfileAnnounced :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> GroupMember -> MemberInfo -> GroupMemberStatus -> ExceptT StoreError IO GroupMember -updateRosterMemberProfileAnnounced db vr user@User {userId} invitingMember unknownMember@GroupMember {groupMemberId, memberChatVRange} MemberInfo {v, profile} status = do +updateRosterMemberAnnounced :: DB.Connection -> VersionRangeChat -> User -> GroupMember -> GroupMember -> MemberInfo -> GroupMemberStatus -> ExceptT StoreError IO GroupMember +updateRosterMemberAnnounced db vr user@User {userId} invitingMember unknownMember@GroupMember {groupMemberId, memberChatVRange} MemberInfo {v, profile} status = do _ <- updateMemberProfile db user unknownMember profile currentTs <- liftIO getCurrentTime liftIO $