session-ios/SessionMessagingKit/Messages/Message.swift

87 lines
3 KiB
Swift
Raw Normal View History

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
import GRDB
2020-11-05 04:16:45 +01:00
/// Abstract base class for `VisibleMessage` and `ControlMessage`.
public class Message: Codable {
2020-11-05 04:16:45 +01:00
public var id: String?
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 }
// 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
}
// MARK: - Initialization
public init(
id: String? = nil,
threadId: String? = nil,
sentTimestamp: UInt64? = nil,
receivedTimestamp: UInt64? = nil,
recipient: String? = nil,
sender: String? = nil,
groupPublicKey: String? = nil,
openGroupServerMessageId: UInt64? = nil,
openGroupServerTimestamp: UInt64? = nil,
serverHash: String? = nil
) {
self.id = id
self.threadId = threadId
self.sentTimestamp = sentTimestamp
self.receivedTimestamp = receivedTimestamp
self.recipient = recipient
self.sender = sender
self.groupPublicKey = groupPublicKey
self.openGroupServerMessageId = openGroupServerMessageId
self.openGroupServerTimestamp = openGroupServerTimestamp
self.serverHash = 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, sender: String) -> Self? {
preconditionFailure("fromProto(_:sender:) is abstract and must be overridden.")
2020-11-05 06:10:49 +01:00
}
public func toProto(_ db: Database) -> SNProtoContent? {
preconditionFailure("toProto(_:) is abstract and must be overridden.")
2020-12-08 03:17:02 +01:00
}
public func setGroupContextIfNeeded(_ db: Database, on dataMessage: SNProtoDataMessage.SNProtoDataMessageBuilder) throws {
guard
let threadId: String = threadId,
(try? ClosedGroup.exists(db, id: threadId)) == true,
let legacyGroupId: Data = "\(SMKLegacy.closedGroupIdPrefix)\(threadId)".data(using: .utf8)
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: legacyGroupId, type: .deliver)
2020-12-08 03:17:02 +01:00
dataMessage.setGroup(try groupProto.build())
2020-11-05 06:10:49 +01:00
}
2020-11-05 04:16:45 +01:00
}
// MARK: - Mutation
internal extension Message {
func with(sentTimestamp: UInt64) -> Message {
self.sentTimestamp = sentTimestamp
return self
}
}