|  |  |  | import SessionUtilitiesKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @objc(SNExpirationTimerUpdate) | 
					
						
							|  |  |  | public final class ExpirationTimerUpdate : ControlMessage { | 
					
						
							|  |  |  |     public var duration: UInt32? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Initialization | 
					
						
							|  |  |  |     public override init() { super.init() } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     internal init(duration: UInt32) { | 
					
						
							|  |  |  |         super.init() | 
					
						
							|  |  |  |         self.duration = duration | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Validation | 
					
						
							|  |  |  |     public override var isValid: Bool { | 
					
						
							|  |  |  |         guard super.isValid else { return false } | 
					
						
							|  |  |  |         return duration != nil | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Coding | 
					
						
							|  |  |  |     public required init?(coder: NSCoder) { | 
					
						
							|  |  |  |         super.init(coder: coder) | 
					
						
							|  |  |  |         if let duration = coder.decodeObject(forKey: "durationSeconds") as! UInt32? { self.duration = duration } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public override func encode(with coder: NSCoder) { | 
					
						
							|  |  |  |         super.encode(with: coder) | 
					
						
							|  |  |  |         coder.encode(duration, forKey: "durationSeconds") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Proto Conversion | 
					
						
							|  |  |  |     public override class func fromProto(_ proto: SNProtoContent) -> ExpirationTimerUpdate? { | 
					
						
							|  |  |  |         guard let dataMessageProto = proto.dataMessage else { return nil } | 
					
						
							|  |  |  |         let isExpirationTimerUpdate = (dataMessageProto.flags & UInt32(SNProtoDataMessage.SNProtoDataMessageFlags.expirationTimerUpdate.rawValue)) != 0 | 
					
						
							|  |  |  |         guard isExpirationTimerUpdate else { return nil } | 
					
						
							|  |  |  |         let duration = dataMessageProto.expireTimer | 
					
						
							|  |  |  |         return ExpirationTimerUpdate(duration: duration) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public override func toProto(using transaction: YapDatabaseReadWriteTransaction) -> SNProtoContent? { | 
					
						
							|  |  |  |         guard let duration = duration else { | 
					
						
							|  |  |  |             SNLog("Couldn't construct expiration timer update proto from: \(self).") | 
					
						
							|  |  |  |             return nil | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         let dataMessageProto = SNProtoDataMessage.builder() | 
					
						
							|  |  |  |         dataMessageProto.setFlags(UInt32(SNProtoDataMessage.SNProtoDataMessageFlags.expirationTimerUpdate.rawValue)) | 
					
						
							|  |  |  |         dataMessageProto.setExpireTimer(duration) | 
					
						
							|  |  |  |         // Group context | 
					
						
							|  |  |  |         do { | 
					
						
							|  |  |  |             try setGroupContextIfNeeded(on: dataMessageProto, using: transaction) | 
					
						
							|  |  |  |         } catch { | 
					
						
							|  |  |  |             SNLog("Couldn't construct expiration timer update proto from: \(self).") | 
					
						
							|  |  |  |             return nil | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         let contentProto = SNProtoContent.builder() | 
					
						
							|  |  |  |         do { | 
					
						
							|  |  |  |             contentProto.setDataMessage(try dataMessageProto.build()) | 
					
						
							|  |  |  |             return try contentProto.build() | 
					
						
							|  |  |  |         } catch { | 
					
						
							|  |  |  |             SNLog("Couldn't construct expiration timer update proto from: \(self).") | 
					
						
							|  |  |  |             return nil | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: Description | 
					
						
							|  |  |  |     public override var description: String { | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         ExpirationTimerUpdate( | 
					
						
							|  |  |  |             duration: \(duration?.description ?? "null") | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: Convenience | 
					
						
							|  |  |  |     @objc public func setDuration(_ duration: UInt32) { | 
					
						
							|  |  |  |         self.duration = duration | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |