diff --git a/submodules/TelegramCore/Sources/ApiUtils/TelegramUser.swift b/submodules/TelegramCore/Sources/ApiUtils/TelegramUser.swift index b14c969788..62902b77e8 100644 --- a/submodules/TelegramCore/Sources/ApiUtils/TelegramUser.swift +++ b/submodules/TelegramCore/Sources/ApiUtils/TelegramUser.swift @@ -49,6 +49,9 @@ extension TelegramUser { } var userFlags: UserInfoFlags = [] + if (flags & (1 << 12)) != 0 { + userFlags.insert(.mutualContact) + } if (flags & (1 << 17)) != 0 { userFlags.insert(.isVerified) } @@ -67,7 +70,9 @@ extension TelegramUser { if (flags2 & (1 << 2)) != 0 { userFlags.insert(.isCloseFriend) } - + if (flags2 & (1 << 6)) != 0 { + userFlags.insert(.requirePremium) + } var storiesHidden: Bool? if !isMin { storiesHidden = (flags2 & (1 << 3)) != 0 @@ -142,6 +147,9 @@ extension TelegramUser { if let lhs = lhs { var userFlags: UserInfoFlags = [] + if (flags & (1 << 12)) != 0 { + userFlags.insert(.mutualContact) + } if (flags & (1 << 17)) != 0 { userFlags.insert(.isVerified) } @@ -161,7 +169,9 @@ extension TelegramUser { if lhs.flags.contains(.isCloseFriend) { userFlags.insert(.isCloseFriend) } - + if lhs.flags.contains(.requirePremium) { + userFlags.insert(.requirePremium) + } var botInfo: BotUserInfo? if (flags & (1 << 14)) != 0 { var botFlags = BotUserInfoFlags() diff --git a/submodules/TelegramCore/Sources/State/PremiumRequiredToContact.swift b/submodules/TelegramCore/Sources/State/PremiumRequiredToContact.swift new file mode 100644 index 0000000000..a3f6546aa0 --- /dev/null +++ b/submodules/TelegramCore/Sources/State/PremiumRequiredToContact.swift @@ -0,0 +1,42 @@ +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] in + var inputUsers: [Api.InputUser] = [] + 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) + } + } + + return requiredPeerIds + } + } + } +} diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedUserData.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedUserData.swift index 7450474d34..4b93034336 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedUserData.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedUserData.swift @@ -204,6 +204,7 @@ public struct CachedUserFlags: OptionSet { public static let translationHidden = CachedUserFlags(rawValue: 1 << 0) public static let isBlockedFromStories = CachedUserFlags(rawValue: 1 << 1) public static let readDatesPrivate = CachedUserFlags(rawValue: 1 << 2) + public static let premiumRequired = CachedUserFlags(rawValue: 1 << 3) } public final class EditableBotInfo: PostboxCoding, Equatable { diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramUser.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramUser.swift index 81d610ef09..8abaa7b54d 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramUser.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramUser.swift @@ -17,6 +17,8 @@ public struct UserInfoFlags: OptionSet { public static let isFake = UserInfoFlags(rawValue: (1 << 3)) public static let isPremium = UserInfoFlags(rawValue: (1 << 4)) public static let isCloseFriend = UserInfoFlags(rawValue: (1 << 5)) + public static let requirePremium = UserInfoFlags(rawValue: (1 << 6)) + public static let mutualContact = UserInfoFlags(rawValue: (1 << 7)) } public struct BotUserInfoFlags: OptionSet { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift index a54c40408e..d0efcf1e74 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift @@ -1273,6 +1273,10 @@ public extension TelegramEngine { public func requestRecommendedChannels(peerId: EnginePeer.Id, forceUpdate: Bool = false) -> Signal { return _internal_requestRecommendedChannels(account: self.account, peerId: peerId, forceUpdate: forceUpdate) } + + public func isPremiumRequiredToContact(_ peerIds: [EnginePeer.Id]) -> Signal<[EnginePeer.Id], NoError> { + return _internal_updateIsPremiumRequiredToContact(account: self.account, peerIds: peerIds) + } } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift index 448fd0e1c4..35d7cb1735 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift @@ -236,9 +236,15 @@ func _internal_fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPee let videoCallsAvailable = (userFullFlags & (1 << 13)) != 0 let voiceMessagesAvailable = (userFullFlags & (1 << 20)) == 0 let readDatesPrivate = (userFullFlags & (1 << 30)) != 0 + let premiumRequired = (userFullFlags & (1 << 29)) != 0 let translationsDisabled = (userFullFlags & (1 << 23)) != 0 var flags: CachedUserFlags = previous.flags + if premiumRequired { + flags.insert(.premiumRequired) + } else { + flags.remove(.premiumRequired) + } if readDatesPrivate { flags.insert(.readDatesPrivate) } else {