You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationT...

75 lines
3.1 KiB
Swift

// 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
!DisappearingMessagesConfiguration.isNewConfigurationEnabled,
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 defaultType: DisappearingMessagesConfiguration.DisappearingMessageType? = {
switch thread.variant {
case .contact:
if thread.id == getUserHexEncodedPublicKey() { fallthrough }
return .disappearAfterRead
case .closedGroup:
return .disappearAfterSend
case .openGroup:
return nil // Shouldn't happen
}
}()
let localConfig: DisappearingMessagesConfiguration = try thread.disappearingMessagesConfiguration
.fetchOne(db)
.defaulting(to: DisappearingMessagesConfiguration.defaultWith(thread.id))
let remoteConfig: DisappearingMessagesConfiguration = localConfig.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
),
type: defaultType
)
try remoteConfig.save(db)
// Remove previous info messages
_ = try Interaction
.filter(Interaction.Columns.threadId == thread.id)
.filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate)
.deleteAll(db)
// 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: remoteConfig.messageInfoString(
with: (sender != getUserHexEncodedPublicKey(db) ?
Profile.displayName(db, id: sender) :
nil
),
isPreviousOff: false
),
timestampMs: Int64(message.sentTimestamp ?? 0), // Default to `0` if not set
expiresInSeconds: remoteConfig.isEnabled ? nil : localConfig.durationSeconds
).inserted(db)
}
}