From 7693e5318355363e696a64268336b09679725228 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO <> Date: Mon, 11 Dec 2023 14:39:26 +1100 Subject: [PATCH] minor refactor and fix expiration update message for control messages --- ...isappearingMessagesSettingsViewModel.swift | 39 +++---------- .../DisappearingMessageConfiguration.swift | 50 ++++++++++++++++ .../MessageReceiver+ExpirationTimers.swift | 58 ++----------------- .../SessionUtil+Contacts.swift | 11 ++-- .../SessionUtil+UserGroups.swift | 8 +-- 5 files changed, 70 insertions(+), 96 deletions(-) diff --git a/Session/Conversations/Settings/ThreadDisappearingMessagesSettingsViewModel.swift b/Session/Conversations/Settings/ThreadDisappearingMessagesSettingsViewModel.swift index e3c4291f4..669589abe 100644 --- a/Session/Conversations/Settings/ThreadDisappearingMessagesSettingsViewModel.swift +++ b/Session/Conversations/Settings/ThreadDisappearingMessagesSettingsViewModel.swift @@ -477,42 +477,19 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga _ = try updatedConfig.saved(db) let userPublicKey: String = getUserHexEncodedPublicKey(db, using: dependencies) - - if Features.useNewDisappearingMessagesConfig { - switch threadVariant { - case .contact: - _ = try Interaction - .filter(Interaction.Columns.threadId == threadId) - .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) - .filter(Interaction.Columns.authorId == userPublicKey) - .deleteAll(db) - case .legacyGroup: - _ = try Interaction - .filter(Interaction.Columns.threadId == threadId) - .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) - .deleteAll(db) - default: - break - } - } - let currentTimestampMs: Int64 = SnodeAPI.currentOffsetTimestampMs() - let interaction: Interaction = try Interaction( + let interactionId = try DisappearingMessagesConfiguration.insertControlMessage( + db, threadId: threadId, + threadVariant: threadVariant, authorId: userPublicKey, - variant: .infoDisappearingMessagesUpdate, - body: updatedConfig.messageInfoString( - threadVariant: threadVariant, - senderName: nil, - isPreviousOff: !self.config.isEnabled - ), timestampMs: currentTimestampMs, - expiresInSeconds: updatedConfig.durationSeconds, - expiresStartedAtMs: (updatedConfig.type == .disappearAfterSend ? Double(currentTimestampMs) : nil) + serverHash: nil, + updatedConfiguration: updatedConfig, + isPreviousOff: !self.config.isEnabled ) - .inserted(db) - + let duration: UInt32? = { guard !Features.useNewDisappearingMessagesConfig else { return nil } return UInt32(floor(updatedConfig.isEnabled ? updatedConfig.durationSeconds : 0)) @@ -524,7 +501,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga syncTarget: nil, duration: duration ), - interactionId: interaction.id, + interactionId: interactionId, threadId: threadId, threadVariant: threadVariant, using: dependencies diff --git a/SessionMessagingKit/Database/Models/DisappearingMessageConfiguration.swift b/SessionMessagingKit/Database/Models/DisappearingMessageConfiguration.swift index 6cd894ff7..ed0130408 100644 --- a/SessionMessagingKit/Database/Models/DisappearingMessageConfiguration.swift +++ b/SessionMessagingKit/Database/Models/DisappearingMessageConfiguration.swift @@ -245,6 +245,56 @@ public extension DisappearingMessagesConfiguration { } } +// MARK: - Control Message + +public extension DisappearingMessagesConfiguration { + static func insertControlMessage( + _ db: Database, + threadId: String, + threadVariant: SessionThread.Variant, + authorId: String, + timestampMs: Int64, + serverHash: String?, + updatedConfiguration: DisappearingMessagesConfiguration, + isPreviousOff: Bool + ) throws -> Int64? { + if Features.useNewDisappearingMessagesConfig { + switch threadVariant { + case .contact: + _ = try Interaction + .filter(Interaction.Columns.threadId == threadId) + .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) + .filter(Interaction.Columns.authorId == authorId) + .deleteAll(db) + case .legacyGroup: + _ = try Interaction + .filter(Interaction.Columns.threadId == threadId) + .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) + .deleteAll(db) + default: + break + } + } + + let interaction = try Interaction( + serverHash: serverHash, + threadId: threadId, + authorId: authorId, + variant: .infoDisappearingMessagesUpdate, + body: updatedConfiguration.messageInfoString( + threadVariant: threadVariant, + senderName: (authorId != getUserHexEncodedPublicKey(db) ? Profile.displayName(db, id: authorId) : nil), + isPreviousOff: isPreviousOff + ), + timestampMs: timestampMs, + expiresInSeconds: updatedConfiguration.durationSeconds, + expiresStartedAtMs: (updatedConfiguration.type == .disappearAfterSend ? Double(timestampMs) : nil) + ).inserted(db) + + return interaction.id + } +} + // MARK: - UI Constraints extension DisappearingMessagesConfiguration { diff --git a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationTimers.swift b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationTimers.swift index 963024ba1..e3481f9a6 100644 --- a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationTimers.swift +++ b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationTimers.swift @@ -198,68 +198,18 @@ extension MessageReceiver { } fallthrough case .contact: - try insertExpirationUpdateControlMessage( + _ = try DisappearingMessagesConfiguration.insertControlMessage( db, threadId: threadId, threadVariant: threadVariant, authorId: sender, - timestampMs: timestampMs, + timestampMs: Int64(timestampMs), serverHash: message.serverHash, - localConfig: localConfig, - remoteConfig: remoteConfig + updatedConfiguration: remoteConfig, + isPreviousOff: !localConfig.isEnabled ) default: return } } - - private static func insertExpirationUpdateControlMessage( - _ db: Database, - threadId: String, - threadVariant: SessionThread.Variant, - authorId: String, - timestampMs: UInt64, - serverHash: String?, - localConfig: DisappearingMessagesConfiguration, - remoteConfig: DisappearingMessagesConfiguration - ) throws { - guard threadVariant != .contact || authorId != getUserHexEncodedPublicKey(db) else { return } - - switch threadVariant { - case .contact: - _ = try Interaction - .filter(Interaction.Columns.threadId == threadId) - .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) - .filter(Interaction.Columns.authorId == authorId) - .deleteAll(db) - case .legacyGroup: - _ = try Interaction - .filter(Interaction.Columns.threadId == threadId) - .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) - .deleteAll(db) - default: - break - } - - _ = try Interaction - .filter(Interaction.Columns.threadId == threadId) - .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) - .filter(Interaction.Columns.authorId == authorId) - .deleteAll(db) - - _ = try Interaction( - serverHash: serverHash, - threadId: threadId, - authorId: authorId, - variant: .infoDisappearingMessagesUpdate, - body: remoteConfig.messageInfoString( - threadVariant: threadVariant, - senderName: (authorId != getUserHexEncodedPublicKey(db) ? Profile.displayName(db, id: authorId) : nil), - isPreviousOff: !localConfig.isEnabled - ), - timestampMs: Int64(timestampMs), - expiresInSeconds: remoteConfig.durationSeconds, - expiresStartedAtMs: (remoteConfig.type == .disappearAfterSend ? Double(timestampMs) : nil) - ).inserted(db) - } } diff --git a/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Contacts.swift b/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Contacts.swift index 929457f08..82fbfa49b 100644 --- a/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Contacts.swift +++ b/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Contacts.swift @@ -180,11 +180,12 @@ internal extension SessionUtil { .defaulting(to: DisappearingMessagesConfiguration.defaultWith(sessionId)) if data.config != localConfig { - _ = try localConfig.with( - isEnabled: data.config.isEnabled, - durationSeconds: data.config.durationSeconds, - type: data.config.type - ).save(db) + _ = try data.config.save(db) + _ = try Interaction + .filter(Interaction.Columns.threadId == sessionId) + .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) + .filter(Interaction.Columns.authorId == getUserHexEncodedPublicKey(db)) + .deleteAll(db) } } diff --git a/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+UserGroups.swift b/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+UserGroups.swift index 7864329b2..4cb40eb4a 100644 --- a/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+UserGroups.swift +++ b/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+UserGroups.swift @@ -277,12 +277,8 @@ internal extension SessionUtil { .fetchOne(db, id: group.id) .defaulting(to: DisappearingMessagesConfiguration.defaultWith(group.id)) - if let remoteConfig = group.disappearingConfig { - _ = try localConfig.with( - isEnabled: remoteConfig.isEnabled, - durationSeconds: remoteConfig.durationSeconds, - type: remoteConfig.type - ).save(db) + if let remoteConfig = group.disappearingConfig, localConfig != remoteConfig { + _ = try remoteConfig.save(db) _ = try Interaction .filter(Interaction.Columns.threadId == group.id)