From ef1db5a1e27f54e011133744b2da478dcb70c09b Mon Sep 17 00:00:00 2001 From: Ryan Zhao Date: Thu, 25 May 2023 17:14:25 +1000 Subject: [PATCH] WIP: Update expiration timer to be based on user config --- .../DisappearingMessageConfiguration.swift | 9 ++++++ .../SessionUtil+Contacts.swift | 31 ++++++++++++++++++- .../SessionUtil/SessionUtil.swift | 3 +- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/SessionMessagingKit/Database/Models/DisappearingMessageConfiguration.swift b/SessionMessagingKit/Database/Models/DisappearingMessageConfiguration.swift index 351b92de0..999376c4d 100644 --- a/SessionMessagingKit/Database/Models/DisappearingMessageConfiguration.swift +++ b/SessionMessagingKit/Database/Models/DisappearingMessageConfiguration.swift @@ -2,6 +2,7 @@ import Foundation import GRDB +import SessionUtil import SessionUtilitiesKit import SessionSnodeKit @@ -49,6 +50,14 @@ public struct DisappearingMessagesConfiguration: Codable, Identifiable, Equatabl } } + init(sessionUtilType: CONVO_EXPIRATION_MODE) { + switch sessionUtilType { + case CONVO_EXPIRATION_AFTER_SEND: self = .disappearAfterRead + case CONVO_EXPIRATION_AFTER_SEND: self = .disappearAfterSend + default: self = .unknown + } + } + func toProto() -> SNProtoContent.SNProtoContentExpirationType { switch self { case .unknown: return .unknown diff --git a/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Contacts.swift b/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Contacts.swift index c4465cdeb..c73f6fdd0 100644 --- a/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Contacts.swift +++ b/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Contacts.swift @@ -31,12 +31,14 @@ internal extension SessionUtil { static func handleContactsUpdate( _ db: Database, in conf: UnsafeMutablePointer?, - mergeNeedsDump: Bool + mergeNeedsDump: Bool, + latestConfigUpdateSentTimestamp: TimeInterval ) throws { typealias ContactData = [ String: ( contact: Contact, profile: Profile, + disappearingMessagesConfiguration: DisappearingMessagesConfiguration, priority: Int32, created: TimeInterval ) @@ -73,10 +75,18 @@ internal extension SessionUtil { ) ) ) + let disappearingMessagesConfigResult: DisappearingMessagesConfiguration = DisappearingMessagesConfiguration( + threadId: contactId, + isEnabled: contact.exp_seconds > 0, + durationSeconds: TimeInterval(contact.exp_seconds), + type: DisappearingMessagesConfiguration.DisappearingMessageType(sessionUtilType: contact.exp_mode), + lastChangeTimestampMs: Int64(latestConfigUpdateSentTimestamp) + ) contactData[contactId] = ( contactResult, profileResult, + disappearingMessagesConfigResult, contact.priority, TimeInterval(contact.created) ) @@ -158,9 +168,28 @@ internal extension SessionUtil { ) } + // Update disappearing messages configuration if needed + let localDisappearingMessagesConfig: DisappearingMessagesConfiguration = try DisappearingMessagesConfiguration + .fetchOne(db, id: sessionId) + .defaulting(to: DisappearingMessagesConfiguration.defaultWith(sessionId)) + + if + let remoteLastChangeTimestampMs = data.disappearingMessagesConfiguration.lastChangeTimestampMs, + let localLastChangeTimestampMs = localDisappearingMessagesConfig.lastChangeTimestampMs, + remoteLastChangeTimestampMs > localLastChangeTimestampMs + { + _ = try localDisappearingMessagesConfig.with( + isEnabled: data.disappearingMessagesConfiguration.isEnabled, + durationSeconds: data.disappearingMessagesConfiguration.durationSeconds, + type: data.disappearingMessagesConfiguration.type, + lastChangeTimestampMs: data.disappearingMessagesConfiguration.lastChangeTimestampMs + ).save(db) + } + /// If the contact's `hidden` flag doesn't match the visibility of their conversation then create/delete the /// associated contact conversation accordingly let threadInfo: PriorityVisibilityInfo? = try? SessionThread + .filter(id: sessionId) .select(.id, .variant, .pinnedPriority, .shouldBeVisible) .asRequest(of: PriorityVisibilityInfo.self) .fetchOne(db) diff --git a/SessionMessagingKit/SessionUtil/SessionUtil.swift b/SessionMessagingKit/SessionUtil/SessionUtil.swift index bcc1e67aa..046ee47e9 100644 --- a/SessionMessagingKit/SessionUtil/SessionUtil.swift +++ b/SessionMessagingKit/SessionUtil/SessionUtil.swift @@ -450,7 +450,8 @@ public enum SessionUtil { try SessionUtil.handleContactsUpdate( db, in: conf, - mergeNeedsDump: config_needs_dump(conf) + mergeNeedsDump: config_needs_dump(conf), + latestConfigUpdateSentTimestamp: messageSentTimestamp ) case .convoInfoVolatile: