// // Copyright (c) 2018 Open Whisper Systems. All rights reserved. // #import "TSContactThread.h" #import #import NS_ASSUME_NONNULL_BEGIN NSString *const TSContactThreadPrefix = @"c"; @implementation TSContactThread - (instancetype)initWithContactSessionID:(NSString *)contactSessionID { NSString *uniqueIdentifier = [[self class] threadIDFromContactSessionID:contactSessionID]; self = [super initWithUniqueId:uniqueIdentifier]; return self; } + (instancetype)getOrCreateThreadWithContactSessionID:(NSString *)contactSessionID transaction:(YapDatabaseReadWriteTransaction *)transaction { TSContactThread *thread = [self fetchObjectWithUniqueID:[self threadIDFromContactSessionID:contactSessionID] transaction:transaction]; if (!thread) { thread = [[TSContactThread alloc] initWithContactSessionID:contactSessionID]; [thread saveWithTransaction:transaction]; } return thread; } + (instancetype)getOrCreateThreadWithContactSessionID:(NSString *)contactSessionID openGroupServer:(NSString *)openGroupServer openGroupPublicKey:(NSString *)openGroupPublicKey transaction:(YapDatabaseReadWriteTransaction *)transaction { TSContactThread *thread = [self fetchObjectWithUniqueID:[self threadIDFromContactSessionID:contactSessionID] transaction:transaction]; if (!thread) { thread = [[TSContactThread alloc] initWithContactSessionID:contactSessionID]; thread.originalOpenGroupServer = openGroupServer; thread.originalOpenGroupPublicKey = openGroupPublicKey; [thread saveWithTransaction:transaction]; } return thread; } + (instancetype)getOrCreateThreadWithContactSessionID:(NSString *)contactSessionID { __block TSContactThread *thread; [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { thread = [self getOrCreateThreadWithContactSessionID:contactSessionID transaction:transaction]; }]; return thread; } + (instancetype)getOrCreateThreadWithContactSessionID:(NSString *)contactSessionID openGroupServer:(NSString *)openGroupServer openGroupPublicKey:(NSString *)openGroupPublicKey { __block TSContactThread *thread; [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { thread = [self getOrCreateThreadWithContactSessionID:contactSessionID openGroupServer:openGroupServer openGroupPublicKey:openGroupPublicKey transaction:transaction]; }]; return thread; } + (nullable instancetype)getThreadWithContactSessionID:(NSString *)contactSessionID transaction:(YapDatabaseReadTransaction *)transaction; { return [TSContactThread fetchObjectWithUniqueID:[self threadIDFromContactSessionID:contactSessionID] transaction:transaction]; } - (NSString *)contactSessionID { return [[self class] contactSessionIDFromThreadID:self.uniqueId]; } - (NSArray *)recipientIdentifiers { return @[ self.contactSessionID ]; } - (BOOL)isMessageRequest { NSString *sessionID = self.contactSessionID; SNContact *contact = [LKStorage.shared getContactWithSessionID:sessionID]; return ( self.shouldBeVisible && !self.isNoteToSelf && ( contact == nil || !contact.isApproved ) ); } - (BOOL)isMessageRequestUsingTransaction:(YapDatabaseReadTransaction *)transaction { NSString *sessionID = self.contactSessionID; SNContact *contact = [LKStorage.shared getContactWithSessionID:sessionID using:transaction]; return ( self.shouldBeVisible && !self.isNoteToSelf && ( contact == nil || !contact.isApproved ) ); } - (BOOL)isGroupThread { return NO; } - (NSString *)name { NSString *sessionID = self.contactSessionID; SNContact *contact = [LKStorage.shared getContactWithSessionID:sessionID]; return [contact displayNameFor:SNContactContextRegular] ?: sessionID; } - (NSString *)nameWithTransaction:(YapDatabaseReadTransaction *)transaction { NSString *sessionID = self.contactSessionID; SNContact *contact = [LKStorage.shared getContactWithSessionID:sessionID using:transaction]; return [contact displayNameFor:SNContactContextRegular] ?: sessionID; } + (NSString *)threadIDFromContactSessionID:(NSString *)contactSessionID { return [TSContactThreadPrefix stringByAppendingString:contactSessionID]; } + (NSString *)contactSessionIDFromThreadID:(NSString *)threadId { return [threadId substringWithRange:NSMakeRange(1, threadId.length - 1)]; } @end NS_ASSUME_NONNULL_END