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) { self.timeout = timeout self.countdownBeginTime = countdownBeginTime if let countdownBeginTime = countdownBeginTime { self.automaticTimestampBasedAttribute = (0, countdownBeginTime + timeout) } else { self.automaticTimestampBasedAttribute = nil } self.action = action } required public init(decoder: PostboxDecoder) { self.timeout = decoder.decodeInt32ForKey("t", orElse: 0) self.countdownBeginTime = decoder.decodeOptionalInt32ForKey("c") if let countdownBeginTime = self.countdownBeginTime { self.automaticTimestampBasedAttribute = (0, countdownBeginTime + self.timeout) } else { self.automaticTimestampBasedAttribute = nil } self.action = Action(rawValue: decoder.decodeInt32ForKey("a", orElse: 0)) ?? .remove } 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") } encoder.encodeInt32(self.action.rawValue, forKey: "a") } } public extension Message { var containsSecretMedia: Bool { var found = false for attribute in self.attributes { if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { if attribute.timeout > 1 * 60 { return false } found = true break } } if !found { return false } for media in self.media { switch media { case _ as TelegramMediaImage: return true case let file as TelegramMediaFile: if file.isVideo || file.isAnimated || file.isVoice || file.isMusic { return true } default: break } } return false } var isSelfExpiring: Bool { for attribute in self.attributes { if let _ = attribute as? AutoremoveTimeoutMessageAttribute { return true } } return false } }