pull/63/head
Niels Andriesse 6 years ago
parent 5c3064fb87
commit 3491539ce5

@ -541,16 +541,25 @@ NS_ASSUME_NONNULL_BEGIN
return message.isFriendRequest; return message.isFriendRequest;
} else { } else {
if (message.isFriendRequest) { if (message.isFriendRequest) {
// Only show an incoming friend request if the user isn't yet friends with any of the other user's devices // Only show the first friend request that was received
NSString *senderID = ((TSIncomingMessage *)message).authorId; NSString *senderID = ((TSIncomingMessage *)message).authorId;
__block NSSet<TSContactThread *> *linkedDeviceThreads; __block NSMutableSet<TSContactThread *> *linkedDeviceThreads;
[OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
linkedDeviceThreads = [LKDatabaseUtilities getLinkedDeviceThreadsFor:senderID in:transaction]; linkedDeviceThreads = [LKDatabaseUtilities getLinkedDeviceThreadsFor:senderID in:transaction].mutableCopy;
}]; }];
BOOL isFriend = [linkedDeviceThreads contains:^BOOL(TSContactThread *thread) { NSMutableArray<TSIncomingMessage *> *allFriendRequestMessages = @[].mutableCopy;
return thread.isContactFriend; for (TSContactThread *thread in linkedDeviceThreads) {
[thread enumerateInteractionsUsingBlock:^(TSInteraction *interaction) {
TSIncomingMessage *message = [interaction as:TSIncomingMessage.class];
if (message != nil && message.isFriendRequest) {
[allFriendRequestMessages addObject:message];
}
}];
}
[allFriendRequestMessages sortUsingComparator:^NSComparisonResult(TSIncomingMessage *lhs, TSIncomingMessage *rhs) {
return [@(lhs.timestamp) compare:@(rhs.timestamp)] == NSOrderedDescending;
}]; }];
return !isFriend; return [message.uniqueId isEqual:allFriendRequestMessages.firstObject.uniqueId];
} else { } else {
return NO; return NO;
} }

@ -4451,8 +4451,6 @@ typedef enum : NSUInteger {
- (void)acceptFriendRequest:(TSIncomingMessage *)friendRequest - (void)acceptFriendRequest:(TSIncomingMessage *)friendRequest
{ {
// Update the thread's friend request status
[self.thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:nil];
// Accept all outstanding friend requests associated with this user and try to establish sessions with the // Accept all outstanding friend requests associated with this user and try to establish sessions with the
// subset of their devices that haven't sent a friend request. // subset of their devices that haven't sent a friend request.
NSString *senderID = friendRequest.authorId; NSString *senderID = friendRequest.authorId;
@ -4466,9 +4464,13 @@ typedef enum : NSUInteger {
} else { } else {
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender; OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
OWSMessageSend *automatedFriendRequestMessage = [messageSender getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:thread.contactIdentifier]; OWSMessageSend *automatedFriendRequestMessage = [messageSender getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:thread.contactIdentifier];
dispatch_async(OWSDispatch.sendingQueue, ^{
[messageSender sendMessage:automatedFriendRequestMessage]; [messageSender sendMessage:automatedFriendRequestMessage];
});
} }
} }
// Update the thread's friend request status
[self.thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:nil];
} }
- (void)declineFriendRequest:(TSIncomingMessage *)friendRequest - (void)declineFriendRequest:(TSIncomingMessage *)friendRequest

@ -24,12 +24,13 @@ public final class LokiDatabaseUtilities : NSObject {
// MARK: Device Links // MARK: Device Links
@objc(getLinkedDeviceHexEncodedPublicKeysFor:in:) @objc(getLinkedDeviceHexEncodedPublicKeysFor:in:)
public static func getLinkedDeviceHexEncodedPublicKeys(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> Set<String> { public static func getLinkedDeviceHexEncodedPublicKeys(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> Set<String> {
var result = Set<TSContactThread>()
let storage = OWSPrimaryStorage.shared() let storage = OWSPrimaryStorage.shared()
let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey
return Set(storage.getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction).flatMap { deviceLink in var result = Set(storage.getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction).flatMap { deviceLink in
return [ deviceLink.master.hexEncodedPublicKey, deviceLink.slave.hexEncodedPublicKey ] return [ deviceLink.master.hexEncodedPublicKey, deviceLink.slave.hexEncodedPublicKey ]
}) })
result.insert(hexEncodedPublicKey)
return result
} }
@objc(getLinkedDeviceThreadsFor:in:) @objc(getLinkedDeviceThreadsFor:in:)

@ -498,9 +498,15 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSAssertDebug(message); OWSAssertDebug(message);
OWSAssertDebug(errorHandle); OWSAssertDebug(errorHandle);
NSMutableSet<NSString *> *recipientIds = [NSMutableSet new]; __block NSMutableSet<NSString *> *recipientIds = [NSMutableSet new];
if ([message isKindOfClass:[OWSOutgoingSyncMessage class]]) { if ([message isKindOfClass:[OWSOutgoingSyncMessage class]]) {
[recipientIds addObject:self.tsAccountManager.localNumber]; NSString *userHexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey;
[OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
NSString *masterHexEncodedPublicKey = [LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:userHexEncodedPublicKey in:transaction] ?: userHexEncodedPublicKey;
NSMutableSet<NSString *> *linkedDeviceHexEncodedPublicKeys = [LKDatabaseUtilities getLinkedDeviceHexEncodedPublicKeysFor:userHexEncodedPublicKey in:transaction].mutableCopy;
[linkedDeviceHexEncodedPublicKeys removeObject:userHexEncodedPublicKey];
recipientIds = [recipientIds setByAddingObjectsFromSet:linkedDeviceHexEncodedPublicKeys].mutableCopy;
}];
} else if (thread.isGroupThread) { } else if (thread.isGroupThread) {
[self.primaryStorage.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { [self.primaryStorage.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
LKPublicChat *publicChat = [LKDatabaseUtilities getPublicChatForThreadID:thread.uniqueId transaction:transaction]; LKPublicChat *publicChat = [LKDatabaseUtilities getPublicChatForThreadID:thread.uniqueId transaction:transaction];
@ -935,7 +941,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
if (isGroupMessage || isDeviceLinkMessage) { if (isGroupMessage || isDeviceLinkMessage) {
[self sendMessage:messageSend]; [self sendMessage:messageSend];
} else { } else {
BOOL isSilentMessage = message.isSilent || [message isKindOfClass:LKEphemeralMessage.class]; BOOL isSilentMessage = message.isSilent || [message isKindOfClass:LKEphemeralMessage.class] || [message isKindOfClass:OWSOutgoingSyncMessage.class];
BOOL isFriendRequestMessage = [message isKindOfClass:LKFriendRequestMessage.class]; BOOL isFriendRequestMessage = [message isKindOfClass:LKFriendRequestMessage.class];
[[LKAPI getDestinationsFor:contactID] [[LKAPI getDestinationsFor:contactID]
.thenOn(OWSDispatch.sendingQueue, ^(NSArray<LKDestination *> *destinations) { .thenOn(OWSDispatch.sendingQueue, ^(NSArray<LKDestination *> *destinations) {

Loading…
Cancel
Save