diff --git a/SignalMessaging/utils/ThreadUtil.m b/SignalMessaging/utils/ThreadUtil.m index 51c692099..bb05900ba 100644 --- a/SignalMessaging/utils/ThreadUtil.m +++ b/SignalMessaging/utils/ThreadUtil.m @@ -672,46 +672,49 @@ NS_ASSUME_NONNULL_BEGIN + (nullable TSInteraction *)findInteractionInThreadByTimestamp : (uint64_t)timestamp authorId : (NSString *)authorId threadUniqueId : (NSString *)threadUniqueId transaction - : (YapDatabaseReadTransaction *)transaction + : (YapDatabaseReadTransaction *)transaction; { OWSAssert(timestamp > 0); OWSAssert(authorId.length > 0); NSString *localNumber = [TSAccountManager localNumber]; if (localNumber.length < 1) { + OWSFail(@"%@ missing long number.", self.logTag); return nil; } NSArray *interactions = - [TSInteraction interactionsWithTimestamp:timestamp ofClass:[TSMessage class] withTransaction:transaction]; - - TSInteraction *_Nullable result = nil; - for (TSInteraction *interaction in interactions) { - NSString *_Nullable messageAuthorId = nil; - if ([interaction isKindOfClass:[TSIncomingMessage class]]) { - TSIncomingMessage *incomingMessage = (TSIncomingMessage *)interaction; - messageAuthorId = incomingMessage.authorId; - } else if ([interaction isKindOfClass:[TSOutgoingMessage class]]) { - messageAuthorId = localNumber; - } - if (messageAuthorId.length < 1) { - OWSFail(@"%@ Message missing author id.", self.logTag); - continue; - } - if (![authorId isEqualToString:messageAuthorId]) { - continue; - } - if (![interaction.uniqueThreadId isEqualToString:threadUniqueId]) { - continue; - } - if (result) { - // In case of collision, take the first. - DDLogError(@"%@ more than one matching interaction in thread.", self.logTag); - continue; - } - result = interaction; + [TSInteraction interactionsWithTimestamp:timestamp + filter:^(TSInteraction *interaction) { + NSString *_Nullable messageAuthorId = nil; + if ([interaction isKindOfClass:[TSIncomingMessage class]]) { + TSIncomingMessage *incomingMessage = (TSIncomingMessage *)interaction; + messageAuthorId = incomingMessage.authorId; + } else if ([interaction isKindOfClass:[TSOutgoingMessage class]]) { + messageAuthorId = localNumber; + } + if (messageAuthorId.length < 1) { + return NO; + } + + if (![authorId isEqualToString:messageAuthorId]) { + return NO; + } + if (![interaction.uniqueThreadId isEqualToString:threadUniqueId]) { + return NO; + } + return YES; + } + withTransaction:transaction]; + if (interactions.count < 1) { + return nil; } - return result; + if (interactions.count > 1) { + // In case of collision, take the first. + DDLogError(@"%@ more than one matching interaction in thread.", self.logTag); + return nil; + } + return interactions[0]; } @end diff --git a/SignalServiceKit/src/Messages/Interactions/TSInteraction.h b/SignalServiceKit/src/Messages/Interactions/TSInteraction.h index 1ea070928..67044af1f 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSInteraction.h +++ b/SignalServiceKit/src/Messages/Interactions/TSInteraction.h @@ -45,7 +45,7 @@ typedef NS_ENUM(NSInteger, OWSInteractionType) { + (NSArray *)interactionsWithTimestamp:(uint64_t)timestamp filter:(BOOL (^_Nonnull)(TSInteraction *))filter - withTransaction:(YapDatabaseReadWriteTransaction *)transaction; + withTransaction:(YapDatabaseReadTransaction *)transaction; - (NSDate *)dateForSorting; - (uint64_t)timestampForSorting;