Migrate from Dictionary to LokiGroupChat.

pull/41/head
Mikunj 6 years ago
parent 99656b5961
commit 4c21cecc66

@ -1 +1 @@
Subproject commit 276b10db459e84a7352e1de87e1a5a9677f633c6
Subproject commit 98077061d67643bda2dc906dd37d571eccbcd164

@ -1495,30 +1495,9 @@ 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],
];
}
@ -1526,21 +1505,15 @@ static NSTimeInterval launchStartedAt;
{
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];
}

@ -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())

@ -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
}
}

Loading…
Cancel
Save