From 3cdb5450294c30374c6e7091fd30ceaa1805627e Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 12 Feb 2021 12:44:23 +0400 Subject: [PATCH 1/2] Message autoremove fixes --- .../AutoremoveTimeoutMessageAttribute.swift | 42 ++++------ .../TelegramCore/Sources/EnqueueMessage.swift | 84 +++++++++++++++---- .../ManagedAutoremoveMessageOperations.swift | 5 +- .../TelegramUI/Sources/ChatController.swift | 6 +- .../Sources/ChatInterfaceInputContexts.swift | 18 ++-- 5 files changed, 99 insertions(+), 56 deletions(-) diff --git a/submodules/SyncCore/Sources/AutoremoveTimeoutMessageAttribute.swift b/submodules/SyncCore/Sources/AutoremoveTimeoutMessageAttribute.swift index 10c5bed0a0..4e31c687bf 100644 --- a/submodules/SyncCore/Sources/AutoremoveTimeoutMessageAttribute.swift +++ b/submodules/SyncCore/Sources/AutoremoveTimeoutMessageAttribute.swift @@ -2,20 +2,14 @@ import Foundation import Postbox public class AutoremoveTimeoutMessageAttribute: MessageAttribute { - public enum Action: Int32 { - case remove = 0 - case clear = 1 - } - public let timeout: Int32 public let countdownBeginTime: Int32? - public let action: Action public var associatedMessageIds: [MessageId] = [] public let automaticTimestampBasedAttribute: (UInt16, Int32)? - public init(timeout: Int32, countdownBeginTime: Int32?, action: Action = .remove) { + public init(timeout: Int32, countdownBeginTime: Int32?) { self.timeout = timeout self.countdownBeginTime = countdownBeginTime @@ -24,8 +18,6 @@ public class AutoremoveTimeoutMessageAttribute: MessageAttribute { } else { self.automaticTimestampBasedAttribute = nil } - - self.action = action } required public init(decoder: PostboxDecoder) { @@ -37,8 +29,6 @@ public class AutoremoveTimeoutMessageAttribute: MessageAttribute { } else { self.automaticTimestampBasedAttribute = nil } - - self.action = Action(rawValue: decoder.decodeInt32ForKey("a", orElse: 0)) ?? .remove } public func encode(_ encoder: PostboxEncoder) { @@ -48,24 +38,30 @@ public class AutoremoveTimeoutMessageAttribute: MessageAttribute { } else { encoder.encodeNil(forKey: "c") } - encoder.encodeInt32(self.action.rawValue, forKey: "a") } } public extension Message { - var containsSecretMedia: Bool { - var found = false + var minAutoremoveOrClearTimeout: Int32? { + var timeout: Int32? for attribute in self.attributes { if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { - if attribute.timeout > 1 * 60 { - return false + if let timeoutValue = timeout { + timeout = min(timeoutValue, attribute.timeout) + } else { + timeout = attribute.timeout } - found = true break } } - - if !found { + return timeout + } + + var containsSecretMedia: Bool { + guard let timeout = self.minAutoremoveOrClearTimeout else { + return false + } + if timeout > 1 * 60 { return false } @@ -86,11 +82,7 @@ public extension Message { } var isSelfExpiring: Bool { - for attribute in self.attributes { - if let _ = attribute as? AutoremoveTimeoutMessageAttribute { - return true - } - } - return false + return self.minAutoremoveOrClearTimeout != nil } } + diff --git a/submodules/TelegramCore/Sources/EnqueueMessage.swift b/submodules/TelegramCore/Sources/EnqueueMessage.swift index 3f96cd5e65..df928c1fbf 100644 --- a/submodules/TelegramCore/Sources/EnqueueMessage.swift +++ b/submodules/TelegramCore/Sources/EnqueueMessage.swift @@ -324,36 +324,55 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, switch message { case let .message(text, requestedAttributes, mediaReference, replyToMessageId, localGroupingKey): + var peerAutoremoveTimeout: Int32? if let peer = peer as? TelegramSecretChat { var isAction = false if let _ = mediaReference?.media as? TelegramMediaAction { isAction = true } if !disableAutoremove, let messageAutoremoveTimeout = peer.messageAutoremoveTimeout, !isAction { - attributes.append(AutoremoveTimeoutMessageAttribute(timeout: messageAutoremoveTimeout, countdownBeginTime: nil)) + peerAutoremoveTimeout = messageAutoremoveTimeout } - } else if let cachedData = transaction.getPeerCachedData(peerId: peer.id) { - var messageAutoremoveTimeout: Int32? - if let cachedData = cachedData as? CachedUserData { - if case let .known(value) = cachedData.autoremoveTimeout { - messageAutoremoveTimeout = value?.effectiveValue - } - } else if let cachedData = cachedData as? CachedGroupData { - if case let .known(value) = cachedData.autoremoveTimeout { - messageAutoremoveTimeout = value?.effectiveValue - } - } else if let cachedData = cachedData as? CachedChannelData { - if case let .known(value) = cachedData.autoremoveTimeout { - messageAutoremoveTimeout = value?.effectiveValue + } else if let cachedData = transaction.getPeerCachedData(peerId: peer.id), !disableAutoremove { + var isScheduled = false + for attribute in requestedAttributes { + if let _ = attribute as? OutgoingScheduleInfoMessageAttribute { + isScheduled = true } } - if let messageAutoremoveTimeout = messageAutoremoveTimeout { - attributes.append(AutoremoveTimeoutMessageAttribute(timeout: messageAutoremoveTimeout, countdownBeginTime: nil)) + if !isScheduled { + var messageAutoremoveTimeout: Int32? + if let cachedData = cachedData as? CachedUserData { + if case let .known(value) = cachedData.autoremoveTimeout { + messageAutoremoveTimeout = value?.effectiveValue + } + } else if let cachedData = cachedData as? CachedGroupData { + if case let .known(value) = cachedData.autoremoveTimeout { + messageAutoremoveTimeout = value?.effectiveValue + } + } else if let cachedData = cachedData as? CachedChannelData { + if case let .known(value) = cachedData.autoremoveTimeout { + messageAutoremoveTimeout = value?.effectiveValue + } + } + + if let messageAutoremoveTimeout = messageAutoremoveTimeout { + peerAutoremoveTimeout = messageAutoremoveTimeout + } } } - attributes.append(contentsOf: filterMessageAttributesForOutgoingMessage(requestedAttributes)) + for attribute in filterMessageAttributesForOutgoingMessage(requestedAttributes) { + if let _ = attribute as? AutoremoveTimeoutMessageAttribute { + peerAutoremoveTimeout = nil + } + attributes.append(attribute) + } + + if let peerAutoremoveTimeout = peerAutoremoveTimeout { + attributes.append(AutoremoveTimeoutMessageAttribute(timeout: peerAutoremoveTimeout, countdownBeginTime: nil)) + } if let replyToMessageId = replyToMessageId, replyToMessageId.peerId == peerId { var threadMessageId: MessageId? @@ -470,7 +489,7 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, } storeMessages.append(StoreMessage(peerId: peerId, namespace: messageNamespace, globallyUniqueId: randomId, groupingKey: localGroupingKey, threadId: threadId, timestamp: effectiveTimestamp, flags: flags, tags: tags, globalTags: globalTags, localTags: localTags, forwardInfo: nil, authorId: authorId, text: text, attributes: attributes, media: mediaList)) - case let .forward(source, grouping, requestedAttributes): + case let .forward(source, grouping, requestedAttributes): let sourceMessage = transaction.getMessage(source) if let sourceMessage = sourceMessage, let author = sourceMessage.author ?? sourceMessage.peers[sourceMessage.id.peerId] { if let peer = peer as? TelegramSecretChat { @@ -483,6 +502,35 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, if !disableAutoremove, let messageAutoremoveTimeout = peer.messageAutoremoveTimeout, !isAction { attributes.append(AutoremoveTimeoutMessageAttribute(timeout: messageAutoremoveTimeout, countdownBeginTime: nil)) } + } else if let cachedData = transaction.getPeerCachedData(peerId: peer.id), !disableAutoremove { + var isScheduled = false + for attribute in attributes { + if let _ = attribute as? OutgoingScheduleInfoMessageAttribute { + isScheduled = true + break + } + } + + if !isScheduled { + var messageAutoremoveTimeout: Int32? + if let cachedData = cachedData as? CachedUserData { + if case let .known(value) = cachedData.autoremoveTimeout { + messageAutoremoveTimeout = value?.effectiveValue + } + } else if let cachedData = cachedData as? CachedGroupData { + if case let .known(value) = cachedData.autoremoveTimeout { + messageAutoremoveTimeout = value?.effectiveValue + } + } else if let cachedData = cachedData as? CachedChannelData { + if case let .known(value) = cachedData.autoremoveTimeout { + messageAutoremoveTimeout = value?.effectiveValue + } + } + + if let messageAutoremoveTimeout = messageAutoremoveTimeout { + attributes.append(AutoremoveTimeoutMessageAttribute(timeout: messageAutoremoveTimeout, countdownBeginTime: nil)) + } + } } var forwardInfo: StoreMessageForwardInfo? diff --git a/submodules/TelegramCore/Sources/ManagedAutoremoveMessageOperations.swift b/submodules/TelegramCore/Sources/ManagedAutoremoveMessageOperations.swift index 77e382f7e1..08244b9100 100644 --- a/submodules/TelegramCore/Sources/ManagedAutoremoveMessageOperations.swift +++ b/submodules/TelegramCore/Sources/ManagedAutoremoveMessageOperations.swift @@ -76,14 +76,13 @@ func managedAutoremoveMessageOperations(network: Network, postbox: Postbox) -> S |> suspendAwareDelay(max(0.0, Double(entry.timestamp) - timestamp), queue: Queue.concurrentDefaultQueue()) |> then(postbox.transaction { transaction -> Void in if let message = transaction.getMessage(entry.messageId) { - var action: AutoremoveTimeoutMessageAttribute.Action = .remove for attribute in message.attributes { if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { - action = attribute.action + } } - if message.id.peerId.namespace == Namespaces.Peer.SecretChat || action == .remove { + if message.id.peerId.namespace == Namespaces.Peer.SecretChat || true { deleteMessages(transaction: transaction, mediaBox: postbox.mediaBox, ids: [entry.messageId]) } else { transaction.updateMessage(message.id, update: { currentMessage in diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 00cab4e8e7..7d5741d4cd 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -5585,7 +5585,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let tooltipController = strongSelf.silentPostTooltipController { tooltipController.updateContent(.text(text), animated: true, extendTimer: true) } else { - let tooltipController = TooltipController(content: .text(text), baseFontSize: strongSelf.presentationData.listsFontSize.baseDisplaySize) + let tooltipController = TooltipController(content: .text(text), baseFontSize: strongSelf.presentationData.listsFontSize.baseDisplaySize, timeout: 4.0) strongSelf.silentPostTooltipController = tooltipController tooltipController.dismissed = { [weak tooltipController] _ in if let strongSelf = self, let tooltipController = tooltipController, strongSelf.silentPostTooltipController === tooltipController { @@ -7737,9 +7737,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G var currentAutoremoveTimeout: Int32? = self.presentationInterfaceState.autoremoveTimeout var canSetupAutoremoveTimeout = false - if let secretChat = peer as? TelegramSecretChat { - currentAutoremoveTimeout = secretChat.messageAutoremoveTimeout - canSetupAutoremoveTimeout = true + if let _ = peer as? TelegramSecretChat { } else if let group = peer as? TelegramGroup { if case .creator = group.role { canSetupAutoremoveTimeout = true diff --git a/submodules/TelegramUI/Sources/ChatInterfaceInputContexts.swift b/submodules/TelegramUI/Sources/ChatInterfaceInputContexts.swift index b75b308074..c651663a7b 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceInputContexts.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceInputContexts.swift @@ -255,8 +255,11 @@ func inputTextPanelStateForChatPresentationInterfaceState(_ chatPresentationInte } if canSetupAutoremoveTimeout { - if currentAutoremoveTimeout != nil || chatPresentationInterfaceState.renderedPeer?.peer is TelegramSecretChat { - accessoryItems.append(.messageAutoremoveTimeout(currentAutoremoveTimeout)) + if case .scheduledMessages = chatPresentationInterfaceState.subject { + } else { + if currentAutoremoveTimeout != nil || chatPresentationInterfaceState.renderedPeer?.peer is TelegramSecretChat { + accessoryItems.append(.messageAutoremoveTimeout(currentAutoremoveTimeout)) + } } } @@ -279,10 +282,13 @@ func inputTextPanelStateForChatPresentationInterfaceState(_ chatPresentationInte } } if !extendedSearchLayout { - if let peer = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramSecretChat { - accessoryItems.append(.messageAutoremoveTimeout(peer.messageAutoremoveTimeout)) - } else if currentAutoremoveTimeout != nil && chatPresentationInterfaceState.interfaceState.composeInputState.inputText.length == 0 { - accessoryItems.append(.messageAutoremoveTimeout(currentAutoremoveTimeout)) + if case .scheduledMessages = chatPresentationInterfaceState.subject { + } else { + if let peer = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramSecretChat { + accessoryItems.append(.messageAutoremoveTimeout(peer.messageAutoremoveTimeout)) + } else if currentAutoremoveTimeout != nil && chatPresentationInterfaceState.interfaceState.composeInputState.inputText.length == 0 { + accessoryItems.append(.messageAutoremoveTimeout(currentAutoremoveTimeout)) + } } } From a7c7dbfd02d59e8b8c864e0b53338dd80a740ebe Mon Sep 17 00:00:00 2001 From: Ali <> Date: Fri, 12 Feb 2021 14:19:08 +0400 Subject: [PATCH 2/2] Add a separate autoclear attribute --- .../SecretMediaPreviewController.swift | 47 +++++++++----- .../AutoremoveTimeoutMessageAttribute.swift | 65 ++++++++++++++++++- submodules/TelegramCore/Sources/Account.swift | 3 +- .../TelegramCore/Sources/AccountManager.swift | 1 + .../Sources/AccountStateManagementUtils.swift | 2 +- .../TelegramCore/Sources/EnqueueMessage.swift | 12 +++- .../ManagedAutoremoveMessageOperations.swift | 14 ++-- ...essageContentAsConsumedInteractively.swift | 49 +++++++++++++- .../TelegramCore/Sources/MessageUtils.swift | 3 + .../PendingMessageUploadedContent.swift | 31 +++++---- .../Sources/RequestEditMessage.swift | 2 +- .../Sources/StoreMessage_Telegram.swift | 18 +++-- .../ChatInterfaceStateContextMenus.swift | 5 ++ ...atMessageInteractiveInstantVideoNode.swift | 13 ++-- .../ChatMessageInteractiveMediaNode.swift | 28 ++++---- submodules/TgVoipWebrtc/tgcalls | 2 +- 16 files changed, 213 insertions(+), 82 deletions(-) diff --git a/submodules/GalleryUI/Sources/SecretMediaPreviewController.swift b/submodules/GalleryUI/Sources/SecretMediaPreviewController.swift index 34fc1e1adf..8d23425be3 100644 --- a/submodules/GalleryUI/Sources/SecretMediaPreviewController.swift +++ b/submodules/GalleryUI/Sources/SecretMediaPreviewController.swift @@ -270,16 +270,22 @@ public final class SecretMediaPreviewController: ViewController { videoDuration = file.duration } } - for attribute in message.attributes { - if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { - if let countdownBeginTime = attribute.countdownBeginTime { - if let videoDuration = videoDuration { - beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, Double(videoDuration)) - } else { - beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) - } + + if let attribute = message.autoclearAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + if let videoDuration = videoDuration { + beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, Double(videoDuration)) + } else { + beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) + } + } + } else if let attribute = message.autoremoveAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + if let videoDuration = videoDuration { + beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, Double(videoDuration)) + } else { + beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) } - break } } @@ -453,16 +459,21 @@ public final class SecretMediaPreviewController: ViewController { videoDuration = file.duration } } - for attribute in message.attributes { - if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { - if let countdownBeginTime = attribute.countdownBeginTime { - if let videoDuration = videoDuration { - beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, Double(videoDuration)) - } else { - beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) - } + if let attribute = message.autoclearAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + if let videoDuration = videoDuration { + beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, Double(videoDuration)) + } else { + beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) + } + } + } else if let attribute = message.autoremoveAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + if let videoDuration = videoDuration { + beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, Double(videoDuration)) + } else { + beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) } - break } } diff --git a/submodules/SyncCore/Sources/AutoremoveTimeoutMessageAttribute.swift b/submodules/SyncCore/Sources/AutoremoveTimeoutMessageAttribute.swift index 4e31c687bf..77e1eec8dc 100644 --- a/submodules/SyncCore/Sources/AutoremoveTimeoutMessageAttribute.swift +++ b/submodules/SyncCore/Sources/AutoremoveTimeoutMessageAttribute.swift @@ -41,7 +41,65 @@ public class AutoremoveTimeoutMessageAttribute: MessageAttribute { } } +public class AutoclearTimeoutMessageAttribute: MessageAttribute { + public let timeout: Int32 + public let countdownBeginTime: Int32? + + public var associatedMessageIds: [MessageId] = [] + + public let automaticTimestampBasedAttribute: (UInt16, Int32)? + + public init(timeout: Int32, countdownBeginTime: Int32?) { + self.timeout = timeout + self.countdownBeginTime = countdownBeginTime + + if let countdownBeginTime = countdownBeginTime { + self.automaticTimestampBasedAttribute = (1, countdownBeginTime + timeout) + } else { + self.automaticTimestampBasedAttribute = nil + } + } + + required public init(decoder: PostboxDecoder) { + self.timeout = decoder.decodeInt32ForKey("t", orElse: 0) + self.countdownBeginTime = decoder.decodeOptionalInt32ForKey("c") + + if let countdownBeginTime = self.countdownBeginTime { + self.automaticTimestampBasedAttribute = (1, countdownBeginTime + self.timeout) + } else { + self.automaticTimestampBasedAttribute = nil + } + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeInt32(self.timeout, forKey: "t") + if let countdownBeginTime = self.countdownBeginTime { + encoder.encodeInt32(countdownBeginTime, forKey: "c") + } else { + encoder.encodeNil(forKey: "c") + } + } +} + public extension Message { + var autoremoveAttribute: AutoremoveTimeoutMessageAttribute? { + for attribute in self.attributes { + if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { + return attribute + } + } + return nil + } + + var autoclearAttribute: AutoclearTimeoutMessageAttribute? { + for attribute in self.attributes { + if let attribute = attribute as? AutoclearTimeoutMessageAttribute { + return attribute + } + } + return nil + } + var minAutoremoveOrClearTimeout: Int32? { var timeout: Int32? for attribute in self.attributes { @@ -51,7 +109,12 @@ public extension Message { } else { timeout = attribute.timeout } - break + } else if let attribute = attribute as? AutoclearTimeoutMessageAttribute { + if let timeoutValue = timeout { + timeout = min(timeoutValue, attribute.timeout) + } else { + timeout = attribute.timeout + } } } return timeout diff --git a/submodules/TelegramCore/Sources/Account.swift b/submodules/TelegramCore/Sources/Account.swift index cd69c00329..2f043eb239 100644 --- a/submodules/TelegramCore/Sources/Account.swift +++ b/submodules/TelegramCore/Sources/Account.swift @@ -1026,7 +1026,8 @@ public class Account { self.managedOperationsDisposable.add(managedSecretChatOutgoingOperations(auxiliaryMethods: auxiliaryMethods, postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add(managedCloudChatRemoveMessagesOperations(postbox: self.postbox, network: self.network, stateManager: self.stateManager).start()) - self.managedOperationsDisposable.add(managedAutoremoveMessageOperations(network: self.network, postbox: self.postbox).start()) + self.managedOperationsDisposable.add(managedAutoremoveMessageOperations(network: self.network, postbox: self.postbox, isRemove: true).start()) + self.managedOperationsDisposable.add(managedAutoremoveMessageOperations(network: self.network, postbox: self.postbox, isRemove: false).start()) self.managedOperationsDisposable.add(managedGlobalNotificationSettings(postbox: self.postbox, network: self.network).start()) self.managedOperationsDisposable.add(managedSynchronizePinnedChatsOperations(postbox: self.postbox, network: self.network, accountPeerId: self.peerId, stateManager: self.stateManager).start()) diff --git a/submodules/TelegramCore/Sources/AccountManager.swift b/submodules/TelegramCore/Sources/AccountManager.swift index b36e49cd4d..d89f4757b9 100644 --- a/submodules/TelegramCore/Sources/AccountManager.swift +++ b/submodules/TelegramCore/Sources/AccountManager.swift @@ -67,6 +67,7 @@ private var declaredEncodables: Void = { declareEncodable(SecretFileMediaResource.self, f: { SecretFileMediaResource(decoder: $0) }) declareEncodable(CloudChatRemoveMessagesOperation.self, f: { CloudChatRemoveMessagesOperation(decoder: $0) }) declareEncodable(AutoremoveTimeoutMessageAttribute.self, f: { AutoremoveTimeoutMessageAttribute(decoder: $0) }) + declareEncodable(AutoclearTimeoutMessageAttribute.self, f: { AutoclearTimeoutMessageAttribute(decoder: $0) }) declareEncodable(GlobalNotificationSettings.self, f: { GlobalNotificationSettings(decoder: $0) }) declareEncodable(CloudChatRemoveChatOperation.self, f: { CloudChatRemoveChatOperation(decoder: $0) }) declareEncodable(SynchronizePinnedChatsOperation.self, f: { SynchronizePinnedChatsOperation(decoder: $0) }) diff --git a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift index 40204a00c0..d5cc5fea87 100644 --- a/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/AccountStateManagementUtils.swift @@ -1006,7 +1006,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo medias.append(mediaValue) } if let expirationTimer = expirationTimer { - attributes.append(AutoremoveTimeoutMessageAttribute(timeout: expirationTimer, countdownBeginTime: nil)) + attributes.append(AutoclearTimeoutMessageAttribute(timeout: expirationTimer, countdownBeginTime: nil)) } if type.hasPrefix("auth") { diff --git a/submodules/TelegramCore/Sources/EnqueueMessage.swift b/submodules/TelegramCore/Sources/EnqueueMessage.swift index df928c1fbf..6c5fddddc3 100644 --- a/submodules/TelegramCore/Sources/EnqueueMessage.swift +++ b/submodules/TelegramCore/Sources/EnqueueMessage.swift @@ -364,10 +364,16 @@ func enqueueMessages(transaction: Transaction, account: Account, peerId: PeerId, } for attribute in filterMessageAttributesForOutgoingMessage(requestedAttributes) { - if let _ = attribute as? AutoremoveTimeoutMessageAttribute { - peerAutoremoveTimeout = nil + if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { + if let _ = peer as? TelegramSecretChat { + peerAutoremoveTimeout = nil + attributes.append(attribute) + } else { + attributes.append(AutoclearTimeoutMessageAttribute(timeout: attribute.timeout, countdownBeginTime: nil)) + } + } else { + attributes.append(attribute) } - attributes.append(attribute) } if let peerAutoremoveTimeout = peerAutoremoveTimeout { diff --git a/submodules/TelegramCore/Sources/ManagedAutoremoveMessageOperations.swift b/submodules/TelegramCore/Sources/ManagedAutoremoveMessageOperations.swift index 08244b9100..97a0385d1d 100644 --- a/submodules/TelegramCore/Sources/ManagedAutoremoveMessageOperations.swift +++ b/submodules/TelegramCore/Sources/ManagedAutoremoveMessageOperations.swift @@ -39,7 +39,7 @@ private final class ManagedAutoremoveMessageOperationsHelper { } } -func managedAutoremoveMessageOperations(network: Network, postbox: Postbox) -> Signal { +func managedAutoremoveMessageOperations(network: Network, postbox: Postbox, isRemove: Bool) -> Signal { return Signal { _ in let helper = Atomic(value: ManagedAutoremoveMessageOperationsHelper()) @@ -61,7 +61,7 @@ func managedAutoremoveMessageOperations(network: Network, postbox: Postbox) -> S } |> distinctUntilChanged - let disposable = combineLatest(timeOffset, postbox.timestampBasedMessageAttributesView(tag: 0)).start(next: { timeOffset, view in + let disposable = combineLatest(timeOffset, postbox.timestampBasedMessageAttributesView(tag: isRemove ? 0 : 1)).start(next: { timeOffset, view in let (disposeOperations, beginOperations) = helper.with { helper -> (disposeOperations: [Disposable], beginOperations: [(TimestampBasedMessageAttributesEntry, MetaDisposable)]) in return helper.update(view.head) } @@ -76,13 +76,7 @@ func managedAutoremoveMessageOperations(network: Network, postbox: Postbox) -> S |> suspendAwareDelay(max(0.0, Double(entry.timestamp) - timestamp), queue: Queue.concurrentDefaultQueue()) |> then(postbox.transaction { transaction -> Void in if let message = transaction.getMessage(entry.messageId) { - for attribute in message.attributes { - if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { - - } - } - - if message.id.peerId.namespace == Namespaces.Peer.SecretChat || true { + if message.id.peerId.namespace == Namespaces.Peer.SecretChat || isRemove { deleteMessages(transaction: transaction, mediaBox: postbox.mediaBox, ids: [entry.messageId]) } else { transaction.updateMessage(message.id, update: { currentMessage in @@ -100,7 +94,7 @@ func managedAutoremoveMessageOperations(network: Network, postbox: Postbox) -> S } var updatedAttributes = currentMessage.attributes for i in 0 ..< updatedAttributes.count { - if let _ = updatedAttributes[i] as? AutoremoveTimeoutMessageAttribute { + if let _ = updatedAttributes[i] as? AutoclearTimeoutMessageAttribute { updatedAttributes.remove(at: i) break } diff --git a/submodules/TelegramCore/Sources/MarkMessageContentAsConsumedInteractively.swift b/submodules/TelegramCore/Sources/MarkMessageContentAsConsumedInteractively.swift index a32520bd69..c302433985 100644 --- a/submodules/TelegramCore/Sources/MarkMessageContentAsConsumedInteractively.swift +++ b/submodules/TelegramCore/Sources/MarkMessageContentAsConsumedInteractively.swift @@ -82,7 +82,37 @@ public func markMessageContentAsConsumedInteractively(postbox: Postbox, messageI } } } - break + } else if let attribute = updatedAttributes[i] as? AutoclearTimeoutMessageAttribute { + if attribute.countdownBeginTime == nil || attribute.countdownBeginTime == 0 { + var timeout = attribute.timeout + if let duration = message.secretMediaDuration { + timeout = max(timeout, duration) + } + updatedAttributes[i] = AutoclearTimeoutMessageAttribute(timeout: timeout, countdownBeginTime: timestamp) + updateMessage = true + + if messageId.peerId.namespace == Namespaces.Peer.SecretChat { + var layer: SecretChatLayer? + let state = transaction.getPeerChatState(message.id.peerId) as? SecretChatState + if let state = state { + switch state.embeddedState { + case .terminated, .handshake: + break + case .basicLayer: + layer = .layer8 + case let .sequenceBasedLayer(sequenceState): + layer = sequenceState.layerNegotiationState.activeLayer.secretChatLayer + } + } + + if let state = state, let layer = layer, let globallyUniqueId = message.globallyUniqueId { + let updatedState = addSecretChatOutgoingOperation(transaction: transaction, peerId: messageId.peerId, operation: .readMessagesContent(layer: layer, actionGloballyUniqueId: arc4random64(), globallyUniqueIds: [globallyUniqueId]), state: state) + if updatedState != state { + transaction.setPeerChatState(messageId.peerId, state: updatedState) + } + } + } + } } } @@ -140,7 +170,22 @@ func markMessageContentAsConsumedRemotely(transaction: Transaction, messageId: M } } } - break + } else if let attribute = updatedAttributes[i] as? AutoclearTimeoutMessageAttribute { + if (attribute.countdownBeginTime == nil || attribute.countdownBeginTime == 0) && message.containsSecretMedia { + updatedAttributes[i] = AutoclearTimeoutMessageAttribute(timeout: attribute.timeout, countdownBeginTime: timestamp) + updateMessage = true + + if message.id.peerId.namespace == Namespaces.Peer.SecretChat { + } else { + for i in 0 ..< updatedMedia.count { + if let _ = updatedMedia[i] as? TelegramMediaImage { + updatedMedia[i] = TelegramMediaExpiredContent(data: .image) + } else if let _ = updatedMedia[i] as? TelegramMediaFile { + updatedMedia[i] = TelegramMediaExpiredContent(data: .file) + } + } + } + } } } diff --git a/submodules/TelegramCore/Sources/MessageUtils.swift b/submodules/TelegramCore/Sources/MessageUtils.swift index e4e2920917..b771a11815 100644 --- a/submodules/TelegramCore/Sources/MessageUtils.swift +++ b/submodules/TelegramCore/Sources/MessageUtils.swift @@ -227,6 +227,9 @@ public extension Message { if let _ = attribute as? AutoremoveTimeoutMessageAttribute { found = true break + } else if let _ = attribute as? AutoclearTimeoutMessageAttribute { + found = true + break } } diff --git a/submodules/TelegramCore/Sources/PendingMessageUploadedContent.swift b/submodules/TelegramCore/Sources/PendingMessageUploadedContent.swift index ee975fd5b5..e4b6fdd510 100644 --- a/submodules/TelegramCore/Sources/PendingMessageUploadedContent.swift +++ b/submodules/TelegramCore/Sources/PendingMessageUploadedContent.swift @@ -58,14 +58,17 @@ func messageContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods func messageContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: AccountAuxiliaryMethods, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, messageMediaPreuploadManager: MessageMediaPreuploadManager, revalidationContext: MediaReferenceRevalidationContext, forceReupload: Bool, isGrouped: Bool, peerId: PeerId, messageId: MessageId?, attributes: [MessageAttribute], text: String, media: [Media]) -> MessageContentToUpload { var contextResult: OutgoingChatContextResultMessageAttribute? - var autoremoveAttribute: AutoremoveTimeoutMessageAttribute? + var autoremoveMessageAttribute: AutoremoveTimeoutMessageAttribute? + var autoclearMessageAttribute: AutoclearTimeoutMessageAttribute? for attribute in attributes { if let attribute = attribute as? OutgoingChatContextResultMessageAttribute { if peerId.namespace != Namespaces.Peer.SecretChat { contextResult = attribute } } else if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { - autoremoveAttribute = attribute + autoremoveMessageAttribute = attribute + } else if let attribute = attribute as? AutoclearTimeoutMessageAttribute { + autoclearMessageAttribute = attribute } } @@ -84,14 +87,14 @@ func messageContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods return .immediate(.content(PendingMessageUploadedContentAndReuploadInfo(content: .forward(forwardInfo), reuploadInfo: nil)), .text) } else if let contextResult = contextResult { return .immediate(.content(PendingMessageUploadedContentAndReuploadInfo(content: .chatContextResult(contextResult), reuploadInfo: nil)), .text) - } else if let media = media.first, let mediaResult = mediaContentToUpload(network: network, postbox: postbox, auxiliaryMethods: auxiliaryMethods, transformOutgoingMessageMedia: transformOutgoingMessageMedia, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: revalidationContext, forceReupload: forceReupload, isGrouped: isGrouped, peerId: peerId, media: media, text: text, autoremoveAttribute: autoremoveAttribute, messageId: messageId, attributes: attributes) { + } else if let media = media.first, let mediaResult = mediaContentToUpload(network: network, postbox: postbox, auxiliaryMethods: auxiliaryMethods, transformOutgoingMessageMedia: transformOutgoingMessageMedia, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: revalidationContext, forceReupload: forceReupload, isGrouped: isGrouped, peerId: peerId, media: media, text: text, autoremoveMessageAttribute: autoremoveMessageAttribute, autoclearMessageAttribute: autoclearMessageAttribute, messageId: messageId, attributes: attributes) { return .signal(mediaResult, .media) } else { return .signal(.single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .text(text), reuploadInfo: nil))), .text) } } -func mediaContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: AccountAuxiliaryMethods, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, messageMediaPreuploadManager: MessageMediaPreuploadManager, revalidationContext: MediaReferenceRevalidationContext, forceReupload: Bool, isGrouped: Bool, peerId: PeerId, media: Media, text: String, autoremoveAttribute: AutoremoveTimeoutMessageAttribute?, messageId: MessageId?, attributes: [MessageAttribute]) -> Signal? { +func mediaContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: AccountAuxiliaryMethods, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, messageMediaPreuploadManager: MessageMediaPreuploadManager, revalidationContext: MediaReferenceRevalidationContext, forceReupload: Bool, isGrouped: Bool, peerId: PeerId, media: Media, text: String, autoremoveMessageAttribute: AutoremoveTimeoutMessageAttribute?, autoclearMessageAttribute: AutoclearTimeoutMessageAttribute?, messageId: MessageId?, attributes: [MessageAttribute]) -> Signal? { if let image = media as? TelegramMediaImage, let largest = largestImageRepresentation(image.representations) { if peerId.namespace == Namespaces.Peer.SecretChat, let resource = largest.resource as? SecretFileMediaResource { return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .secretMedia(.inputEncryptedFile(id: resource.fileId, accessHash: resource.accessHash), resource.decryptedSize, resource.key), reuploadInfo: nil))) @@ -99,7 +102,7 @@ func mediaContentToUpload(network: Network, postbox: Postbox, auxiliaryMethods: if peerId.namespace != Namespaces.Peer.SecretChat, let reference = image.reference, case let .cloud(id, accessHash, maybeFileReference) = reference, let fileReference = maybeFileReference { return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .media(Api.InputMedia.inputMediaPhoto(flags: 0, id: Api.InputPhoto.inputPhoto(id: id, accessHash: accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: nil), text), reuploadInfo: nil))) } else { - return uploadedMediaImageContent(network: network, postbox: postbox, transformOutgoingMessageMedia: transformOutgoingMessageMedia, forceReupload: forceReupload, isGrouped: isGrouped, peerId: peerId, image: image, messageId: messageId, text: text, attributes: attributes, autoremoveAttribute: autoremoveAttribute) + return uploadedMediaImageContent(network: network, postbox: postbox, transformOutgoingMessageMedia: transformOutgoingMessageMedia, forceReupload: forceReupload, isGrouped: isGrouped, peerId: peerId, image: image, messageId: messageId, text: text, attributes: attributes, autoremoveMessageAttribute: autoremoveMessageAttribute, autoclearMessageAttribute: autoclearMessageAttribute) } } else if let file = media as? TelegramMediaFile { if let resource = file.resource as? CloudDocumentMediaResource { @@ -314,7 +317,7 @@ private func maybeCacheUploadedResource(postbox: Postbox, key: CachedSentMediaRe } } -private func uploadedMediaImageContent(network: Network, postbox: Postbox, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, forceReupload: Bool, isGrouped: Bool, peerId: PeerId, image: TelegramMediaImage, messageId: MessageId?, text: String, attributes: [MessageAttribute], autoremoveAttribute: AutoremoveTimeoutMessageAttribute?) -> Signal { +private func uploadedMediaImageContent(network: Network, postbox: Postbox, transformOutgoingMessageMedia: TransformOutgoingMessageMedia?, forceReupload: Bool, isGrouped: Bool, peerId: PeerId, image: TelegramMediaImage, messageId: MessageId?, text: String, attributes: [MessageAttribute], autoremoveMessageAttribute: AutoremoveTimeoutMessageAttribute?, autoclearMessageAttribute: AutoclearTimeoutMessageAttribute?) -> Signal { guard let largestRepresentation = largestImageRepresentation(image.representations) else { return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .text(text), reuploadInfo: nil))) } @@ -328,9 +331,9 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans if !forceReupload, let image = media as? TelegramMediaImage, let reference = image.reference, case let .cloud(id, accessHash, maybeFileReference) = reference, let fileReference = maybeFileReference { var flags: Int32 = 0 var ttlSeconds: Int32? - if let autoremoveAttribute = autoremoveAttribute { + if let autoclearMessageAttribute = autoclearMessageAttribute { flags |= 1 << 0 - ttlSeconds = autoremoveAttribute.timeout + ttlSeconds = autoclearMessageAttribute.timeout } return .single(.progress(1.0)) |> then( @@ -415,9 +418,9 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans case let .inputFile(file): var flags: Int32 = 0 var ttlSeconds: Int32? - if let autoremoveAttribute = autoremoveAttribute { + if let autoclearMessageAttribute = autoclearMessageAttribute { flags |= 1 << 1 - ttlSeconds = autoremoveAttribute.timeout + ttlSeconds = autoclearMessageAttribute.timeout } var stickers: [Api.InputDocument]? for attribute in attributes { @@ -441,7 +444,7 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans |> mapError { _ -> PendingMessageUploadError in return .generic } |> mapToSignal { inputPeer -> Signal in if let inputPeer = inputPeer { - if autoremoveAttribute != nil { + if autoclearMessageAttribute != nil { return .single(.content(PendingMessageUploadedContentAndReuploadInfo(content: .media(.inputMediaUploadedPhoto(flags: flags, file: file, stickers: stickers, ttlSeconds: ttlSeconds), text), reuploadInfo: nil))) } @@ -453,9 +456,9 @@ private func uploadedMediaImageContent(network: Network, postbox: Postbox, trans if let photo = photo, let mediaImage = telegramMediaImageFromApiPhoto(photo), let reference = mediaImage.reference, case let .cloud(id, accessHash, maybeFileReference) = reference, let fileReference = maybeFileReference { var flags: Int32 = 0 var ttlSeconds: Int32? - if let autoremoveAttribute = autoremoveAttribute { + if let autoclearMessageAttribute = autoclearMessageAttribute { flags |= 1 << 0 - ttlSeconds = autoremoveAttribute.timeout + ttlSeconds = autoclearMessageAttribute.timeout } return maybeCacheUploadedResource(postbox: postbox, key: referenceKey, result: .content(PendingMessageUploadedContentAndReuploadInfo(content: .media(.inputMediaPhoto(flags: flags, id: .inputPhoto(id: id, accessHash: accessHash, fileReference: Buffer(data: fileReference)), ttlSeconds: ttlSeconds), text), reuploadInfo: nil)), media: mediaImage) } @@ -730,7 +733,7 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili var ttlSeconds: Int32? for attribute in attributes { - if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { + if let attribute = attribute as? AutoclearTimeoutMessageAttribute { flags |= 1 << 1 ttlSeconds = attribute.timeout } diff --git a/submodules/TelegramCore/Sources/RequestEditMessage.swift b/submodules/TelegramCore/Sources/RequestEditMessage.swift index 63fc627754..69ffc23c06 100644 --- a/submodules/TelegramCore/Sources/RequestEditMessage.swift +++ b/submodules/TelegramCore/Sources/RequestEditMessage.swift @@ -60,7 +60,7 @@ private func requestEditMessageInternal(postbox: Postbox, network: Network, stat case let .update(media): let generateUploadSignal: (Bool) -> Signal? = { forceReupload in let augmentedMedia = augmentMediaWithReference(media) - return mediaContentToUpload(network: network, postbox: postbox, auxiliaryMethods: stateManager.auxiliaryMethods, transformOutgoingMessageMedia: transformOutgoingMessageMedia, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: mediaReferenceRevalidationContext, forceReupload: forceReupload, isGrouped: false, peerId: messageId.peerId, media: augmentedMedia, text: "", autoremoveAttribute: nil, messageId: nil, attributes: []) + return mediaContentToUpload(network: network, postbox: postbox, auxiliaryMethods: stateManager.auxiliaryMethods, transformOutgoingMessageMedia: transformOutgoingMessageMedia, messageMediaPreuploadManager: messageMediaPreuploadManager, revalidationContext: mediaReferenceRevalidationContext, forceReupload: forceReupload, isGrouped: false, peerId: messageId.peerId, media: augmentedMedia, text: "", autoremoveMessageAttribute: nil, autoclearMessageAttribute: nil, messageId: nil, attributes: []) } if let uploadSignal = generateUploadSignal(forceReupload) { uploadedMedia = .single(.progress(0.027)) diff --git a/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift b/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift index 1ce692f6bf..d2a46d869b 100644 --- a/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift @@ -8,7 +8,11 @@ public func tagsForStoreMessage(incoming: Bool, attributes: [MessageAttribute], var isSecret = false var isUnconsumedPersonalMention = false for attribute in attributes { - if let timerAttribute = attribute as? AutoremoveTimeoutMessageAttribute { + if let timerAttribute = attribute as? AutoclearTimeoutMessageAttribute { + if timerAttribute.timeout > 0 && timerAttribute.timeout <= 60 { + isSecret = true + } + } else if let timerAttribute = attribute as? AutoremoveTimeoutMessageAttribute { if timerAttribute.timeout > 0 && timerAttribute.timeout <= 60 { isSecret = true } @@ -468,27 +472,21 @@ extension StoreMessage { var consumableContent: (Bool, Bool)? = nil - var resolvedTtlPeriod: Int32? = ttlPeriod - if let media = media { let (mediaValue, expirationTimer) = textMediaAndExpirationTimerFromApiMedia(media, peerId) if let mediaValue = mediaValue { medias.append(mediaValue) if let expirationTimer = expirationTimer, expirationTimer > 0 { - if let resolvedTtlPeriodValue = resolvedTtlPeriod { - resolvedTtlPeriod = min(resolvedTtlPeriodValue, expirationTimer) - } else { - resolvedTtlPeriod = expirationTimer - } + attributes.append(AutoclearTimeoutMessageAttribute(timeout: expirationTimer, countdownBeginTime: nil)) consumableContent = (true, false) } } } - if let resolvedTtlPeriod = resolvedTtlPeriod { - attributes.append(AutoremoveTimeoutMessageAttribute(timeout: resolvedTtlPeriod, countdownBeginTime: ttlPeriod == nil ? nil : date)) + if let ttlPeriod = ttlPeriod { + attributes.append(AutoremoveTimeoutMessageAttribute(timeout: ttlPeriod, countdownBeginTime: date)) } if let postAuthor = postAuthor { diff --git a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift index e1935b1df2..58b20eda9e 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift @@ -209,6 +209,8 @@ func messageMediaEditingOptions(message: Message) -> MessageMediaEditingOptions for attribute in message.attributes { if attribute is AutoremoveTimeoutMessageAttribute { return [] + } else if attribute is AutoclearTimeoutMessageAttribute { + return [] } } @@ -809,6 +811,9 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState if let _ = attribute as? AutoremoveTimeoutMessageAttribute { hasAutoremove = true break + } else if let _ = attribute as? AutoclearTimeoutMessageAttribute { + hasAutoremove = true + break } } diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift index 8b13669894..18122478dd 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift @@ -494,12 +494,13 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { let isSecretMedia = item.message.containsSecretMedia var secretBeginTimeAndTimeout: (Double, Double)? if isSecretMedia { - for attribute in item.message.attributes { - if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { - if let countdownBeginTime = attribute.countdownBeginTime { - secretBeginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) - } - break + if let attribute = item.message.autoclearAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + secretBeginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) + } + } else if let attribute = item.message.autoremoveAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + secretBeginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) } } } diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift index 33c962561a..845d91e9e9 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveMediaNode.swift @@ -261,12 +261,13 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio let isSecretMedia = message.containsSecretMedia var secretBeginTimeAndTimeout: (Double, Double)? if isSecretMedia { - for attribute in message.attributes { - if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { - if let countdownBeginTime = attribute.countdownBeginTime { - secretBeginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) - } - break + if let attribute = message.autoclearAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + secretBeginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) + } + } else if let attribute = message.autoremoveAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + secretBeginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) } } } @@ -934,14 +935,13 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio var secretBeginTimeAndTimeout: (Double?, Double)? let isSecretMedia = message.containsSecretMedia if isSecretMedia { - for attribute in message.attributes { - if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { - if let countdownBeginTime = attribute.countdownBeginTime { - secretBeginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) - } else { - secretBeginTimeAndTimeout = (nil, Double(attribute.timeout)) - } - break + if let attribute = message.autoclearAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + secretBeginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) + } + } else if let attribute = message.autoremoveAttribute { + if let countdownBeginTime = attribute.countdownBeginTime { + secretBeginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout)) } } } diff --git a/submodules/TgVoipWebrtc/tgcalls b/submodules/TgVoipWebrtc/tgcalls index e1e94e4e50..17d7e77771 160000 --- a/submodules/TgVoipWebrtc/tgcalls +++ b/submodules/TgVoipWebrtc/tgcalls @@ -1 +1 @@ -Subproject commit e1e94e4e500e14251cf6a803af54e53cb7945dba +Subproject commit 17d7e77771ba00e128b2755b6eac486190a5194d