session-ios/SessionMessagingKit/Messages/Message.swift

78 lines
4.0 KiB
Swift
Raw Normal View History

2020-11-05 04:16:45 +01:00
/// Abstract base class for `VisibleMessage` and `ControlMessage`.
@objc(SNMessage)
public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility
2020-11-05 04:16:45 +01:00
public var id: String?
2020-11-26 03:23:35 +01:00
@objc public var threadID: String?
2020-11-05 04:16:45 +01:00
public var sentTimestamp: UInt64?
public var receivedTimestamp: UInt64?
2020-11-06 01:41:01 +01:00
public var recipient: String?
2020-11-17 06:23:13 +01:00
public var sender: String?
2020-11-18 05:53:45 +01:00
public var groupPublicKey: String?
public var openGroupServerMessageID: UInt64?
public var openGroupServerTimestamp: UInt64?
2021-08-02 06:49:34 +02:00
public var serverHash: String?
2020-11-05 04:16:45 +01:00
2021-04-14 06:05:26 +02:00
public var ttl: UInt64 { 14 * 24 * 60 * 60 * 1000 }
2021-01-14 00:40:58 +01:00
public var isSelfSendValid: Bool { false }
public var shouldBeRetryable: Bool { false }
2020-11-05 06:10:49 +01:00
public override init() { }
2020-11-06 06:28:06 +01:00
// MARK: Validation
2020-11-17 06:23:13 +01:00
public var isValid: Bool {
if let sentTimestamp = sentTimestamp { guard sentTimestamp > 0 else { return false } }
if let receivedTimestamp = receivedTimestamp { guard receivedTimestamp > 0 else { return false } }
return sender != nil && recipient != nil
}
2020-11-06 06:28:06 +01:00
// MARK: Coding
2020-11-05 04:16:45 +01:00
public required init?(coder: NSCoder) {
2020-11-06 00:59:04 +01:00
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 }
2020-11-06 01:41:01 +01:00
if let recipient = coder.decodeObject(forKey: "recipient") as! String? { self.recipient = recipient }
2021-04-15 02:09:05 +02:00
if let sender = coder.decodeObject(forKey: "sender") as! String? { self.sender = sender }
if let groupPublicKey = coder.decodeObject(forKey: "groupPublicKey") as! String? { self.groupPublicKey = groupPublicKey }
if let openGroupServerMessageID = coder.decodeObject(forKey: "openGroupServerMessageID") as! UInt64? { self.openGroupServerMessageID = openGroupServerMessageID }
if let openGroupServerTimestamp = coder.decodeObject(forKey: "openGroupServerTimestamp") as! UInt64? { self.openGroupServerTimestamp = openGroupServerTimestamp }
2021-08-02 06:49:34 +02:00
if let serverHash = coder.decodeObject(forKey: "serverHash") as! String? { self.serverHash = serverHash }
2020-11-05 04:16:45 +01:00
}
public func encode(with coder: NSCoder) {
coder.encode(id, forKey: "id")
coder.encode(threadID, forKey: "threadID")
coder.encode(sentTimestamp, forKey: "sentTimestamp")
coder.encode(receivedTimestamp, forKey: "receivedTimestamp")
2020-11-06 01:41:01 +01:00
coder.encode(recipient, forKey: "recipient")
2021-04-15 02:09:05 +02:00
coder.encode(sender, forKey: "sender")
coder.encode(groupPublicKey, forKey: "groupPublicKey")
coder.encode(openGroupServerMessageID, forKey: "openGroupServerMessageID")
coder.encode(openGroupServerTimestamp, forKey: "openGroupServerTimestamp")
2021-08-02 06:49:34 +02:00
coder.encode(serverHash, forKey: "serverHash")
2020-11-05 04:16:45 +01:00
}
2020-11-05 06:10:49 +01:00
// MARK: Proto Conversion
public class func fromProto(_ proto: SNProtoContent) -> Self? {
preconditionFailure("fromProto(_:) is abstract and must be overridden.")
2020-11-05 06:10:49 +01:00
}
2020-12-08 03:17:02 +01:00
public func toProto(using transaction: YapDatabaseReadWriteTransaction) -> SNProtoContent? {
preconditionFailure("toProto(using:) is abstract and must be overridden.")
}
public func setGroupContextIfNeeded(on dataMessage: SNProtoDataMessage.SNProtoDataMessageBuilder, using transaction: YapDatabaseReadTransaction) throws {
2021-01-11 04:12:07 +01:00
guard let thread = TSThread.fetch(uniqueId: threadID!, transaction: transaction) as? TSGroupThread, thread.isClosedGroup else { return }
2020-12-08 03:17:02 +01:00
// Android needs a group context or it'll interpret the message as a one-to-one message
let groupProto = SNProtoGroupContext.builder(id: thread.groupModel.groupId, type: .deliver)
dataMessage.setGroup(try groupProto.build())
2020-11-05 06:10:49 +01:00
}
2020-11-19 06:21:00 +01:00
// MARK: General
@objc public func setSentTimestamp(_ sentTimestamp: UInt64) {
self.sentTimestamp = sentTimestamp
}
2020-11-05 04:16:45 +01:00
}