diff --git a/submodules/TelegramCore/Sources/State/PremiumRequiredToContact.swift b/submodules/TelegramCore/Sources/State/PremiumRequiredToContact.swift index a3f6546aa0..e2d26348bf 100644 --- a/submodules/TelegramCore/Sources/State/PremiumRequiredToContact.swift +++ b/submodules/TelegramCore/Sources/State/PremiumRequiredToContact.swift @@ -3,40 +3,54 @@ import Postbox import TelegramApi internal func _internal_updateIsPremiumRequiredToContact(account: Account, peerIds: [EnginePeer.Id]) -> Signal<[EnginePeer.Id], NoError> { - return account.postbox.transaction { transaction -> [Api.InputUser] in + return account.postbox.transaction { transaction -> ([Api.InputUser], [PeerId]) in var inputUsers: [Api.InputUser] = [] + var premiumRequired:[EnginePeer.Id] = [] for id in peerIds { if let peer = transaction.getPeer(id), let inputUser = apiInputUser(peer) { - inputUsers.append(inputUser) - } - } - return inputUsers - } |> mapToSignal { inputUsers -> Signal<[EnginePeer.Id], NoError> in - return account.network.request(Api.functions.users.getIsPremiumRequiredToContact(id: inputUsers)) - |> retryRequest - |> mapToSignal { result in - return account.postbox.transaction { transaction in - var requiredPeerIds: [EnginePeer.Id] = [] - for (i, req) in result.enumerated() { - let peerId = peerIds[i] - let required = req == .boolTrue - transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, cachedData in - let data = cachedData as? CachedUserData ?? CachedUserData() - var flags = data.flags - if required { - flags.insert(.premiumRequired) - } else { - flags.remove(.premiumRequired) - } - return data.withUpdatedFlags(flags) - }) - if required { - requiredPeerIds.append(peerId) + if let cachedData = transaction.getPeerCachedData(peerId: id) as? CachedUserData { + if cachedData.flags.contains(.premiumRequired) { + premiumRequired.append(id) } + } else { + inputUsers.append(inputUser) } - - return requiredPeerIds } } + return (inputUsers, premiumRequired) + } |> mapToSignal { inputUsers, premiumRequired -> Signal<[EnginePeer.Id], NoError> in + + if !inputUsers.isEmpty { + return account.network.request(Api.functions.users.getIsPremiumRequiredToContact(id: inputUsers)) + |> retryRequest + |> mapToSignal { result in + return account.postbox.transaction { transaction in + var requiredPeerIds: [EnginePeer.Id] = [] + for (i, req) in result.enumerated() { + let peerId = peerIds[i] + let required = req == .boolTrue + transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, cachedData in + let data = cachedData as? CachedUserData ?? CachedUserData() + var flags = data.flags + if required { + flags.insert(.premiumRequired) + } else { + flags.remove(.premiumRequired) + } + return data.withUpdatedFlags(flags) + }) + if required { + requiredPeerIds.append(peerId) + } + } + let result = requiredPeerIds + premiumRequired + return result + } + } + } else { + return .single(premiumRequired) + } + + } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Data/TelegramEngineData.swift b/submodules/TelegramCore/Sources/TelegramEngine/Data/TelegramEngineData.swift index 87d5c3390f..f7cd00b788 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Data/TelegramEngineData.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Data/TelegramEngineData.swift @@ -340,6 +340,55 @@ public extension TelegramEngine { } } + public func subscribe< + T0: TelegramEngineDataItem, + T1: TelegramEngineDataItem, + T2: TelegramEngineDataItem, + T3: TelegramEngineDataItem, + T4: TelegramEngineDataItem, + T5: TelegramEngineDataItem, + T6: TelegramEngineDataItem + >( + _ t0: T0, + _ t1: T1, + _ t2: T2, + _ t3: T3, + _ t4: T4, + _ t5: T5, + _ t6: T6 + ) -> Signal< + ( + T0.Result, + T1.Result, + T2.Result, + T3.Result, + T4.Result, + T5.Result, + T6.Result + ), + NoError> { + return self._subscribe(items: [ + t0 as! AnyPostboxViewDataItem, + t1 as! AnyPostboxViewDataItem, + t2 as! AnyPostboxViewDataItem, + t3 as! AnyPostboxViewDataItem, + t4 as! AnyPostboxViewDataItem, + t5 as! AnyPostboxViewDataItem, + t6 as! AnyPostboxViewDataItem + ]) + |> map { results -> (T0.Result, T1.Result, T2.Result, T3.Result, T4.Result, T5.Result, T6.Result) in + return ( + results[0] as! T0.Result, + results[1] as! T1.Result, + results[2] as! T2.Result, + results[3] as! T3.Result, + results[4] as! T4.Result, + results[5] as! T5.Result, + results[6] as! T6.Result + ) + } + } + public func get< T0: TelegramEngineDataItem, T1: TelegramEngineDataItem