diff --git a/Signal/src/AppDelegate.h b/Signal/src/AppDelegate.h index c14a3e70b..a0c86290a 100644 --- a/Signal/src/AppDelegate.h +++ b/Signal/src/AppDelegate.h @@ -8,6 +8,7 @@ extern NSString *const AppDelegateStoryboardMain; @interface AppDelegate : UIResponder -- (void)startPublicChatPollingIfNeeded; +- (void)createGroupChatsIfNeeded; +- (void)startGroupChatPollersIfNeeded; @end diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index b4241f27e..f15c7dd71 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -65,6 +65,8 @@ static NSTimeInterval launchStartedAt; @property (nonatomic) BOOL didAppLaunchFail; @property (nonatomic) LKP2PServer *lokiP2PServer; @property (nonatomic) LKGroupChatPoller *lokiPublicChatPoller; +@property (nonatomic) LKGroupChatPoller *lokiNewsPoller; +@property (nonatomic) LKGroupChatPoller *lokiMessengerUpdatesPoller; @end @@ -1485,26 +1487,30 @@ static NSTimeInterval launchStartedAt; #pragma mark - Loki -- (NSArray *)groupChats +- (LKGroupChat *)lokiPublicChat { - return @[ - [[LKGroupChat alloc] initWithKindAsString:@"publicChat" id:@(LKGroupChatAPI.publicChatID).stringValue server:LKGroupChatAPI.publicChatServer displayName:NSLocalizedString(@"Loki Public Chat", @"") isDeletable:true], - [[LKGroupChat alloc] initWithKindAsString:@"rss" id:@"loki.network.feed" server:@"https://loki.network/feed/" displayName:NSLocalizedString(@"Loki News", @"") isDeletable:true], - [[LKGroupChat alloc] initWithKindAsString:@"rss" id:@"loki.network.messenger-update" server:@"https://loki.network/category/messenger-updates/feed/" displayName:NSLocalizedString(@"Messenger Updates", @"") isDeletable:false], - ]; + return [[LKGroupChat alloc] initWithKindAsString:@"publicChat" id:@(LKGroupChatAPI.publicChatID).stringValue server:LKGroupChatAPI.publicChatServer displayName:NSLocalizedString(@"Loki Public Chat", @"") isDeletable:true]; +} + +- (LKGroupChat *)lokiNews +{ + return [[LKGroupChat alloc] initWithKindAsString:@"rss" id:@"loki.network.feed" server:@"https://loki.network/feed/" displayName:NSLocalizedString(@"Loki News", @"") isDeletable:true]; +} + +- (LKGroupChat *)lokiMessengerUpdates +{ + return [[LKGroupChat alloc] initWithKindAsString:@"rss" id:@"loki.network.messenger-update" server:@"https://loki.network/category/messenger-updates/feed/" displayName:NSLocalizedString(@"Loki Messenger Updates", @"") isDeletable:false]; } -- (void)setUpGroupChatsIfNeeded +- (void)createGroupChatsIfNeeded { - NSArray *groupChats = self.groupChats; + NSArray *allGroupChats = @[ self.lokiPublicChat, self.lokiNews, self.lokiMessengerUpdates ]; NSString *userHexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey; - for (LKGroupChat *chat in groupChats) { - NSString *userDefaultsKey = [@"isGroupChatSetUp." stringByAppendingString:chat.id]; - if (chat.isDeletable) { - BOOL isChatSetUp = [NSUserDefaults.standardUserDefaults boolForKey:setupKey]; - if (isChatSetUp) { continue; } - } - TSGroupModel *group = [[TSGroupModel alloc] initWithTitle:chat.displayName memberIds:@[ ourPublicKey, chat.server ] image:nil groupId:[chat.id dataUsingEncoding:NSUTF8StringEncoding]]; + for (LKGroupChat *chat in allGroupChats) { + NSString *userDefaultsKey = [@"isSetUp." stringByAppendingString:chat.id]; + BOOL isChatSetUp = [NSUserDefaults.standardUserDefaults boolForKey:userDefaultsKey]; + if (chat.isDeletable && isChatSetUp) { continue; } + TSGroupModel *group = [[TSGroupModel alloc] initWithTitle:chat.displayName memberIds:@[ userHexEncodedPublicKey, chat.server ] image:nil groupId:[chat.id dataUsingEncoding:NSUTF8StringEncoding]]; __block TSGroupThread *thread; [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { thread = [TSGroupThread getOrCreateThreadWithGroupModel:group transaction:transaction]; @@ -1517,26 +1523,20 @@ static NSTimeInterval launchStartedAt; [thread updateWithMutedUntilDate:date transaction:transaction]; }]; [OWSProfileManager.sharedManager addThreadToProfileWhitelist:thread]; - if (chat.isDeletable) { - [NSUserDefaults.standardUserDefaults setBool:YES forKey:userDefaultsKey]; - } + [NSUserDefaults.standardUserDefaults setBool:YES forKey:userDefaultsKey]; } } -- (void)setUpGroupChatPollerIfNeeded +- (void)createGroupChatPollersIfNeeded { - if (self.lokiGroupChatPoller == nil) { - NSArray *groupChats = [self.groupChats filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary* bindings) { - LKGroupChat *group = (LKGroupChat *)object; - return group.isPublicChat; - }]]; - self.lokiPublicChatPoller = [[LKGroupChatPoller alloc] initWithGroups:publicChats]; - } + if (self.lokiPublicChatPoller == nil) { self.lokiPublicChatPoller = [[LKGroupChatPoller alloc] initForGroup:self.lokiPublicChat]; } + if (self.lokiNewsPoller == nil) { self.lokiNewsPoller = [[LKGroupChatPoller alloc] initForGroup:self.lokiNews]; } + if (self.lokiMessengerUpdatesPoller == nil) { self.lokiMessengerUpdatesPoller = [[LKGroupChatPoller alloc] initForGroup:self.lokiMessengerUpdates]; } } -- (void)startPublicChatPollingIfNeeded +- (void)startGroupChatPollersIfNeeded { - [self setUpPublicChatIfNeeded]; + [self createGroupChatPollersIfNeeded]; [self.lokiPublicChatPoller startIfNeeded]; } diff --git a/Signal/src/Loki/LokiGroupChatPoller.swift b/Signal/src/Loki/LokiGroupChatPoller.swift index a423d8254..45401519f 100644 --- a/Signal/src/Loki/LokiGroupChatPoller.swift +++ b/Signal/src/Loki/LokiGroupChatPoller.swift @@ -1,16 +1,23 @@ @objc(LKGroupChatPoller) public final class LokiGroupChatPoller : NSObject { - private let groups: [LokiGroupChat] + private let group: LokiGroupChat private var pollForNewMessagesTimer: Timer? = nil private var pollForDeletedMessagesTimer: Timer? = nil private var hasStarted = false - private let pollForNewMessagesInterval: TimeInterval = 4 + private lazy var pollForNewMessagesInterval: TimeInterval = { + switch group.kind { + case .publicChat(_): return 4 + case .rss(_): return 8 * 60 + } + }() + private let pollForDeletedMessagesInterval: TimeInterval = 32 * 60 - @objc public init(groups: [LokiGroupChat]) { - self.groups = groups + @objc(initForGroup:) + public init(for group: LokiGroupChat) { + self.group = group super.init() } @@ -28,40 +35,34 @@ public final class LokiGroupChatPoller : NSObject { } private func pollForNewMessages() { - for group in groups { - guard case let LokiGroupChat.Kind.publicChat(channelID) = group.kind else { - Logger.info("[Loki] Trying to poll RSS group chat: \(group)") - return - } - - LokiGroupChatAPI.getMessages(for: channelID, on: group.server).map { [weak self] messages in - self?.handleMessages(messages: messages, group: group) - } - } - } - - private func handleMessages(messages: [LokiGroupMessage], group: LokiGroupChat) -> Void { - messages.reversed().forEach { message in - let id = group.id.data(using: String.Encoding.utf8)! - let x1 = SSKProtoGroupContext.builder(id: id, type: .deliver) - x1.setName(group.displayName) - let x2 = SSKProtoDataMessage.builder() - x2.setTimestamp(message.timestamp) - x2.setGroup(try! x1.build()) - x2.setBody(message.body) - let x3 = SSKProtoContent.builder() - x3.setDataMessage(try! x2.build()) - let x4 = SSKProtoEnvelope.builder(type: .ciphertext, timestamp: message.timestamp) - let senderHexEncodedPublicKey = message.hexEncodedPublicKey - let endIndex = senderHexEncodedPublicKey.endIndex - let cutoffIndex = senderHexEncodedPublicKey.index(endIndex, offsetBy: -8) - let senderDisplayName = "\(message.displayName) (...\(senderHexEncodedPublicKey[cutoffIndex..