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?
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
enum Kind : String { case incoming, outgoing }
@ -83,20 +74,24 @@
switch kind {
case .incoming:
guard let message = message as? TSIncomingMessage else { preconditionFailure() }
buttonStackView.isHidden = didAcceptRequest || didDeclineRequest || message.isFriendRequestExpired
buttonStackView.isHidden = !(message.friendRequestStatus == .pending)
let format: String = {
if didAcceptRequest { return NSLocalizedString("You've accepted %@'s friend request", comment: "") }
else if didDeclineRequest { return NSLocalizedString("You've declined %@'s friend request", comment: "") }
else if message.isFriendRequestExpired { return NSLocalizedString("%@'s friend request has expired", comment: "") }
else { return NSLocalizedString("%@ sent you a friend request", comment: "") }
switch (message.friendRequestStatus) {
case .accepted: return NSLocalizedString("You've accepted %@'s friend request", comment: "")
case .declined: return NSLocalizedString("You've declined %@'s 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)
case .outgoing:
guard let message = message as? TSOutgoingMessage else { preconditionFailure() }
let format: String = {
if didAcceptRequest { return NSLocalizedString("%@ accepted your friend request", comment: "") }
else if message.isFriendRequestExpired { return NSLocalizedString("Your friend request to %@ has expired", comment: "") }
else { return NSLocalizedString("You've sent %@ a friend request", comment: "") }
switch (message.friendRequestStatus) {
case .accepted: return NSLocalizedString("%@ accepted your 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()!)
}
@ -105,11 +100,13 @@
// MARK: Interaction
@objc private func accept() {
guard let message = message as? TSIncomingMessage else { preconditionFailure() }
message.saveFriendRequestStatus(.accepted, with: nil)
delegate?.acceptFriendRequest(message)
}
@objc private func decline() {
guard let message = message as? TSIncomingMessage else { preconditionFailure() }
message.saveFriendRequestStatus(.declined, with: nil)
delegate?.declineFriendRequest(message)
handleMessageChanged() // Update UI
}

@ -2579,6 +2579,7 @@
"Secure session reset in progress" = "Secure session reset in progress";
"Secure session reset done" = "Secure session reset done";
"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 accepted %@'s friend request" = "You've accepted %@'s friend request";
"%@ accepted your friend request" = "%@ accepted your friend request";

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

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

@ -17,6 +17,20 @@ NS_ASSUME_NONNULL_BEGIN
@class TSQuotedMessage;
@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>
@property (nonatomic, readonly) NSMutableArray<NSString *> *attachmentIds;
@ -28,9 +42,12 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly, nullable) TSQuotedMessage *quotedMessage;
@property (nonatomic, readonly, nullable) OWSContact *contactShare;
@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) BOOL isFriendRequestExpired;
@property (nonatomic, readonly) BOOL isFriendRequest;
// ========
- (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_UNAVAILABLE;
@ -73,9 +90,8 @@ NS_ASSUME_NONNULL_BEGIN
#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)saveIsFriendRequestExpired:(BOOL)isFriendRequestExpired withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
@end

@ -441,9 +441,9 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
#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) {
[self save];
} else {
@ -461,14 +461,9 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
}
}
- (void)saveIsFriendRequestExpired:(BOOL)isFriendRequestExpired withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction
- (BOOL)isFriendRequest
{
self.isFriendRequestExpired = isFriendRequestExpired;
if (transaction == nil) {
[self save];
} else {
[self saveWithTransaction:transaction];
}
return self.friendRequestStatus != TSMessageFriendRequestStatusNone;
}
@end

@ -1475,7 +1475,7 @@ NS_ASSUME_NONNULL_BEGIN
// we can end up in a deadlock where both users' threads' friend request statuses are
// TSThreadFriendRequestStatusRequestSent.
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction];
// The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread]
OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread];
[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
// TSThreadFriendRequestStatusRequestReceived.
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction];
message.isFriendRequest = YES;
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction];
}
} else if (!thread.isContactFriend) {
// 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.
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction];
}
}

@ -1111,6 +1111,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue;
if (messageType == TSFriendRequestMessageType) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil];
}
BOOL isPoWRequired = YES; // TODO: Base on message type
[[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) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction];
[message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil];
// Set the expiration date
NSTimeInterval expirationInterval = 72 * kHourInterval;
NSDate *expireDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval];
@ -1139,6 +1141,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
// ========
if (messageType == TSFriendRequestMessageType) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil];
}
// ========
// Handle the error

Loading…
Cancel
Save