From cd6ad75ee655d4c4c3695d4fc0c8e5e8350cf38c Mon Sep 17 00:00:00 2001 From: Mikunj Date: Thu, 12 Sep 2019 13:59:57 +1000 Subject: [PATCH] Added new moderator polling. --- Signal/src/Loki/LokiGroupChatPoller.swift | 20 ++++------- .../src/Loki/API/LokiGroupChatAPI.swift | 34 +++++++++++++++++++ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/Signal/src/Loki/LokiGroupChatPoller.swift b/Signal/src/Loki/LokiGroupChatPoller.swift index 767a01c9c..4a0b5108f 100644 --- a/Signal/src/Loki/LokiGroupChatPoller.swift +++ b/Signal/src/Loki/LokiGroupChatPoller.swift @@ -4,14 +4,14 @@ public final class LokiGroupChatPoller : NSObject { private let group: LokiGroupChat private var pollForNewMessagesTimer: Timer? = nil private var pollForDeletedMessagesTimer: Timer? = nil - private var pollForModerationPermissionTimer: Timer? = nil + private var pollForModeratorsTimer: Timer? = nil private var hasStarted = false private let userHexEncodedPublicKey = OWSIdentityManager.shared().identityKeyPair()!.hexEncodedPublicKey // MARK: Settings private let pollForNewMessagesInterval: TimeInterval = 4 private let pollForDeletedMessagesInterval: TimeInterval = 20 - private let pollForModerationPermissionInterval: TimeInterval = 10 * 60 + private let pollForModeratorsInterval: TimeInterval = 10 * 60 // MARK: Lifecycle @objc(initForGroup:) @@ -24,18 +24,18 @@ public final class LokiGroupChatPoller : NSObject { if hasStarted { return } pollForNewMessagesTimer = Timer.scheduledTimer(withTimeInterval: pollForNewMessagesInterval, repeats: true) { [weak self] _ in self?.pollForNewMessages() } pollForDeletedMessagesTimer = Timer.scheduledTimer(withTimeInterval: pollForDeletedMessagesInterval, repeats: true) { [weak self] _ in self?.pollForDeletedMessages() } - pollForModerationPermissionTimer = Timer.scheduledTimer(withTimeInterval: pollForModerationPermissionInterval, repeats: true) { [weak self] _ in self?.pollForModerationPermission() } + pollForModeratorsTimer = Timer.scheduledTimer(withTimeInterval: pollForModeratorsInterval, repeats: true) { [weak self] _ in self?.pollForModerators() } // Perform initial updates pollForNewMessages() pollForDeletedMessages() - pollForModerationPermission() + pollForModerators() hasStarted = true } @objc public func stop() { pollForNewMessagesTimer?.invalidate() pollForDeletedMessagesTimer?.invalidate() - pollForModerationPermissionTimer?.invalidate() + pollForModeratorsTimer?.invalidate() hasStarted = false } @@ -140,13 +140,7 @@ public final class LokiGroupChatPoller : NSObject { } } - private func pollForModerationPermission() { - let group = self.group - let _ = LokiGroupChatAPI.userHasModerationPermission(for: group.serverID, on: group.server).done { isModerator in - let storage = OWSPrimaryStorage.shared() - storage.dbReadWriteConnection.readWrite { transaction in - storage.setIsModerator(isModerator, for: UInt(group.serverID), on: group.server, in: transaction) - } - } + private func pollForModerators() { + let _ = LokiGroupChatAPI.getModerators(for: self.group.serverID, on: self.group.server) } } diff --git a/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift b/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift index 3bc8e638d..4fdae54a6 100644 --- a/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiGroupChatAPI.swift @@ -13,6 +13,14 @@ public final class LokiGroupChatAPI : NSObject { @objc public static let publicChatMessageType = "network.loki.messenger.publicChat" @objc public static let publicChatServerID: UInt64 = 1 + // Mark: Moderators + typealias ModeratorArray = Set + typealias ChannelDictionary = [UInt64 : ModeratorArray] + typealias ServerMapping = [String : ChannelDictionary] + + // A mapping from server to channel to moderator + private static var moderators = ServerMapping() + // MARK: Convenience private static var userDisplayName: String { return SSKEnvironment.shared.contactsManager.displayName(forPhoneIdentifier: userHexEncodedPublicKey) ?? "Anonymous" @@ -251,6 +259,32 @@ public final class LokiGroupChatAPI : NSObject { } } + public static func isUserModerator(user hexEncodedPublicString: String, for group: UInt64, on server: String) -> Bool { + return self.moderators[server]?[group]?.contains(hexEncodedPublicString) ?? false + } + + public static func getModerators(for group: UInt64, on server: String) -> Promise> { + let url = URL(string: "\(server)/loki/v1/channel/\(group)/get_moderators")! + let request = TSRequest(url: url) + return TSNetworkManager.shared().makePromise(request: request).map { $0.responseObject }.map { rawResponse in + guard let json = rawResponse as? JSON, let moderators = json["moderators"] as? [String] else { + print("[Loki] Couldn't parse moderators for group chat with ID: \(group) on server: \(server) from: \(rawResponse).") + throw Error.parsingFailed + } + + let moderatorSet = Set(moderators); + + // Update our cache + if (self.moderators.keys.contains(server)) { + self.moderators[server]![group] = moderatorSet + } else { + self.moderators[server] = [group : moderatorSet] + } + + return moderatorSet + } + } + // MARK: Public API (Obj-C) @objc(getMessagesForGroup:onServer:) public static func objc_getMessages(for group: UInt64, on server: String) -> AnyPromise {