diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 2226f80fab..c55f2934e2 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -2272,7 +2272,7 @@ processChatCommand cxt nm = \case Just GroupOwnerContact {contactId, memberId} | memberId == MemberId ownerId -> Just contactId _ -> Nothing - void $ createLinkOwnerMember db cxt user gInfo' ctId_ (MemberId ownerId) ownerKey + void $ getCreateLinkOwnerMember db cxt user gInfo' ctId_ (MemberId ownerId) ownerKey pure gInfo' rs <- withGroupLock "connectPreparedGroup" groupId $ mapConcurrently (connectToRelay user gInfo') relays diff --git a/src/Simplex/Chat/Store/Groups.hs b/src/Simplex/Chat/Store/Groups.hs index d607541bda..a45a814436 100644 --- a/src/Simplex/Chat/Store/Groups.hs +++ b/src/Simplex/Chat/Store/Groups.hs @@ -193,7 +193,7 @@ module Simplex.Chat.Store.Groups getXGrpLinkMemReceived, setXGrpLinkMemReceived, createNewUnknownGroupMember, - createLinkOwnerMember, + getCreateLinkOwnerMember, updatePreparedChannelMember, updateUnknownMemberAnnounced, updateRosterMemberAnnounced, @@ -3505,6 +3505,15 @@ createNewUnknownGroupMember db cxt user@User {userId, userContactId} GroupInfo { where VersionRange minV maxV = vr cxt +-- Re-use owner member record on retry: owners are created before the relay loop, +-- which is what fails when the network does (see getCreateRelayForMember) +getCreateLinkOwnerMember :: DB.Connection -> StoreCxt -> User -> GroupInfo -> Maybe ContactId -> MemberId -> C.PublicKeyEd25519 -> ExceptT StoreError IO GroupMember +getCreateLinkOwnerMember db cxt user gInfo contactId_ memberId ownerKey = + liftIO (runExceptT $ getGroupMemberByMemberId db cxt user gInfo memberId) >>= \case + Right m -> pure m + Left (SEGroupMemberNotFoundByMemberId _) -> createLinkOwnerMember db cxt user gInfo contactId_ memberId ownerKey + Left e -> throwError e + createLinkOwnerMember :: DB.Connection -> StoreCxt -> User -> GroupInfo -> Maybe ContactId -> MemberId -> C.PublicKeyEd25519 -> ExceptT StoreError IO GroupMember createLinkOwnerMember db cxt user@User {userId, userContactId} GroupInfo {groupId} contactId_ memberId ownerKey = do currentTs <- liftIO getCurrentTime