import Foundation import SwiftSignalKit import Postbox public extension TelegramEngine { final class Contacts { private let account: Account init(account: Account) { self.account = account } public func deleteContactPeerInteractively(peerId: PeerId) -> Signal { return _internal_deleteContactPeerInteractively(account: self.account, peerId: peerId) } public func deleteAllContacts() -> Signal { return _internal_deleteAllContacts(account: self.account) } public func resetSavedContacts() -> Signal { return _internal_resetSavedContacts(network: self.account.network) } public func updateContactName(peerId: PeerId, firstName: String, lastName: String) -> Signal { return _internal_updateContactName(account: self.account, peerId: peerId, firstName: firstName, lastName: lastName) } public func updateContactPhoto(peerId: PeerId, resource: MediaResource?, videoResource: MediaResource?, videoStartTimestamp: Double?, markup: UploadPeerPhotoMarkup?, mode: SetCustomPeerPhotoMode, mapResourceToAvatarSizes: @escaping (MediaResource, [TelegramMediaImageRepresentation]) -> Signal<[Int: Data], NoError>) -> Signal { return _internal_updateContactPhoto(account: self.account, peerId: peerId, resource: resource, videoResource: videoResource, videoStartTimestamp: videoStartTimestamp, markup: markup, mode: mode, mapResourceToAvatarSizes: mapResourceToAvatarSizes) } public func deviceContactsImportedByCount(contacts: [(String, [DeviceContactNormalizedPhoneNumber])]) -> Signal<[String: Int32], NoError> { return _internal_deviceContactsImportedByCount(postbox: self.account.postbox, contacts: contacts) } public func importContact(firstName: String, lastName: String, phoneNumber: String) -> Signal { return _internal_importContact(account: self.account, firstName: firstName, lastName: lastName, phoneNumber: phoneNumber) } public func addContactInteractively(peerId: PeerId, firstName: String, lastName: String, phoneNumber: String, addToPrivacyExceptions: Bool) -> Signal { return _internal_addContactInteractively(account: self.account, peerId: peerId, firstName: firstName, lastName: lastName, phoneNumber: phoneNumber, addToPrivacyExceptions: addToPrivacyExceptions) } public func acceptAndShareContact(peerId: PeerId) -> Signal { return _internal_acceptAndShareContact(account: self.account, peerId: peerId) } public func searchRemotePeers(query: String) -> Signal<([FoundPeer], [FoundPeer]), NoError> { return _internal_searchPeers(account: self.account, query: query) } public func searchLocalPeers(query: String) -> Signal<[EngineRenderedPeer], NoError> { return self.account.postbox.searchPeers(query: query) |> map { peers in return peers.map(EngineRenderedPeer.init) } } public func searchContacts(query: String) -> Signal<([EnginePeer], [EnginePeer.Id: EnginePeer.Presence]), NoError> { return self.account.postbox.searchContacts(query: query) |> map { peers, presences in return (peers.map(EnginePeer.init), presences.mapValues(EnginePeer.Presence.init)) } } public func updateIsContactSynchronizationEnabled(isContactSynchronizationEnabled: Bool) -> Signal { return self.account.postbox.transaction { transaction -> Void in transaction.updatePreferencesEntry(key: PreferencesKeys.contactsSettings, { current in var settings = current?.get(ContactsSettings.self) ?? ContactsSettings.defaultSettings settings.synchronizeContacts = isContactSynchronizationEnabled return PreferencesEntry(settings) }) } |> ignoreValues } public func findPeerByLocalContactIdentifier(identifier: String) -> Signal { return self.account.postbox.transaction { transaction -> EnginePeer? in var foundPeerId: PeerId? transaction.enumerateDeviceContactImportInfoItems({ _, value in if let value = value as? TelegramDeviceContactImportedData { switch value { case let .imported(data, _, peerId): if data.localIdentifiers.contains(identifier) { if let peerId = peerId { foundPeerId = peerId return false } } default: break } } return true }) if let foundPeerId = foundPeerId { return transaction.getPeer(foundPeerId).flatMap(EnginePeer.init) } else { return nil } } } } }