From 96804e73e64e374d0a9ffb9381570a90465bd1b9 Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Tue, 20 Jun 2023 17:07:17 +1000 Subject: [PATCH] WIP: fix first handling user config messages makes expire timer update message not handled --- .../MessageReceiver+ExpirationTimers.swift | 69 ++++++++++--------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationTimers.swift b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationTimers.swift index 4536ff84d..a4460142e 100644 --- a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationTimers.swift +++ b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+ExpirationTimers.swift @@ -162,24 +162,54 @@ extension MessageReceiver { .fetchOne(db, id: threadId) .defaulting(to: DisappearingMessagesConfiguration.defaultWith(threadId)) - guard - let localLastChangeTimestampMs = localConfig.lastChangeTimestampMs, - protoLastChangeTimestampMs >= localLastChangeTimestampMs - else { return } - let durationSeconds: TimeInterval = (proto.hasExpirationTimer ? TimeInterval(proto.expirationTimer) : 0) - let isEnable: Bool = (durationSeconds != 0) let disappearingType: DisappearingMessagesConfiguration.DisappearingMessageType? = (proto.hasExpirationType ? .init(protoType: proto.expirationType) : .unknown ) let remoteConfig: DisappearingMessagesConfiguration = localConfig.with( - isEnabled: isEnable, + isEnabled: (durationSeconds != 0), durationSeconds: durationSeconds, type: disappearingType, lastChangeTimestampMs: protoLastChangeTimestampMs ) + let updateControlMewssage: () throws -> () = { + _ = try Interaction + .filter(Interaction.Columns.threadId == threadId) + .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) + .deleteAll(db) + + _ = try Interaction( + serverHash: nil, + threadId: threadId, + authorId: sender, + variant: .infoDisappearingMessagesUpdate, + body: remoteConfig.messageInfoString( + with: (sender != getUserHexEncodedPublicKey(db) ? + Profile.displayName(db, id: sender) : + nil + ), + isPreviousOff: !localConfig.isEnabled + ), + timestampMs: protoLastChangeTimestampMs, + expiresInSeconds: (remoteConfig.isEnabled ? remoteConfig.durationSeconds : localConfig.durationSeconds), + expiresStartedAtMs: (!remoteConfig.isEnabled && localConfig.type == .disappearAfterSend ? + Double(protoLastChangeTimestampMs) : + nil + ) + ).inserted(db) + } + + guard let localLastChangeTimestampMs = localConfig.lastChangeTimestampMs else { return } + + guard protoLastChangeTimestampMs >= localLastChangeTimestampMs else { + if (protoLastChangeTimestampMs + Int64(localConfig.durationSeconds * 1000)) > localLastChangeTimestampMs { + try updateControlMewssage() + } + return + } + if localConfig != remoteConfig { _ = try remoteConfig.save(db) @@ -207,29 +237,6 @@ extension MessageReceiver { guard message is ExpirationTimerUpdate else { return } - _ = try Interaction - .filter(Interaction.Columns.threadId == threadId) - .filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate) - .deleteAll(db) - - _ = try Interaction( - serverHash: nil, - threadId: threadId, - authorId: sender, - variant: .infoDisappearingMessagesUpdate, - body: remoteConfig.messageInfoString( - with: (sender != getUserHexEncodedPublicKey(db) ? - Profile.displayName(db, id: sender) : - nil - ), - isPreviousOff: !localConfig.isEnabled - ), - timestampMs: protoLastChangeTimestampMs, - expiresInSeconds: (remoteConfig.isEnabled ? remoteConfig.durationSeconds : localConfig.durationSeconds), - expiresStartedAtMs: (!remoteConfig.isEnabled && localConfig.type == .disappearAfterSend ? - Double(protoLastChangeTimestampMs) : - nil - ) - ).inserted(db) + try updateControlMewssage() } }