Swiftgram/submodules/TelegramCore/Sources/State/PremiumRequiredToContact.swift
2024-01-23 19:08:59 +01:00

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)
}
}
}