import Foundation #if os(macOS) import PostboxMac import SwiftSignalKitMac #else import Postbox import SwiftSignalKit #endif public func applyMaxReadIndexInteractively(postbox: Postbox, network: Network, index: MessageIndex) -> Signal { return postbox.modify { modifier -> Void in let messageIds = modifier.applyInteractiveReadMaxIndex(index) if index.id.peerId.namespace == Namespaces.Peer.SecretChat { let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970) for id in messageIds { if let message = modifier.getMessage(id) { for attribute in message.attributes { if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { if attribute.countdownBeginTime == nil && !message.containsSecretMedia { modifier.updateMessage(message.id, update: { currentMessage in var storeForwardInfo: StoreMessageForwardInfo? if let forwardInfo = currentMessage.forwardInfo { storeForwardInfo = StoreMessageForwardInfo(authorId: forwardInfo.author.id, sourceId: forwardInfo.source?.id, sourceMessageId: forwardInfo.sourceMessageId, date: forwardInfo.date) } let updatedAttributes = currentMessage.attributes.map({ currentAttribute -> MessageAttribute in if let currentAttribute = currentAttribute as? AutoremoveTimeoutMessageAttribute { return AutoremoveTimeoutMessageAttribute(timeout: currentAttribute.timeout, countdownBeginTime: timestamp) } else { return currentAttribute } }) return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: updatedAttributes, media: currentMessage.media)) }) modifier.addTimestampBasedMessageAttribute(tag: 0, timestamp: timestamp + attribute.timeout, messageId: id) } break } } } } } } } func applyOutgoingReadMaxIndex(modifier: Modifier, index: MessageIndex, beginAt timestamp: Int32) { let messageIds = modifier.applyOutgoingReadMaxIndex(index) if index.id.peerId.namespace == Namespaces.Peer.SecretChat { for id in messageIds { if let message = modifier.getMessage(id), !message.flags.contains(.Incoming) { for attribute in message.attributes { if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { if attribute.countdownBeginTime == nil && !message.containsSecretMedia { modifier.updateMessage(message.id, update: { currentMessage in var storeForwardInfo: StoreMessageForwardInfo? if let forwardInfo = currentMessage.forwardInfo { storeForwardInfo = StoreMessageForwardInfo(authorId: forwardInfo.author.id, sourceId: forwardInfo.source?.id, sourceMessageId: forwardInfo.sourceMessageId, date: forwardInfo.date) } let updatedAttributes = currentMessage.attributes.map({ currentAttribute -> MessageAttribute in if let currentAttribute = currentAttribute as? AutoremoveTimeoutMessageAttribute { return AutoremoveTimeoutMessageAttribute(timeout: currentAttribute.timeout, countdownBeginTime: timestamp) } else { return currentAttribute } }) return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: updatedAttributes, media: currentMessage.media)) }) modifier.addTimestampBasedMessageAttribute(tag: 0, timestamp: timestamp + attribute.timeout, messageId: id) } break } } } } } }