diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index f39136b4a..3ea4b46f0 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -10,6 +10,7 @@ public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is public var sender: String? public var groupPublicKey: String? public var openGroupServerMessageID: UInt64? + public var openGroupServerTimestamp: UInt64? public var ttl: UInt64 { 2 * 24 * 60 * 60 * 1000 } public var isSelfSendValid: Bool { false } @@ -30,6 +31,10 @@ public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is if let sentTimestamp = coder.decodeObject(forKey: "sentTimestamp") as! UInt64? { self.sentTimestamp = sentTimestamp } if let receivedTimestamp = coder.decodeObject(forKey: "receivedTimestamp") as! UInt64? { self.receivedTimestamp = receivedTimestamp } if let recipient = coder.decodeObject(forKey: "recipient") as! String? { self.recipient = recipient } + 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 } } public func encode(with coder: NSCoder) { @@ -38,6 +43,10 @@ public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is coder.encode(sentTimestamp, forKey: "sentTimestamp") coder.encode(receivedTimestamp, forKey: "receivedTimestamp") coder.encode(recipient, forKey: "recipient") + coder.encode(sender, forKey: "sender") + coder.encode(groupPublicKey, forKey: "groupPublicKey") + coder.encode(openGroupServerMessageID, forKey: "openGroupServerMessageID") + coder.encode(openGroupServerTimestamp, forKey: "openGroupServerTimestamp") } // MARK: Proto Conversion diff --git a/SessionMessagingKit/Messages/Signal/TSIncomingMessage+Conversion.swift b/SessionMessagingKit/Messages/Signal/TSIncomingMessage+Conversion.swift index 48027531e..32916187e 100644 --- a/SessionMessagingKit/Messages/Signal/TSIncomingMessage+Conversion.swift +++ b/SessionMessagingKit/Messages/Signal/TSIncomingMessage+Conversion.swift @@ -19,7 +19,7 @@ public extension TSIncomingMessage { expiresInSeconds: !isOpenGroupMessage ? expiration : 0, // Ensure we don't ever expire open group messages quotedMessage: quotedMessage, linkPreview: linkPreview, - serverTimestamp: nil, + serverTimestamp: visibleMessage.openGroupServerTimestamp as NSNumber?, wasReceivedByUD: true ) result.openGroupServerMessageID = openGroupServerMessageID diff --git a/SessionMessagingKit/Messages/Signal/TSInteraction.h b/SessionMessagingKit/Messages/Signal/TSInteraction.h index d21b25555..1d67d12c0 100644 --- a/SessionMessagingKit/Messages/Signal/TSInteraction.h +++ b/SessionMessagingKit/Messages/Signal/TSInteraction.h @@ -41,8 +41,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value); @property (nonatomic, readonly) uint64_t receivedAtTimestamp; @property (nonatomic, readonly) BOOL shouldUseServerTime; -- (void)setServerTimestampToReceivedTimestamp:(uint64_t)receivedAtTimestamp; - - (uint64_t)timestampForUI; - (NSDate *)receivedAtDate; diff --git a/SessionMessagingKit/Messages/Signal/TSInteraction.m b/SessionMessagingKit/Messages/Signal/TSInteraction.m index 2c21a3997..d71496f1b 100644 --- a/SessionMessagingKit/Messages/Signal/TSInteraction.m +++ b/SessionMessagingKit/Messages/Signal/TSInteraction.m @@ -169,8 +169,8 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) - (uint64_t)timestampForUI { - if (_shouldUseServerTime) { - return _receivedAtTimestamp; + if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *) self).isOpenGroupMessage) { + return ((TSIncomingMessage *) self).serverTimestamp.unsignedLongLongValue; } return _timestamp; } @@ -180,14 +180,11 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) return self.timestamp; } -- (void)setServerTimestampToReceivedTimestamp:(uint64_t)receivedAtTimestamp -{ - _shouldUseServerTime = YES; - _receivedAtTimestamp = receivedAtTimestamp; -} - - (NSDate *)receivedAtDate { + if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *) self).isOpenGroupMessage) { + return [NSDate ows_dateWithMillisecondsSince1970:((TSIncomingMessage *) self).serverTimestamp.unsignedLongLongValue]; + } return [NSDate ows_dateWithMillisecondsSince1970:self.receivedAtTimestamp]; } @@ -199,13 +196,10 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) // In open groups messages should be sorted by server timestamp. `sortId` represents the order in which messages // were processed. Since in the open group poller we sort messages by their server timestamp, sorting by `sortId` is // effectively the same as sorting by server timestamp. - if ([self isKindOfClass:TSMessage.class] && ((TSMessage *)self).isOpenGroupMessage) { - sortId1 = self.sortId; - sortId2 = other.sortId; - } else { - sortId1 = self.timestamp; - sortId2 = other.timestamp; - } + // sortId == serverTimestamp for open group messages. + // sortId == timestamp (the sent timestamp) for one-to-one and closed group messages. + sortId1 = self.sortId; + sortId2 = other.sortId; if (sortId1 > sortId2) { return NSOrderedDescending; @@ -229,6 +223,14 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) (unsigned long)self.timestamp]; } +- (uint64_t)sortId +{ + if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *) self).isOpenGroupMessage) { + return ((TSIncomingMessage *) self).serverTimestamp.unsignedLongLongValue; + } + return self.timestamp; +} + - (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { if (!self.uniqueId) { diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift index 20daff6db..3547681f3 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -146,6 +146,9 @@ public enum MessageReceiver { message.recipient = userPublicKey message.sentTimestamp = envelope.timestamp message.receivedTimestamp = NSDate.millisecondTimestamp() + if isOpenGroupMessage { + message.openGroupServerTimestamp = envelope.serverTimestamp + } message.groupPublicKey = groupPublicKey message.openGroupServerMessageID = openGroupMessageServerID // Validate