diff --git a/Session/Closed Groups/EditClosedGroupVC.swift b/Session/Closed Groups/EditClosedGroupVC.swift index 5cbfd735a..2a04c703f 100644 --- a/Session/Closed Groups/EditClosedGroupVC.swift +++ b/Session/Closed Groups/EditClosedGroupVC.swift @@ -451,11 +451,12 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat Storage.shared .writeAsync { db in if !updatedMemberIds.contains(userPublicKey) { - return try MessageSender - .leave(db, groupPublicKey: threadId) - .map { (_, error) in - if let error: Error = error { throw error } - } + try MessageSender.leave( + db, + groupPublicKey: threadId, + deleteThread: false + ) + return Promise.value(()) } return try MessageSender.update( diff --git a/Session/Conversations/Settings/ThreadSettingsViewModel.swift b/Session/Conversations/Settings/ThreadSettingsViewModel.swift index 21732ffda..bc99c9f00 100644 --- a/Session/Conversations/Settings/ThreadSettingsViewModel.swift +++ b/Session/Conversations/Settings/ThreadSettingsViewModel.swift @@ -405,7 +405,7 @@ class ThreadSettingsViewModel: SessionTableViewModel = try decoder.container(keyedBy: CodingKeys.self) self = Details( - infoMessageInteractionId: try container.decode(Int64.self, forKey: .infoMessageInteractionId), groupPublicKey: try container.decode(String.self, forKey: .groupPublicKey), - deleteThreadAfterSuccess: try container.decode(Bool.self, forKey: .deleteThreadAfterSuccess) + deleteThread: try container.decode(Bool.self, forKey: .deleteThread) ) } public func encode(to encoder: Encoder) throws { var container: KeyedEncodingContainer = encoder.container(keyedBy: CodingKeys.self) - try container.encode(infoMessageInteractionId, forKey: .infoMessageInteractionId) try container.encode(groupPublicKey, forKey: .groupPublicKey) - try container.encode(deleteThreadAfterSuccess, forKey: .deleteThreadAfterSuccess) + try container.encode(deleteThread, forKey: .deleteThread) } } } diff --git a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageSender+ClosedGroups.swift b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageSender+ClosedGroups.swift index 6fc0b8dd7..2c39666cb 100644 --- a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageSender+ClosedGroups.swift +++ b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageSender+ClosedGroups.swift @@ -478,13 +478,9 @@ extension MessageSender { /// unregisters from push notifications. /// /// The returned promise is fulfilled when the `MEMBER_LEFT` message has been sent to the group. - public static func leave(_ db: Database, groupPublicKey: String) throws -> Promise<(Int64, Error?)> { + public static func leave(_ db: Database, groupPublicKey: String, deleteThread: Bool) throws { guard let thread: SessionThread = try? SessionThread.fetchOne(db, id: groupPublicKey) else { - SNLog("Can't leave nonexistent closed group.") - return Promise(error: MessageSenderError.noThread) - } - guard let closedGroup: ClosedGroup = try? thread.closedGroup.fetchOne(db) else { - return Promise(error: MessageSenderError.invalidClosedGroupUpdate) + return } let userPublicKey: String = getUserHexEncodedPublicKey(db) @@ -498,78 +494,18 @@ extension MessageSender { timestampMs: SnodeAPI.currentOffsetTimestampMs() ).inserted(db) - guard let interactionId: Int64 = interaction.id else { - throw StorageError.objectNotSaved - } - - // Send the update to the group - let (promise, seal) = Promise<(Int64, Error?)>.pending() - do { - try MessageSender - .sendNonDurably( - db, - message: ClosedGroupControlMessage( - kind: .memberLeft - ), - interactionId: interactionId, - in: thread + JobRunner.add( + db, + job: Job( + variant: .groupLeaving, + threadId: thread.id, + interactionId: interaction.id, + details: GroupLeavingJob.Details( + groupPublicKey: groupPublicKey, + deleteThread: deleteThread ) - .done { - // Remove the group from the database and unsubscribe from PNs - ClosedGroupPoller.shared.stopPolling(for: groupPublicKey) - - Storage.shared.write { db in - try closedGroup - .keyPairs - .deleteAll(db) - - let _ = PushNotificationAPI.performOperation( - .unsubscribe, - for: groupPublicKey, - publicKey: userPublicKey - ) - - try Interaction - .filter(id: interactionId) - .updateAll( - db, - [ - Interaction.Columns.variant.set(to: Interaction.Variant.infoClosedGroupCurrentUserLeft), - Interaction.Columns.body.set(to: "GROUP_YOU_LEFT".localized()) - ] - ) - - // Update the group (if the admin leaves the group is disbanded) - let wasAdminUser: Bool = try GroupMember - .filter(GroupMember.Columns.groupId == thread.id) - .filter(GroupMember.Columns.profileId == userPublicKey) - .filter(GroupMember.Columns.role == GroupMember.Role.admin) - .isNotEmpty(db) - - if wasAdminUser { - try GroupMember - .filter(GroupMember.Columns.groupId == thread.id) - .deleteAll(db) - } - else { - try GroupMember - .filter(GroupMember.Columns.groupId == thread.id) - .filter(GroupMember.Columns.profileId == userPublicKey) - .deleteAll(db) - } - } - seal.fulfill((interactionId, nil)) - } - .catch { error in - seal.fulfill((interactionId, error)) - } - } - catch { - seal.fulfill((interactionId, error)) - } - - // Return - return promise + ) + ) } /* diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender.swift b/SessionMessagingKit/Sending & Receiving/MessageSender.swift index 32bb8cbc5..8c1211f2e 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender.swift @@ -763,26 +763,3 @@ public final class MessageSender { } } } - -// MARK: - Objective-C Support - -// FIXME: Remove when possible - -@objc(SMKMessageSender) -public class SMKMessageSender: NSObject { - @objc(leaveClosedGroupWithPublicKey:) - public static func objc_leave(_ groupPublicKey: String) -> AnyPromise { - let promise = Storage.shared.writeAsync { db in - try MessageSender.leave(db, groupPublicKey: groupPublicKey) - } - - return AnyPromise.from(promise) - } - - @objc(forceSyncConfigurationNow) - public static func objc_forceSyncConfigurationNow() { - Storage.shared.write { db in - try MessageSender.syncConfiguration(db, forceSyncNow: true).retainUntilComplete() - } - } -} diff --git a/SessionUtilitiesKit/JobRunner/JobRunner.swift b/SessionUtilitiesKit/JobRunner/JobRunner.swift index 7d604f0ba..408904cc5 100644 --- a/SessionUtilitiesKit/JobRunner/JobRunner.swift +++ b/SessionUtilitiesKit/JobRunner/JobRunner.swift @@ -66,7 +66,8 @@ public final class JobRunner { jobVariants.remove(.attachmentUpload), jobVariants.remove(.messageSend), jobVariants.remove(.notifyPushServer), - jobVariants.remove(.sendReadReceipts) + jobVariants.remove(.sendReadReceipts), + jobVariants.remove(.groupLeaving) ].compactMap { $0 } ) let messageReceiveQueue: JobQueue = JobQueue(