From d4074672796d7fff530fefc4a8973d7dc2b4e41b Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Fri, 6 Nov 2020 10:59:04 +1100 Subject: [PATCH] Implement expiration timer update --- .../ExpirationTimerUpdate.swift | 46 +++++++++++++++++++ .../Control Message/TypingIndicator.swift | 9 +--- SessionMessagingKit/Messages/Message.swift | 5 +- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift b/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift index b4b8c26f4..e9f94c32b 100644 --- a/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift +++ b/SessionMessagingKit/Messages/Control Message/ExpirationTimerUpdate.swift @@ -1,5 +1,51 @@ +import SessionUtilities @objc(SNExpirationTimerUpdate) public final class ExpirationTimerUpdate : ControlMessage { + public var duration: UInt32? + // MARK: Initialization + init(sentTimestamp: UInt64, receivedTimestamp: UInt64, duration: UInt32) { + super.init() + self.sentTimestamp = sentTimestamp + self.receivedTimestamp = receivedTimestamp + self.duration = duration + } + + // MARK: Coding + public required init?(coder: NSCoder) { + super.init(coder: coder) + if let duration = coder.decodeObject(forKey: "duration") as! UInt32? { self.duration = duration } + } + + public override func encode(with coder: NSCoder) { + super.encode(with: coder) + coder.encode(duration, forKey: "duration") + } + + // MARK: Proto Conversion + public override class func fromProto(_ proto: SNProtoContent) -> ExpirationTimerUpdate? { + guard let data = proto.dataMessage else { return nil } + let isExpirationTimerUpdate = (data.flags & UInt32(SNProtoDataMessage.SNProtoDataMessageFlags.expirationTimerUpdate.rawValue)) != 0 + guard isExpirationTimerUpdate else { return nil } + let timestamp = data.timestamp + let now = NSDate.millisecondTimestamp() + let duration = data.expireTimer + return ExpirationTimerUpdate(sentTimestamp: timestamp, receivedTimestamp: now, duration: duration) + } + + public override func toProto() -> SNProtoContent? { + guard let duration = duration else { return nil } + let expirationTimerUpdateProto = SNProtoDataMessage.builder() + expirationTimerUpdateProto.setFlags(UInt32(SNProtoDataMessage.SNProtoDataMessageFlags.expirationTimerUpdate.rawValue)) + expirationTimerUpdateProto.setExpireTimer(duration) + let contentProto = SNProtoContent.builder() + do { + contentProto.setDataMessage(try expirationTimerUpdateProto.build()) + return try contentProto.build() + } catch { + SNLog("Couldn't construct expiration timer update proto from: \(self).") + return nil + } + } } diff --git a/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift b/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift index fe0186317..7bb5c5c50 100644 --- a/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift +++ b/SessionMessagingKit/Messages/Control Message/TypingIndicator.swift @@ -34,9 +34,7 @@ public final class TypingIndicator : ControlMessage { // MARK: Coding public required init?(coder: NSCoder) { super.init(coder: coder) - if let rawKind = coder.decodeObject(forKey: "kind") as! String? { - kind = Kind(rawValue: rawKind) - } + if let rawKind = coder.decodeObject(forKey: "kind") as! String? { kind = Kind(rawValue: rawKind) } } public override func encode(with coder: NSCoder) { @@ -46,10 +44,7 @@ public final class TypingIndicator : ControlMessage { // MARK: Proto Conversion public override class func fromProto(_ proto: SNProtoContent) -> TypingIndicator? { - guard let typingIndicatorProto = proto.typingMessage else { - SNLog("Couldn't parse typing indicator from: \(proto).") - return nil - } + guard let typingIndicatorProto = proto.typingMessage else { return nil } let timestamp = typingIndicatorProto.timestamp let now = NSDate.millisecondTimestamp() let kind = Kind.fromProto(typingIndicatorProto.action) diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index 23c5e8903..9a38ecf14 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -11,7 +11,10 @@ public class Message : NSObject, NSCoding { // Not a protocol for YapDatabase co // MARK: Coding public required init?(coder: NSCoder) { - preconditionFailure("init?(coder:) is abstract and must be overridden.") + if let id = coder.decodeObject(forKey: "id") as! String? { self.id = id } + if let threadID = coder.decodeObject(forKey: "threadID") as! String? { self.threadID = threadID } + if let sentTimestamp = coder.decodeObject(forKey: "sentTimestamp") as! UInt64? { self.sentTimestamp = sentTimestamp } + if let receivedTimestamp = coder.decodeObject(forKey: "receivedTimestamp") as! UInt64? { self.receivedTimestamp = receivedTimestamp } } public func encode(with coder: NSCoder) {