From fcc3c27779f3e99be4e9531c4c42b76093da3547 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Mon, 12 Apr 2021 16:56:53 +1000 Subject: [PATCH 1/4] fix unread message count bug --- .../Database/Storage+Messaging.swift | 3 +++ .../Messages/Signal/TSInteraction.m | 19 ++++++++++++------- .../Sending & Receiving/MessageReceiver.swift | 6 +++++- .../Read Tracking/OWSReadReceiptManager.m | 1 + 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/SessionMessagingKit/Database/Storage+Messaging.swift b/SessionMessagingKit/Database/Storage+Messaging.swift index ca4149fa0..852503f2d 100644 --- a/SessionMessagingKit/Database/Storage+Messaging.swift +++ b/SessionMessagingKit/Database/Storage+Messaging.swift @@ -42,6 +42,9 @@ extension Storage { } else { tsMessage = TSIncomingMessage.from(message, quotedMessage: quotedMessage, linkPreview: linkPreview, associatedWith: thread) } + if let serverTimestamp = message.receivedTimestamp, openGroupID != nil { + tsMessage.setServerTimestampToReceivedTimestamp(serverTimestamp) + } tsMessage.save(with: transaction) tsMessage.attachments(with: transaction).forEach { attachment in attachment.albumMessageId = tsMessage.uniqueId! diff --git a/SessionMessagingKit/Messages/Signal/TSInteraction.m b/SessionMessagingKit/Messages/Signal/TSInteraction.m index 2c21a3997..e7cc710cf 100644 --- a/SessionMessagingKit/Messages/Signal/TSInteraction.m +++ b/SessionMessagingKit/Messages/Signal/TSInteraction.m @@ -199,13 +199,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 == receivedAtTimestamp for open group messages. + // sortId == sendTimestamp for one-to-one and closed group messages. + sortId1 = self.sortId; + sortId2 = other.sortId; if (sortId1 > sortId2) { return NSOrderedDescending; @@ -229,6 +226,14 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) (unsigned long)self.timestamp]; } +- (uint64_t)sortId +{ + if ([self isKindOfClass:TSMessage.class] && ((TSMessage *)self).isOpenGroupMessage) { + return self.receivedAtTimestamp; + } + 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..63a73a80f 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -145,7 +145,11 @@ public enum MessageReceiver { message.sender = sender message.recipient = userPublicKey message.sentTimestamp = envelope.timestamp - message.receivedTimestamp = NSDate.millisecondTimestamp() + if (isOpenGroupMessage) { + message.receivedTimestamp = envelope.serverTimestamp + } else { + message.receivedTimestamp = NSDate.millisecondTimestamp() + } message.groupPublicKey = groupPublicKey message.openGroupServerMessageID = openGroupMessageServerID // Validate diff --git a/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m index 13a1b39c2..3a98e6fc3 100644 --- a/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m +++ b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m @@ -267,6 +267,7 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE } id possiblyRead = (id)object; if (possiblyRead.sortId > sortId) { + uint64_t test = possiblyRead.sortId; *stop = YES; return; } From b501579917112a8c75bb3f5f227b0f264bc2b5f2 Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Wed, 14 Apr 2021 09:09:42 +1000 Subject: [PATCH 2/4] clean --- .../Sending & Receiving/Read Tracking/OWSReadReceiptManager.m | 1 - 1 file changed, 1 deletion(-) diff --git a/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m index 3a98e6fc3..13a1b39c2 100644 --- a/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m +++ b/SessionMessagingKit/Sending & Receiving/Read Tracking/OWSReadReceiptManager.m @@ -267,7 +267,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE } id possiblyRead = (id)object; if (possiblyRead.sortId > sortId) { - uint64_t test = possiblyRead.sortId; *stop = YES; return; } From 1893ccac76164a1e808005d36fc6bcf62936c505 Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Wed, 14 Apr 2021 11:39:04 +1000 Subject: [PATCH 3/4] use TSIncomingMessage's serverTimastamp to make more sense --- .../Database/Storage+Messaging.swift | 3 --- SessionMessagingKit/Messages/Message.swift | 1 + .../Signal/TSIncomingMessage+Conversion.swift | 2 +- .../Messages/Signal/TSInteraction.h | 2 -- .../Messages/Signal/TSInteraction.m | 17 +++++++---------- .../Sending & Receiving/MessageReceiver.swift | 5 ++--- 6 files changed, 11 insertions(+), 19 deletions(-) diff --git a/SessionMessagingKit/Database/Storage+Messaging.swift b/SessionMessagingKit/Database/Storage+Messaging.swift index 852503f2d..ca4149fa0 100644 --- a/SessionMessagingKit/Database/Storage+Messaging.swift +++ b/SessionMessagingKit/Database/Storage+Messaging.swift @@ -42,9 +42,6 @@ extension Storage { } else { tsMessage = TSIncomingMessage.from(message, quotedMessage: quotedMessage, linkPreview: linkPreview, associatedWith: thread) } - if let serverTimestamp = message.receivedTimestamp, openGroupID != nil { - tsMessage.setServerTimestampToReceivedTimestamp(serverTimestamp) - } tsMessage.save(with: transaction) tsMessage.attachments(with: transaction).forEach { attachment in attachment.albumMessageId = tsMessage.uniqueId! diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index f39136b4a..5d7ab3137 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 } 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 e7cc710cf..8e002d2f2 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]; } @@ -228,8 +225,8 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) - (uint64_t)sortId { - if ([self isKindOfClass:TSMessage.class] && ((TSMessage *)self).isOpenGroupMessage) { - return self.receivedAtTimestamp; + if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *)self).isOpenGroupMessage) { + return ((TSIncomingMessage *)self).serverTimestamp.unsignedLongLongValue; } return self.timestamp; } diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift index 63a73a80f..a6a153445 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -145,10 +145,9 @@ public enum MessageReceiver { message.sender = sender message.recipient = userPublicKey message.sentTimestamp = envelope.timestamp + message.receivedTimestamp = NSDate.millisecondTimestamp() if (isOpenGroupMessage) { - message.receivedTimestamp = envelope.serverTimestamp - } else { - message.receivedTimestamp = NSDate.millisecondTimestamp() + message.openGroupServerTimestamp = envelope.serverTimestamp } message.groupPublicKey = groupPublicKey message.openGroupServerMessageID = openGroupMessageServerID From 1a12487292a81b7057805730ee75848f1218f114 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 15 Apr 2021 10:09:05 +1000 Subject: [PATCH 4/4] Clean --- SessionMessagingKit/Messages/Message.swift | 8 ++++++++ .../Messages/Signal/TSInteraction.m | 16 ++++++++-------- .../Sending & Receiving/MessageReceiver.swift | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index 5d7ab3137..3ea4b46f0 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -31,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) { @@ -39,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/TSInteraction.m b/SessionMessagingKit/Messages/Signal/TSInteraction.m index 8e002d2f2..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 ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *)self).isOpenGroupMessage) { - return ((TSIncomingMessage *)self).serverTimestamp.unsignedLongLongValue; + if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *) self).isOpenGroupMessage) { + return ((TSIncomingMessage *) self).serverTimestamp.unsignedLongLongValue; } return _timestamp; } @@ -182,8 +182,8 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) - (NSDate *)receivedAtDate { - if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *)self).isOpenGroupMessage) { - return [NSDate ows_dateWithMillisecondsSince1970:((TSIncomingMessage *)self).serverTimestamp.unsignedLongLongValue]; + if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *) self).isOpenGroupMessage) { + return [NSDate ows_dateWithMillisecondsSince1970:((TSIncomingMessage *) self).serverTimestamp.unsignedLongLongValue]; } return [NSDate ows_dateWithMillisecondsSince1970:self.receivedAtTimestamp]; } @@ -196,8 +196,8 @@ 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. - // sortId == receivedAtTimestamp for open group messages. - // sortId == sendTimestamp for one-to-one and closed group messages. + // 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; @@ -225,8 +225,8 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value) - (uint64_t)sortId { - if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *)self).isOpenGroupMessage) { - return ((TSIncomingMessage *)self).serverTimestamp.unsignedLongLongValue; + if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *) self).isOpenGroupMessage) { + return ((TSIncomingMessage *) self).serverTimestamp.unsignedLongLongValue; } return self.timestamp; } diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift index a6a153445..3547681f3 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -146,7 +146,7 @@ public enum MessageReceiver { message.recipient = userPublicKey message.sentTimestamp = envelope.timestamp message.receivedTimestamp = NSDate.millisecondTimestamp() - if (isOpenGroupMessage) { + if isOpenGroupMessage { message.openGroupServerTimestamp = envelope.serverTimestamp } message.groupPublicKey = groupPublicKey