Added dictionary for adding more servers.

Updated group chat poller to take an array of groups.
pull/41/head
Mikunj 6 years ago
parent 201127f6c2
commit 3930891a3d

@ -56,6 +56,13 @@ static NSString *const kInitialViewControllerIdentifier = @"UserInitialViewContr
static NSString *const kURLSchemeSGNLKey = @"sgnl"; static NSString *const kURLSchemeSGNLKey = @"sgnl";
static NSString *const kURLHostVerifyPrefix = @"verify"; static NSString *const kURLHostVerifyPrefix = @"verify";
static NSString *const kChatID = @"PublicChatID";
static NSString *const kChatType = @"PublicChatType";
static NSString *const kChatServerURL = @"PublicChatServerURL";
static NSString *const kChatName = @"PublicChatName";
static NSString *const kChatClosable = @"PublicChatClosable";
static NSString *const kChatChannelID = @"PublicChatChannelID";
static NSTimeInterval launchStartedAt; static NSTimeInterval launchStartedAt;
@interface AppDelegate () <UNUserNotificationCenterDelegate> @interface AppDelegate () <UNUserNotificationCenterDelegate>
@ -1485,15 +1492,55 @@ static NSTimeInterval launchStartedAt;
#pragma mark - Loki #pragma mark - Loki
- (void)setUpPublicChatIfNeeded - (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,
}
];
}
- (void)setupPublicChatGroupsIfNeeded
{ {
if (self.lokiPublicChatPoller != nil) { return; } NSArray *chats = [self publicChats];
self.lokiPublicChatPoller = [[LKGroupChatPoller alloc] initForGroup:(NSUInteger)LKGroupChatAPI.publicChatID onServer:LKGroupChatAPI.publicChatServer]; NSString *ourPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey;
BOOL isPublicChatSetUp = [NSUserDefaults.standardUserDefaults boolForKey:@"isPublicChatSetUp"]; for (NSDictionary *chat in chats) {
if (isPublicChatSetUp) { return; } NSString *chatID = [chat objectForKey:kChatID];
NSString *title = NSLocalizedString(@"Loki Public Chat", @""); BOOL closable = [[chat objectForKey:kChatClosable] boolValue];
NSData *groupID = [[[LKGroupChatAPI.publicChatServer stringByAppendingString:@"."] stringByAppendingString:@(LKGroupChatAPI.publicChatID).stringValue] dataUsingEncoding:NSUTF8StringEncoding];
TSGroupModel *group = [[TSGroupModel alloc] initWithTitle:title memberIds:@[ OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey, LKGroupChatAPI.publicChatServer ] image:nil groupId:groupID]; NSString *setupKey = [@"setup-" stringByAppendingString:chatID];
if (closable) {
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]];
__block TSGroupThread *thread; __block TSGroupThread *thread;
[OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [OWSPrimaryStorage.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
thread = [TSGroupThread getOrCreateThreadWithGroupModel:group transaction:transaction]; thread = [TSGroupThread getOrCreateThreadWithGroupModel:group transaction:transaction];
@ -1505,8 +1552,33 @@ static NSTimeInterval launchStartedAt;
NSDate *date = [calendar dateByAddingComponents:dateComponents toDate:[NSDate new] options:0]; NSDate *date = [calendar dateByAddingComponents:dateComponents toDate:[NSDate new] options:0];
[thread updateWithMutedUntilDate:date transaction:transaction]; [thread updateWithMutedUntilDate:date transaction:transaction];
}]; }];
[OWSProfileManager.sharedManager addThreadToProfileWhitelist:thread]; [OWSProfileManager.sharedManager addThreadToProfileWhitelist:thread];
[NSUserDefaults.standardUserDefaults setBool:YES forKey:@"isPublicChatSetUp"]; if (closable) {
[NSUserDefaults.standardUserDefaults setBool:YES forKey:setupKey];
}
}
}
- (void)setUpPublicChatIfNeeded
{
static dispatch_once_t groupChatSetup;
dispatch_once(&groupChatSetup, ^{
[self setupPublicChatGroupsIfNeeded];
});
[self setupPublicChatPollersIfNeeded];
}
- (void)setupPublicChatPollersIfNeeded
{
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"];
}]];
self.lokiPublicChatPoller = [[LKGroupChatPoller alloc] initWithGroups:publicChats];
}
} }
- (void)startPublicChatPollingIfNeeded - (void)startPublicChatPollingIfNeeded

@ -1,8 +1,12 @@
private let kChatID = "PublicChatID"
private let kChatChannelID = "PublicChatChannelID"
private let kChatName = "PublicChatName"
private let kServerURL = "PublicChatServerURL"
@objc(LKGroupChatPoller) @objc(LKGroupChatPoller)
public final class LokiGroupChatPoller : NSObject { public final class LokiGroupChatPoller : NSObject {
private let group: UInt private let groups: [[String: Any]]
private let server: String
private var pollForNewMessagesTimer: Timer? = nil private var pollForNewMessagesTimer: Timer? = nil
private var pollForDeletedMessagesTimer: Timer? = nil private var pollForDeletedMessagesTimer: Timer? = nil
private var hasStarted = false private var hasStarted = false
@ -10,10 +14,8 @@ public final class LokiGroupChatPoller : NSObject {
private let pollForNewMessagesInterval: TimeInterval = 4 private let pollForNewMessagesInterval: TimeInterval = 4
private let pollForDeletedMessagesInterval: TimeInterval = 120 private let pollForDeletedMessagesInterval: TimeInterval = 120
@objc(initForGroup:onServer:) @objc public init(groups: [[String: Any]]) {
public init(for group: UInt, on server: String) { self.groups = groups
self.group = group
self.server = server
super.init() super.init()
} }
@ -31,13 +33,28 @@ public final class LokiGroupChatPoller : NSObject {
} }
private func pollForNewMessages() { private func pollForNewMessages() {
let group = self.group for group in groups {
let server = self.server guard let channelID = group[kChatChannelID] as? UInt, let server = group[kServerURL] as? String else {
let _ = LokiGroupChatAPI.getMessages(for: group, on: server).map { messages in Logger.info("[Loki] Failed to get channel id or server url from group: \(group)")
messages.reversed().map { message in return
let id = "\(server).\(group)".data(using: String.Encoding.utf8)! }
LokiGroupChatAPI.getMessages(for: channelID, on: 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
}
messages.reversed().forEach { message in
let id = groupID.data(using: String.Encoding.utf8)!
let x1 = SSKProtoGroupContext.builder(id: id, type: .deliver) let x1 = SSKProtoGroupContext.builder(id: id, type: .deliver)
x1.setName(NSLocalizedString("Loki Public Chat", comment: "")) x1.setName(groupName)
let x2 = SSKProtoDataMessage.builder() let x2 = SSKProtoDataMessage.builder()
x2.setTimestamp(message.timestamp) x2.setTimestamp(message.timestamp)
x2.setGroup(try! x1.build()) x2.setGroup(try! x1.build())
@ -57,7 +74,6 @@ public final class LokiGroupChatPoller : NSObject {
} }
} }
} }
}
private func pollForDeletedMessages() { private func pollForDeletedMessages() {
// TODO: Implement // TODO: Implement

Loading…
Cancel
Save