Implement message friend request status

Untested
pull/19/head
Niels Andriesse 6 years ago
parent 56018fd475
commit 740291cceb

@ -4,15 +4,6 @@
@objc weak var delegate: FriendRequestViewDelegate? @objc weak var delegate: FriendRequestViewDelegate?
private let kind: Kind private let kind: Kind
private var didAcceptRequest: Bool {
return message.thread.friendRequestStatus == .friends
}
private var didDeclineRequest: Bool {
guard let message = message as? TSIncomingMessage else { preconditionFailure() }
return message.thread.friendRequestStatus == .none
}
// MARK: Types // MARK: Types
enum Kind : String { case incoming, outgoing } enum Kind : String { case incoming, outgoing }
@ -83,20 +74,24 @@
switch kind { switch kind {
case .incoming: case .incoming:
guard let message = message as? TSIncomingMessage else { preconditionFailure() } guard let message = message as? TSIncomingMessage else { preconditionFailure() }
buttonStackView.isHidden = didAcceptRequest || didDeclineRequest || message.isFriendRequestExpired buttonStackView.isHidden = !(message.friendRequestStatus == .pending)
let format: String = { let format: String = {
if didAcceptRequest { return NSLocalizedString("You've accepted %@'s friend request", comment: "") } switch (message.friendRequestStatus) {
else if didDeclineRequest { return NSLocalizedString("You've declined %@'s friend request", comment: "") } case .accepted: return NSLocalizedString("You've accepted %@'s friend request", comment: "")
else if message.isFriendRequestExpired { return NSLocalizedString("%@'s friend request has expired", comment: "") } case .declined: return NSLocalizedString("You've declined %@'s friend request", comment: "")
else { return NSLocalizedString("%@ sent you a friend request", comment: "") } case .expired: return NSLocalizedString("%@'s friend request has expired", comment: "")
default: return NSLocalizedString("%@ sent you a friend request", comment: "")
}
}() }()
label.text = String(format: format, message.authorId) label.text = String(format: format, message.authorId)
case .outgoing: case .outgoing:
guard let message = message as? TSOutgoingMessage else { preconditionFailure() } guard let message = message as? TSOutgoingMessage else { preconditionFailure() }
let format: String = { let format: String = {
if didAcceptRequest { return NSLocalizedString("%@ accepted your friend request", comment: "") } switch (message.friendRequestStatus) {
else if message.isFriendRequestExpired { return NSLocalizedString("Your friend request to %@ has expired", comment: "") } case .accepted: return NSLocalizedString("%@ accepted your friend request", comment: "")
else { return NSLocalizedString("You've sent %@ a friend request", comment: "") } case .expired: return NSLocalizedString("Your friend request to %@ has expired", comment: "")
default: return NSLocalizedString("You've sent %@ a friend request", comment: "")
}
}() }()
label.text = String(format: format, message.thread.contactIdentifier()!) label.text = String(format: format, message.thread.contactIdentifier()!)
} }
@ -105,11 +100,13 @@
// MARK: Interaction // MARK: Interaction
@objc private func accept() { @objc private func accept() {
guard let message = message as? TSIncomingMessage else { preconditionFailure() } guard let message = message as? TSIncomingMessage else { preconditionFailure() }
message.saveFriendRequestStatus(.accepted, with: nil)
delegate?.acceptFriendRequest(message) delegate?.acceptFriendRequest(message)
} }
@objc private func decline() { @objc private func decline() {
guard let message = message as? TSIncomingMessage else { preconditionFailure() } guard let message = message as? TSIncomingMessage else { preconditionFailure() }
message.saveFriendRequestStatus(.declined, with: nil)
delegate?.declineFriendRequest(message) delegate?.declineFriendRequest(message)
handleMessageChanged() // Update UI handleMessageChanged() // Update UI
} }

@ -2579,6 +2579,7 @@
"Secure session reset in progress" = "Secure session reset in progress"; "Secure session reset in progress" = "Secure session reset in progress";
"Secure session reset done" = "Secure session reset done"; "Secure session reset done" = "Secure session reset done";
"Session" = "Session"; "Session" = "Session";
"You've sent %@ a friend request" = "You've sent %@ a friend request";
"You've declined %@'s friend request" = "You've declined %@'s friend request"; "You've declined %@'s friend request" = "You've declined %@'s friend request";
"You've accepted %@'s friend request" = "You've accepted %@'s friend request"; "You've accepted %@'s friend request" = "You've accepted %@'s friend request";
"%@ accepted your friend request" = "%@ accepted your friend request"; "%@ accepted your friend request" = "%@ accepted your friend request";

@ -29,7 +29,7 @@ extern ConversationColorName const ConversationColorNameSteel;
extern ConversationColorName const kConversationColorName_Default; extern ConversationColorName const kConversationColorName_Default;
// Loki: Friend request state // Loki: Friend request status
typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) {
/// New conversation, no messages sent or received /// New conversation, no messages sent or received
TSThreadFriendRequestStatusNone, TSThreadFriendRequestStatusNone,

@ -138,8 +138,8 @@ public final class FriendRequestExpireJob : NSObject {
// Loki: Expire the friend request message // Loki: Expire the friend request message
message.thread.saveFriendRequestStatus(.requestExpired, with: transaction) message.thread.saveFriendRequestStatus(.requestExpired, with: transaction)
message.saveFriendRequestStatus(.expired, with: transaction)
message.saveFriendRequestExpires(at: 0, with: transaction) message.saveFriendRequestExpires(at: 0, with: transaction)
message.saveIsFriendRequestExpired(true, with: transaction)
}, transaction: transaction) }, transaction: transaction)
} }
}) })

