diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index 67dcff4c0..4d4224917 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -2,7 +2,7 @@ import PromiseKit @objc(LKAPI) public final class LokiAPI : NSObject { - private static var lastDeviceLinkUpdate: [String:Date] = [:] // Hex encoded public key to date + public static var lastDeviceLinkUpdate: [String:Date] = [:] // Hex encoded public key to date @objc public static var userHexEncodedPublicKeyCache: [String:Set] = [:] // Thread ID to set of user hex encoded public keys // MARK: Convenience @@ -14,12 +14,12 @@ public final class LokiAPI : NSObject { private static let maxRetryCount: UInt = 8 private static let defaultTimeout: TimeInterval = 20 private static let longPollingTimeout: TimeInterval = 40 - private static let deviceLinkUpdateInterval: TimeInterval = 60 private static let receivedMessageHashValuesKey = "receivedMessageHashValuesKey" private static let receivedMessageHashValuesCollection = "receivedMessageHashValuesCollection" private static var userIDScanLimit: UInt = 4096 internal static var powDifficulty: UInt = 4 public static let defaultMessageTTL: UInt64 = 24 * 60 * 60 * 1000 + public static let deviceLinkUpdateInterval: TimeInterval = 60 // MARK: Types public typealias RawResponse = Any diff --git a/SignalServiceKit/src/Loki/API/LokiStorageAPI.swift b/SignalServiceKit/src/Loki/API/LokiStorageAPI.swift index 933f2bfb7..eeb137968 100644 --- a/SignalServiceKit/src/Loki/API/LokiStorageAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiStorageAPI.swift @@ -23,7 +23,7 @@ public final class LokiStorageAPI : LokiDotNetAPI { /// Gets the device links associated with the given hex encoded public keys from the /// server and stores and returns the valid ones. - public static func getDeviceLinks(associatedWith hexEncodedPublicKeys: [String]) -> Promise> { + public static func getDeviceLinks(associatedWith hexEncodedPublicKeys: Set) -> Promise> { print("[Loki] Getting device links for: \(hexEncodedPublicKeys).") return getAuthToken(for: server).then(on: DispatchQueue.global()) { token -> Promise> in let queryParameters = "ids=\(hexEncodedPublicKeys.map { "@\($0)" }.joined(separator: ","))&include_user_annotations=1" diff --git a/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift b/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift index 35c8f44ca..f6cc39efe 100644 --- a/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift +++ b/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift @@ -46,10 +46,16 @@ public final class LokiPublicChatPoller : NSObject { let userHexEncodedPublicKey = self.userHexEncodedPublicKey // Processing logic for incoming messages func processIncomingMessage(_ message: LokiPublicChatMessage) { - let senderHexEncodedPublicKey = message.hexEncodedPublicKey + let storage = OWSPrimaryStorage.shared() + var senderHexEncodedPublicKey = "" + storage.dbReadConnection.read { transaction in + senderHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: message.hexEncodedPublicKey, in: transaction) ?? message.hexEncodedPublicKey + } let endIndex = senderHexEncodedPublicKey.endIndex let cutoffIndex = senderHexEncodedPublicKey.index(endIndex, offsetBy: -8) - let senderDisplayName = "\(message.displayName) (...\(senderHexEncodedPublicKey[cutoffIndex.. LokiAPI.deviceLinkUpdateInterval + } + if !hexEncodedPublicKeysToUpdate.isEmpty { + let storage = OWSPrimaryStorage.shared() + storage.dbReadConnection.read { transaction in + LokiStorageAPI.getDeviceLinks(associatedWith: hexEncodedPublicKeysToUpdate).done(on: DispatchQueue.global()) { _ in + proceed() + hexEncodedPublicKeysToUpdate.forEach { + LokiAPI.lastDeviceLinkUpdate[$0] = Date() + } + }.catch(on: DispatchQueue.global()) { error in + if case LokiDotNetAPI.Error.parsingFailed = error { + // Don't immediately re-fetch in case of failure due to a parsing error + hexEncodedPublicKeysToUpdate.forEach { + LokiAPI.lastDeviceLinkUpdate[$0] = Date() + } + } + proceed() + } } + } else { + proceed() } } }