From 51ba97827d3004781e8020330354a4597709bd1a Mon Sep 17 00:00:00 2001 From: Brice-W Date: Mon, 24 May 2021 16:00:42 +1000 Subject: [PATCH 1/2] open group polling limit implementation --- .../Open Groups/OpenGroupAPIV2.swift | 20 +++++++++++++++++-- .../Pollers/OpenGroupPollerV2.swift | 1 + .../General/SNUserDefaults.swift | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift b/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift index 4ffadb993..e7ccbfd58 100644 --- a/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift +++ b/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift @@ -9,6 +9,15 @@ public final class OpenGroupAPIV2 : NSObject { public static var defaultRoomsPromise: Promise<[Info]>? public static var groupImagePromises: [String:Promise] = [:] + private static var hasPerformedInitialPoll: [String:Bool] = [:] + private static var hasUpdatedLastOpenDate = false + + static var timeSinceLastOpen:Double = { + let lastOpenDate = UserDefaults.standard[.lastOpenDate] + let now = Double(NSDate.millisecondTimestamp()) + return now - lastOpenDate + }() + // MARK: Settings public static let defaultServer = "http://116.203.70.33" public static let defaultServerPublicKey = "a03c383cf63c3c4efe67acc52112a6dd734b3a946b9545f488aaa93da7991238" @@ -144,14 +153,21 @@ public final class OpenGroupAPIV2 : NSObject { let rooms = storage.getAllV2OpenGroups().values.filter { $0.server == server }.map { $0.room } var body: [JSON] = [] var authTokenPromises: [String:Promise] = [:] + let timeSinceLastOpen = self.timeSinceLastOpen + let useMessageLimit = (!(hasPerformedInitialPoll[server] ?? false) && timeSinceLastOpen > OpenGroupPollerV2.maxInactivityPeriod) + hasPerformedInitialPoll[server] = true + if(!hasUpdatedLastOpenDate) { + UserDefaults.standard[.lastOpenDate] = Double(NSDate.millisecondTimestamp()) + hasUpdatedLastOpenDate = true + } for room in rooms { authTokenPromises[room] = getAuthToken(for: room, on: server) var json: JSON = [ "room_id" : room ] if let lastMessageServerID = storage.getLastMessageServerID(for: room, on: server) { - json["from_message_server_id"] = lastMessageServerID + json["from_message_server_id"] = (useMessageLimit) ? nil : lastMessageServerID } if let lastDeletionServerID = storage.getLastDeletionServerID(for: room, on: server) { - json["from_deletion_server_id"] = lastDeletionServerID + json["from_deletion_server_id"] = (useMessageLimit) ? nil : lastDeletionServerID } body.append(json) } diff --git a/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPollerV2.swift b/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPollerV2.swift index dc0d345d6..20213de7b 100644 --- a/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPollerV2.swift +++ b/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPollerV2.swift @@ -9,6 +9,7 @@ public final class OpenGroupPollerV2 : NSObject { // MARK: Settings private let pollInterval: TimeInterval = 4 + static let maxInactivityPeriod: Double = 14 * 24 * 60 * 60 * 1000 // MARK: Lifecycle public init(for server: String) { diff --git a/SessionUtilitiesKit/General/SNUserDefaults.swift b/SessionUtilitiesKit/General/SNUserDefaults.swift index 235b92d92..b5cf48718 100644 --- a/SessionUtilitiesKit/General/SNUserDefaults.swift +++ b/SessionUtilitiesKit/General/SNUserDefaults.swift @@ -18,6 +18,7 @@ public enum SNUserDefaults { public enum Double : Swift.String { case lastDeviceTokenUpload = "lastDeviceTokenUploadTime" + case lastOpenDate } public enum Int : Swift.String { From 601062c9ef6c00c62ebb462db17bca6f5b348c9b Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 24 May 2021 16:39:18 +1000 Subject: [PATCH 2/2] Fix timeSinceLastOpen usage --- .../Open Groups/OpenGroupAPIV2.swift | 24 +++++++++---------- .../Pollers/OpenGroupPollerV2.swift | 2 +- .../General/SNUserDefaults.swift | 2 +- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift b/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift index e7ccbfd58..600b6545f 100644 --- a/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift +++ b/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift @@ -4,18 +4,17 @@ import SessionSnodeKit @objc(SNOpenGroupAPIV2) public final class OpenGroupAPIV2 : NSObject { private static var authTokenPromises: [String:Promise] = [:] + private static var hasPerformedInitialPoll: [String:Bool] = [:] + private static var hasUpdatedLastOpenDate = false public static let workQueue = DispatchQueue(label: "OpenGroupAPIV2.workQueue", qos: .userInitiated) // It's important that this is a serial queue public static var moderators: [String:[String:Set]] = [:] // Server URL to room ID to set of moderator IDs public static var defaultRoomsPromise: Promise<[Info]>? public static var groupImagePromises: [String:Promise] = [:] - - private static var hasPerformedInitialPoll: [String:Bool] = [:] - private static var hasUpdatedLastOpenDate = false - static var timeSinceLastOpen:Double = { - let lastOpenDate = UserDefaults.standard[.lastOpenDate] - let now = Double(NSDate.millisecondTimestamp()) - return now - lastOpenDate + private static let timeSinceLastOpen: TimeInterval = { + guard let lastOpen = UserDefaults.standard[.lastOpen] else { return .greatestFiniteMagnitude } + let now = Date() + return now.timeIntervalSince(lastOpen) }() // MARK: Settings @@ -153,21 +152,20 @@ public final class OpenGroupAPIV2 : NSObject { let rooms = storage.getAllV2OpenGroups().values.filter { $0.server == server }.map { $0.room } var body: [JSON] = [] var authTokenPromises: [String:Promise] = [:] - let timeSinceLastOpen = self.timeSinceLastOpen - let useMessageLimit = (!(hasPerformedInitialPoll[server] ?? false) && timeSinceLastOpen > OpenGroupPollerV2.maxInactivityPeriod) + let useMessageLimit = (hasPerformedInitialPoll[server] != true && timeSinceLastOpen > OpenGroupPollerV2.maxInactivityPeriod) hasPerformedInitialPoll[server] = true - if(!hasUpdatedLastOpenDate) { - UserDefaults.standard[.lastOpenDate] = Double(NSDate.millisecondTimestamp()) + if !hasUpdatedLastOpenDate { + UserDefaults.standard[.lastOpen] = Date() hasUpdatedLastOpenDate = true } for room in rooms { authTokenPromises[room] = getAuthToken(for: room, on: server) var json: JSON = [ "room_id" : room ] if let lastMessageServerID = storage.getLastMessageServerID(for: room, on: server) { - json["from_message_server_id"] = (useMessageLimit) ? nil : lastMessageServerID + json["from_message_server_id"] = useMessageLimit ? nil : lastMessageServerID } if let lastDeletionServerID = storage.getLastDeletionServerID(for: room, on: server) { - json["from_deletion_server_id"] = (useMessageLimit) ? nil : lastDeletionServerID + json["from_deletion_server_id"] = useMessageLimit ? nil : lastDeletionServerID } body.append(json) } diff --git a/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPollerV2.swift b/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPollerV2.swift index 20213de7b..a1975197b 100644 --- a/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPollerV2.swift +++ b/SessionMessagingKit/Sending & Receiving/Pollers/OpenGroupPollerV2.swift @@ -9,7 +9,7 @@ public final class OpenGroupPollerV2 : NSObject { // MARK: Settings private let pollInterval: TimeInterval = 4 - static let maxInactivityPeriod: Double = 14 * 24 * 60 * 60 * 1000 + static let maxInactivityPeriod: Double = 14 * 24 * 60 * 60 // MARK: Lifecycle public init(for server: String) { diff --git a/SessionUtilitiesKit/General/SNUserDefaults.swift b/SessionUtilitiesKit/General/SNUserDefaults.swift index b5cf48718..8a0fad35b 100644 --- a/SessionUtilitiesKit/General/SNUserDefaults.swift +++ b/SessionUtilitiesKit/General/SNUserDefaults.swift @@ -14,11 +14,11 @@ public enum SNUserDefaults { case lastDisplayNameUpdate case lastProfilePictureUpdate case lastOpenGroupImageUpdate + case lastOpen } public enum Double : Swift.String { case lastDeviceTokenUpload = "lastDeviceTokenUploadTime" - case lastOpenDate } public enum Int : Swift.String {