@ -17,6 +17,20 @@ NS_ASSUME_NONNULL_BEGIN
@class TSQuotedMessage; @class TSQuotedMessage;
@class YapDatabaseReadWriteTransaction; @class YapDatabaseReadWriteTransaction;
// Loki: Friend request status
typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) {
/// Not a friend request message.
TSMessageFriendRequestStatusNone,
/// A pending friend request.
TSMessageFriendRequestStatusPending,
/// A friend request that has been accepted.
TSMessageFriendRequestStatusAccepted,
/// A friend request that has been declined.
TSMessageFriendRequestStatusDeclined,
/// A friend request that has expired.
TSMessageFriendRequestStatusExpired
};
@interface TSMessage : TSInteraction <OWSPreviewText> @interface TSMessage : TSInteraction <OWSPreviewText>
@property (nonatomic, readonly) NSMutableArray<NSString *> *attachmentIds; @property (nonatomic, readonly) NSMutableArray<NSString *> *attachmentIds;
@ -28,9 +42,12 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly, nullable) TSQuotedMessage *quotedMessage; @property (nonatomic, readonly, nullable) TSQuotedMessage *quotedMessage;
@property (nonatomic, readonly, nullable) OWSContact *contactShare; @property (nonatomic, readonly, nullable) OWSContact *contactShare;
@property (nonatomic, readonly, nullable) OWSLinkPreview *linkPreview; @property (nonatomic, readonly, nullable) OWSLinkPreview *linkPreview;
@property (nonatomic) BOOL isFriendRequest; // Loki // Loki friend request handling
// ========
@property (nonatomic) TSMessageFriendRequestStatus friendRequestStatus;
@property (nonatomic) uint64_t friendRequestExpiresAt; @property (nonatomic) uint64_t friendRequestExpiresAt;
@property (nonatomic) BOOL isFriendRequestExpired; @property (nonatomic, readonly) BOOL isFriendRequest;
// ========
- (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_UNAVAILABLE; - (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_UNAVAILABLE;
@ -73,9 +90,8 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Loki Friend Request Handling #pragma mark - Loki Friend Request Handling
- (void)saveIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; - (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
- (void)saveFriendRequestExpiresAt:(u_int64_t)expiresAt withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; - (void)saveFriendRequestExpiresAt:(u_int64_t)expiresAt withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
- (void)saveIsFriendRequestExpired:(BOOL)isFriendRequestExpired withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
@end @end

@ -441,9 +441,9 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
#pragma mark - Loki Friend Request Handling #pragma mark - Loki Friend Request Handling
- (void)saveIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction - (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction
{ {
self.isFriendRequest = isFriendRequest; self.friendRequestStatus = friendRequestStatus;
if (transaction == nil) { if (transaction == nil) {
[self save]; [self save];
} else { } else {
@ -461,14 +461,9 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
} }
} }
- (void)saveIsFriendRequestExpired:(BOOL)isFriendRequestExpired withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction - (BOOL)isFriendRequest
{ {
self.isFriendRequestExpired = isFriendRequestExpired; return self.friendRequestStatus != TSMessageFriendRequestStatusNone;
if (transaction == nil) {
[self save];
} else {
[self saveWithTransaction:transaction];
}
} }
@end @end

@ -1475,7 +1475,7 @@ NS_ASSUME_NONNULL_BEGIN
// we can end up in a deadlock where both users' threads' friend request statuses are // we can end up in a deadlock where both users' threads' friend request statuses are
// TSThreadFriendRequestStatusRequestSent. // TSThreadFriendRequestStatusRequestSent.
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; [thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction];
// The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread] // The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread]
OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread]; OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread];
[self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction]; [self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction];
@ -1486,12 +1486,13 @@ NS_ASSUME_NONNULL_BEGIN
// request. Alice's thread's friend request status is reset to // request. Alice's thread's friend request status is reset to
// TSThreadFriendRequestStatusRequestReceived. // TSThreadFriendRequestStatusRequestReceived.
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; [thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction];
message.isFriendRequest = YES; [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction];
} }
} else if (!thread.isContactFriend) { } else if (!thread.isContactFriend) {
// If the thread's friend request status is not TSThreadFriendRequestStatusFriends, but we're receiving a message, // If the thread's friend request status is not TSThreadFriendRequestStatusFriends, but we're receiving a message,
// it must be a friend request accepted message. Declining a friend request doesn't send a message. // it must be a friend request accepted message. Declining a friend request doesn't send a message.
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; [thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction];
} }
} }

@ -1111,6 +1111,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue; NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue;
if (messageType == TSFriendRequestMessageType) { if (messageType == TSFriendRequestMessageType) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil]; [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil];
} }
BOOL isPoWRequired = YES; // TODO: Base on message type BOOL isPoWRequired = YES; // TODO: Base on message type
[[LokiAPI objc_sendSignalMessage:signalMessage to:recipient.recipientId timestamp:message.timestamp requiringPoW:isPoWRequired] [[LokiAPI objc_sendSignalMessage:signalMessage to:recipient.recipientId timestamp:message.timestamp requiringPoW:isPoWRequired]
@ -1121,6 +1122,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction]; [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction];
[message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction]; [message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil];
// Set the expiration date // Set the expiration date
NSTimeInterval expirationInterval = 72 * kHourInterval; NSTimeInterval expirationInterval = 72 * kHourInterval;
NSDate *expireDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval]; NSDate *expireDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval];
@ -1139,6 +1141,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
// ======== // ========
if (messageType == TSFriendRequestMessageType) { if (messageType == TSFriendRequestMessageType) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil];
} }
// ======== // ========
// Handle the error // Handle the error

Loading…
Cancel
Save