mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Merge commit '5e842163468fc91e3e22ab243415574b62b406de'
This commit is contained in:
@@ -77,3 +77,66 @@ func _internal_resolvePeerByName(account: Account, name: String, ageLimit: Int32
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private let resolvedByPhonePeersCollectionSpec = ItemCacheCollectionSpec(lowWaterItemCount: 150, highWaterItemCount: 200)
|
||||
|
||||
func _internal_resolvePeerByPhone(account: Account, phone: String, ageLimit: Int32 = 2 * 60 * 60 * 24) -> Signal<PeerId?, NoError> {
|
||||
var normalizedPhone = phone
|
||||
if normalizedPhone.hasPrefix("+") {
|
||||
normalizedPhone = String(normalizedPhone[normalizedPhone.index(after: normalizedPhone.startIndex)...])
|
||||
}
|
||||
|
||||
return account.postbox.transaction { transaction -> CachedResolvedByPhonePeer? in
|
||||
return transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.resolvedByPhonePeers, key: CachedResolvedByPhonePeer.key(name: normalizedPhone)))?.get(CachedResolvedByPhonePeer.self)
|
||||
} |> mapToSignal { cachedEntry -> Signal<PeerId?, NoError> in
|
||||
let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970)
|
||||
if let cachedEntry = cachedEntry, cachedEntry.timestamp <= timestamp && cachedEntry.timestamp >= timestamp - ageLimit {
|
||||
return .single(cachedEntry.peerId)
|
||||
} else {
|
||||
return account.network.request(Api.functions.contacts.resolvePhone(phone: normalizedPhone))
|
||||
|> mapError { _ -> Void in
|
||||
return Void()
|
||||
}
|
||||
|> mapToSignal { result -> Signal<PeerId?, Void> in
|
||||
return account.postbox.transaction { transaction -> PeerId? in
|
||||
var peerId: PeerId? = nil
|
||||
|
||||
switch result {
|
||||
case let .resolvedPeer(apiPeer, chats, users):
|
||||
var peers: [PeerId: Peer] = [:]
|
||||
|
||||
for user in users {
|
||||
if let user = TelegramUser.merge(transaction.getPeer(user.peerId) as? TelegramUser, rhs: user) {
|
||||
peers[user.id] = user
|
||||
}
|
||||
}
|
||||
|
||||
for chat in chats {
|
||||
if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) {
|
||||
peers[groupOrChannel.id] = groupOrChannel
|
||||
}
|
||||
}
|
||||
|
||||
if let peer = peers[apiPeer.peerId] {
|
||||
peerId = peer.id
|
||||
|
||||
updatePeers(transaction: transaction, peers: Array(peers.values), update: { _, updated -> Peer in
|
||||
return updated
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970)
|
||||
if let entry = CodableEntry(CachedResolvedByPhonePeer(peerId: peerId, timestamp: timestamp)) {
|
||||
transaction.putItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.resolvedByPhonePeers, key: CachedResolvedByPhonePeer.key(name: normalizedPhone)), entry: entry, collectionSpec: resolvedByNamePeersCollectionSpec)
|
||||
}
|
||||
return peerId
|
||||
}
|
||||
|> castError(Void.self)
|
||||
}
|
||||
|> `catch` { _ -> Signal<PeerId?, NoError> in
|
||||
return .single(nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,6 +97,18 @@ public extension TelegramEngine {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func resolvePeerByPhone(phone: String, ageLimit: Int32 = 2 * 60 * 60 * 24) -> Signal<EnginePeer?, NoError> {
|
||||
return _internal_resolvePeerByPhone(account: self.account, phone: phone, ageLimit: ageLimit)
|
||||
|> mapToSignal { peerId -> Signal<EnginePeer?, NoError> in
|
||||
guard let peerId = peerId else {
|
||||
return .single(nil)
|
||||
}
|
||||
return self.account.postbox.transaction { transaction -> EnginePeer? in
|
||||
return transaction.getPeer(peerId).flatMap(EnginePeer.init)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func updatedRemotePeer(peer: PeerReference) -> Signal<Peer, UpdatedRemotePeerError> {
|
||||
return _internal_updatedRemotePeer(postbox: self.account.postbox, network: self.account.network, peer: peer)
|
||||
|
||||
Reference in New Issue
Block a user