mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
60 lines
2.7 KiB
Swift
60 lines
2.7 KiB
Swift
import SwiftSignalKit
|
|
import Postbox
|
|
import TelegramApi
|
|
|
|
internal func _internal_updateIsPremiumRequiredToContact(account: Account, peerIds: [EnginePeer.Id]) -> Signal<[EnginePeer.Id], NoError> {
|
|
return account.postbox.transaction { transaction -> ([Api.InputUser], [PeerId], [PeerId]) in
|
|
var inputUsers: [Api.InputUser] = []
|
|
let premiumRequired: [EnginePeer.Id] = []
|
|
var ids:[PeerId] = []
|
|
for id in peerIds {
|
|
if let peer = transaction.getPeer(id), let inputUser = apiInputUser(peer) {
|
|
if peer.isPremium {
|
|
if let cachedData = transaction.getPeerCachedData(peerId: id) as? CachedUserData {
|
|
if cachedData.flags.contains(.premiumRequired) {
|
|
inputUsers.append(inputUser)
|
|
ids.append(id)
|
|
}
|
|
} else if let peer = peer as? TelegramUser, peer.flags.contains(.requirePremium), !peer.flags.contains(.mutualContact) {
|
|
inputUsers.append(inputUser)
|
|
ids.append(id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (inputUsers, premiumRequired, ids)
|
|
} |> mapToSignal { inputUsers, premiumRequired, reqIds -> 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 = reqIds[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)
|
|
}
|
|
}
|
|
}
|