From 4c21cecc66029f5d5e78710a73e26a07d02e4074 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Tue, 27 Aug 2019 12:26:02 +1000 Subject: [PATCH] Migrate from Dictionary to LokiGroupChat. --- Pods | 2 +- Signal/src/AppDelegate.m | 50 ++++--------------- Signal/src/Loki/LokiGroupChatPoller.swift | 26 +++------- .../src/Loki/API/LokiGroupChat.swift | 24 +++++++-- 4 files changed, 39 insertions(+), 63 deletions(-) diff --git a/Pods b/Pods index 276b10db4..98077061d 160000 --- a/Pods +++ b/Pods @@ -1 +1 @@ -Subproject commit 276b10db459e84a7352e1de87e1a5a9677f633c6 +Subproject commit 98077061d67643bda2dc906dd37d571eccbcd164 diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 3267d03fd..646c8edea 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -1495,52 +1495,25 @@ static NSTimeInterval launchStartedAt; - (NSArray *)publicChats { return @[ - @{ - kChatID: @"chat.lokinet.org.1", - kChatType: @"publicChat", - kChatServerURL: LKGroupChatAPI.publicChatServer, - kChatName: NSLocalizedString(@"Loki Public Chat", @""), - kChatClosable: @true, - kChatChannelID: @(LKGroupChatAPI.publicChatID), - }, - @{ - kChatID: @"rss://loki.network/feed/", - kChatType: @"rss", - kChatServerURL: @"https://loki.network/feed/", - kChatName: NSLocalizedString(@"Loki.network News", @""), - kChatClosable: @true, - kChatChannelID: @1, - }, - @{ - kChatID: @"rss://loki.network/category/messenger-updates/feed/", - kChatType: @"rss", - kChatServerURL: @"https://loki.network/category/messenger-updates/feed/", - kChatName: NSLocalizedString(@"Messenger updates", @""), - kChatClosable: @false, - kChatChannelID: @1, - } - ]; + [[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.network 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], + ]; } - (void)setupPublicChatGroupsIfNeeded { NSArray *chats = [self publicChats]; NSString *ourPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey; - for (NSDictionary *chat in chats) { - NSString *chatID = [chat objectForKey:kChatID]; - BOOL closable = [[chat objectForKey:kChatClosable] boolValue]; - - NSString *setupKey = [@"setup-" stringByAppendingString:chatID]; - if (closable) { + for (LKGroupChat *chat in chats) { + NSString *setupKey = [@"setup-" stringByAppendingString:chat.id]; + if (chat.isDeletable) { BOOL isChatSetup = [NSUserDefaults.standardUserDefaults boolForKey:setupKey]; if (isChatSetup) { continue; } } - NSString *title = [chat objectForKey:kChatName]; - NSString *serverURL = [chat objectForKey:kChatServerURL]; - // Create the group threads - TSGroupModel *group = [[TSGroupModel alloc] initWithTitle:title memberIds:@[ ourPublicKey, serverURL ] image:nil groupId:[chatID dataUsingEncoding:NSUTF8StringEncoding]]; + TSGroupModel *group = [[TSGroupModel alloc] initWithTitle:chat.displayName memberIds:@[ ourPublicKey, chat.server ] image:nil groupId:[chat.id dataUsingEncoding:NSUTF8StringEncoding]]; __block TSGroupThread *thread; [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { thread = [TSGroupThread getOrCreateThreadWithGroupModel:group transaction:transaction]; @@ -1554,7 +1527,7 @@ static NSTimeInterval launchStartedAt; }]; [OWSProfileManager.sharedManager addThreadToProfileWhitelist:thread]; - if (closable) { + if (chat.isDeletable) { [NSUserDefaults.standardUserDefaults setBool:YES forKey:setupKey]; } } @@ -1573,9 +1546,8 @@ static NSTimeInterval launchStartedAt; { if (self.lokiPublicChatPoller == nil) { NSArray *publicChats = [[self publicChats] filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary* bindings) { - NSDictionary *group = (NSDictionary *)object; - NSString *chatType = [group objectForKey:kChatType]; - return [chatType isEqualToString:@"publicChat"]; + LKGroupChat *group = (LKGroupChat *)object; + return group.isPublicChat; }]]; self.lokiPublicChatPoller = [[LKGroupChatPoller alloc] initWithGroups:publicChats]; } diff --git a/Signal/src/Loki/LokiGroupChatPoller.swift b/Signal/src/Loki/LokiGroupChatPoller.swift index 9e15676eb..a423d8254 100644 --- a/Signal/src/Loki/LokiGroupChatPoller.swift +++ b/Signal/src/Loki/LokiGroupChatPoller.swift @@ -1,12 +1,7 @@ -private let kChatID = "PublicChatID" -private let kChatChannelID = "PublicChatChannelID" -private let kChatName = "PublicChatName" -private let kServerURL = "PublicChatServerURL" - @objc(LKGroupChatPoller) public final class LokiGroupChatPoller : NSObject { - private let groups: [[String: Any]] + private let groups: [LokiGroupChat] private var pollForNewMessagesTimer: Timer? = nil private var pollForDeletedMessagesTimer: Timer? = nil private var hasStarted = false @@ -14,7 +9,7 @@ public final class LokiGroupChatPoller : NSObject { private let pollForNewMessagesInterval: TimeInterval = 4 private let pollForDeletedMessagesInterval: TimeInterval = 32 * 60 - @objc public init(groups: [[String: Any]]) { + @objc public init(groups: [LokiGroupChat]) { self.groups = groups super.init() } @@ -34,27 +29,22 @@ public final class LokiGroupChatPoller : NSObject { private func pollForNewMessages() { for group in groups { - guard let channelID = group[kChatChannelID] as? UInt, let server = group[kServerURL] as? String else { - Logger.info("[Loki] Failed to get channel id or server url from group: \(group)") + 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: server).map { [weak self] messages in + LokiGroupChatAPI.getMessages(for: channelID, on: group.server).map { [weak self] messages in self?.handleMessages(messages: messages, group: group) } } } - private func handleMessages(messages: [LokiGroupMessage], group: [String: Any]) -> Void { - guard let groupID = group[kChatID] as? String, let groupName = group[kChatName] as? String else { - Logger.info("[Loki] Failed to handle messages for group: \(group))") - return - } - + private func handleMessages(messages: [LokiGroupMessage], group: LokiGroupChat) -> Void { messages.reversed().forEach { message in - let id = groupID.data(using: String.Encoding.utf8)! + let id = group.id.data(using: String.Encoding.utf8)! let x1 = SSKProtoGroupContext.builder(id: id, type: .deliver) - x1.setName(groupName) + x1.setName(group.displayName) let x2 = SSKProtoDataMessage.builder() x2.setTimestamp(message.timestamp) x2.setGroup(try! x1.build()) diff --git a/SignalServiceKit/src/Loki/API/LokiGroupChat.swift b/SignalServiceKit/src/Loki/API/LokiGroupChat.swift index 43912ae00..d9090a585 100644 --- a/SignalServiceKit/src/Loki/API/LokiGroupChat.swift +++ b/SignalServiceKit/src/Loki/API/LokiGroupChat.swift @@ -2,14 +2,28 @@ @objc(LKGroupChat) public final class LokiGroupChat : NSObject { public let kind: Kind - public let server: String - public let displayName: String - public let isDeletable: Bool + @objc public let server: String + @objc public let displayName: String + @objc public let isDeletable: Bool - public var id: String { + @objc public var id: String { switch kind { case .publicChat(let id): return "\(server).\(id)" - case .rss(let customID): return customID + case .rss(let customID): return "rss://\(customID)" + } + } + + @objc public var isRSS: Bool { + switch kind { + case .publicChat(let id): return false + case .rss(let customID): return true + } + } + + @objc public var isPublicChat: Bool { + switch kind { + case .publicChat(let id): return true + case .rss(let customID): return false } }