// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import Foundation import GRDB import SessionUtilitiesKit extension MessageReceiver { internal static func handleExpirationTimerUpdate(_ db: Database, message: ExpirationTimerUpdate) throws { // Get the target thread guard let targetId: String = MessageReceiver.threadInfo(db, message: message, openGroupId: nil)?.id, let sender: String = message.sender, let thread: SessionThread = try? SessionThread.fetchOne(db, id: targetId) else { return } // Update the configuration // // Note: Messages which had been sent during the previous configuration will still // use it's settings (so if you enable, send a message and then disable disappearing // message then the message you had sent will still disappear) let config: DisappearingMessagesConfiguration = try thread.disappearingMessagesConfiguration .fetchOne(db) .defaulting(to: DisappearingMessagesConfiguration.defaultWith(thread.id)) .with( // If there is no duration then we should disable the expiration timer isEnabled: ((message.duration ?? 0) > 0), durationSeconds: ( message.duration.map { TimeInterval($0) } ?? DisappearingMessagesConfiguration.defaultDuration ) ) // Add an info message for the user _ = try Interaction( serverHash: nil, // Intentionally null so sync messages are seen as duplicates threadId: thread.id, authorId: sender, variant: .infoDisappearingMessagesUpdate, body: config.messageInfoString( with: (sender != getUserHexEncodedPublicKey(db) ? Profile.displayName(db, id: sender) : nil ), isPreviousOff: false ), timestampMs: Int64(message.sentTimestamp ?? 0) // Default to `0` if not set ).inserted(db) // Finally save the changes to the DisappearingMessagesConfiguration (If it's a duplicate // then the interaction unique constraint will prevent the code from getting here) try config.save(db) } }