mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
70 lines
3.4 KiB
Swift
70 lines
3.4 KiB
Swift
import SwiftSignalKit
|
|
import Postbox
|
|
import TelegramApi
|
|
|
|
public enum RequirementToContact {
|
|
case premium
|
|
case stars(StarsAmount)
|
|
}
|
|
|
|
internal func _internal_updateIsPremiumRequiredToContact(account: Account, peerIds: [EnginePeer.Id]) -> Signal<[EnginePeer.Id: RequirementToContact], NoError> {
|
|
return account.postbox.transaction { transaction -> ([Api.InputUser], [PeerId]) in
|
|
var inputUsers: [Api.InputUser] = []
|
|
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 let _ = cachedData.sendPaidMessageStars {
|
|
inputUsers.append(inputUser)
|
|
ids.append(id)
|
|
} else 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(.requireStars), !peer.flags.contains(.mutualContact) {
|
|
inputUsers.append(inputUser)
|
|
ids.append(id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (inputUsers, ids)
|
|
} |> mapToSignal { inputUsers, reqIds -> Signal<[EnginePeer.Id: RequirementToContact], NoError> in
|
|
if !inputUsers.isEmpty {
|
|
return account.network.request(Api.functions.users.getRequirementsToContact(id: inputUsers))
|
|
|> retryRequest
|
|
|> mapToSignal { result in
|
|
return account.postbox.transaction { transaction in
|
|
var requirements: [EnginePeer.Id: RequirementToContact] = [:]
|
|
for (i, req) in result.enumerated() {
|
|
let peerId = reqIds[i]
|
|
transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, cachedData in
|
|
let data = cachedData as? CachedUserData ?? CachedUserData()
|
|
var flags = data.flags
|
|
var sendPaidMessageStars = data.sendPaidMessageStars
|
|
switch req {
|
|
case .requirementToContactEmpty:
|
|
flags.remove(.premiumRequired)
|
|
sendPaidMessageStars = nil
|
|
case .requirementToContactPremium:
|
|
flags.insert(.premiumRequired)
|
|
sendPaidMessageStars = nil
|
|
requirements[peerId] = .premium
|
|
case let .requirementToContactPaidMessages(starsAmount):
|
|
flags.remove(.premiumRequired)
|
|
sendPaidMessageStars = StarsAmount(value: starsAmount, nanos: 0)
|
|
requirements[peerId] = .stars(StarsAmount(value: starsAmount, nanos: 0))
|
|
}
|
|
return data.withUpdatedFlags(flags).withUpdatedSendPaidMessageStars(sendPaidMessageStars)
|
|
})
|
|
}
|
|
return requirements
|
|
}
|
|
}
|
|
} else {
|
|
return .single([:])
|
|
}
|
|
}
|
|
}
|