diff --git a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+VisibleMessages.swift b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+VisibleMessages.swift index 2e06419a1..7dade7f97 100644 --- a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+VisibleMessages.swift +++ b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+VisibleMessages.swift @@ -186,7 +186,7 @@ extension MessageReceiver { else { break } // If we receive an outgoing message that already exists in the database - // then we still need up update the recipient and read states for the + // then we still need to update the recipient and read states for the // message (even if we don't need to do anything else) try updateRecipientAndReadStatesForOutgoingInteraction( db, @@ -197,6 +197,14 @@ extension MessageReceiver { syncTarget: message.syncTarget ) + getExpirationForOutgoingDisappearingMessages( + db, + threadId: threadId, + variant: variant, + serverHash: message.serverHash, + expireInSeconds: expiresInSeconds + ) + default: break } @@ -215,6 +223,14 @@ extension MessageReceiver { syncTarget: message.syncTarget ) + getExpirationForOutgoingDisappearingMessages( + db, + threadId: threadId, + variant: variant, + serverHash: message.serverHash, + expireInSeconds: expiresInSeconds + ) + // Parse & persist attachments let attachments: [Attachment] = try dataMessage.attachments .compactMap { proto -> Attachment? in @@ -483,4 +499,36 @@ extension MessageReceiver { _ = try pendingReadReceipt.delete(db) } } + + private static func getExpirationForOutgoingDisappearingMessages( + _ db: Database, + threadId: String, + variant: Interaction.Variant, + serverHash: String?, + expireInSeconds: TimeInterval? + ) { + guard + variant == .standardOutgoing, + let serverHash: String = serverHash, + let expireInSeconds: TimeInterval = expireInSeconds, + expireInSeconds > 0 + else { + return + } + + let startedAtTimestampMs: Double = Double(SnodeAPI.currentOffsetTimestampMs()) + + JobRunner.add( + db, + job: Job( + variant: .getExpiration, + behaviour: .runOnce, + threadId: threadId, + details: GetExpirationJob.Details( + expirationInfo: [serverHash: expireInSeconds], + startedAtTimestampMs: startedAtTimestampMs + ) + ) + ) + } } diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender.swift b/SessionMessagingKit/Sending & Receiving/MessageSender.swift index 02115bdea..b129902e5 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender.swift @@ -946,8 +946,25 @@ public final class MessageSender { openGroupServerMessageId: message.openGroupServerMessageId.map { Int64($0) } ).update(db) - if interaction.isExpiringMessage { - + if + interaction.isExpiringMessage && isSyncMessage, + let startedAtMs: Double = interaction.expiresStartedAtMs, + let expiresInSeconds: TimeInterval = interaction.expiresInSeconds, + let serverHash: String = message.serverHash + { + let expirationTimestampMs: Int64 = Int64(startedAtMs + expiresInSeconds * 1000) + JobRunner.add( + db, + job: Job( + variant: .expirationUpdate, + behaviour: .runOnce, + threadId: interaction.threadId, + details: ExpirationUpdateJob.Details( + serverHashes: [serverHash], + expirationTimestampMs: expirationTimestampMs + ) + ) + ) } }