SiriIntents: match added Telegram contacts without phone number

This commit is contained in:
Ilya Laktyushin 2019-08-11 23:41:46 +03:00
parent d4247feacb
commit 1540c1105c
2 changed files with 38 additions and 36 deletions

View File

@ -10,18 +10,33 @@ struct MatchingDeviceContact {
let firstName: String let firstName: String
let lastName: String let lastName: String
let phoneNumbers: [String] let phoneNumbers: [String]
let peerId: PeerId?
} }
enum IntentContactsError { enum IntentContactsError {
case generic case generic
} }
private let phonebookUsernamePathPrefix = "@id"
private let phonebookUsernamePrefix = "https://t.me/" + phonebookUsernamePathPrefix
private func parseAppSpecificContactReference(_ value: String) -> PeerId? {
if !value.hasPrefix(phonebookUsernamePrefix) {
return nil
}
let idString = String(value[value.index(value.startIndex, offsetBy: phonebookUsernamePrefix.count)...])
if let id = Int32(idString) {
return PeerId(namespace: Namespaces.Peer.CloudUser, id: id)
}
return nil
}
func matchingDeviceContacts(stableIds: [String]) -> Signal<[MatchingDeviceContact], IntentContactsError> { func matchingDeviceContacts(stableIds: [String]) -> Signal<[MatchingDeviceContact], IntentContactsError> {
guard CNContactStore.authorizationStatus(for: .contacts) == .authorized else { guard CNContactStore.authorizationStatus(for: .contacts) == .authorized else {
return .fail(.generic) return .fail(.generic)
} }
let store = CNContactStore() let store = CNContactStore()
guard let contacts = try? store.unifiedContacts(matching: CNContact.predicateForContacts(withIdentifiers: stableIds), keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey as CNKeyDescriptor]) else { guard let contacts = try? store.unifiedContacts(matching: CNContact.predicateForContacts(withIdentifiers: stableIds), keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: .fullName), CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactUrlAddressesKey as CNKeyDescriptor]) else {
return .fail(.generic) return .fail(.generic)
} }
@ -34,7 +49,14 @@ func matchingDeviceContacts(stableIds: [String]) -> Signal<[MatchingDeviceContac
} }
}) })
return MatchingDeviceContact(stableId: contact.identifier, firstName: contact.givenName, lastName: contact.familyName, phoneNumbers: phoneNumbers) var contactPeerId: PeerId?
for address in contact.urlAddresses {
if address.label == "Telegram", let peerId = parseAppSpecificContactReference(address.value as String) {
contactPeerId = peerId
}
}
return MatchingDeviceContact(stableId: contact.identifier, firstName: contact.givenName, lastName: contact.familyName, phoneNumbers: phoneNumbers, peerId: contactPeerId)
})) }))
} }
@ -52,7 +74,8 @@ func matchingCloudContacts(postbox: Postbox, contacts: [MatchingDeviceContact])
return postbox.transaction { transaction -> [(String, TelegramUser)] in return postbox.transaction { transaction -> [(String, TelegramUser)] in
var result: [(String, TelegramUser)] = [] var result: [(String, TelegramUser)] = []
outer: for peerId in transaction.getContactPeerIds() { outer: for peerId in transaction.getContactPeerIds() {
if let peer = transaction.getPeer(peerId) as? TelegramUser, let peerPhoneNumber = peer.phone { if let peer = transaction.getPeer(peerId) as? TelegramUser {
if let peerPhoneNumber = peer.phone {
for contact in contacts { for contact in contacts {
for phoneNumber in contact.phoneNumbers { for phoneNumber in contact.phoneNumbers {
if matchPhoneNumbers(phoneNumber, peerPhoneNumber) { if matchPhoneNumbers(phoneNumber, peerPhoneNumber) {
@ -61,35 +84,14 @@ func matchingCloudContacts(postbox: Postbox, contacts: [MatchingDeviceContact])
} }
} }
} }
// var parsedPhoneNumbers: [String: ParsedPhoneNumber] = [:] } else {
// let parsedPeerPhoneNumber: ParsedPhoneNumber? for contact in contacts {
// if let number = parsedPhoneNumbers[peerPhoneNumber] { if let contactPeerId = contact.peerId, contactPeerId == peerId {
// parsedPeerPhoneNumber = number result.append((contact.stableId, peer))
// } else if let number = ParsedPhoneNumber(string: peerPhoneNumber) { continue outer
// parsedPeerPhoneNumber = number }
// parsedPhoneNumbers[peerPhoneNumber] = number }
// } else { }
// parsedPeerPhoneNumber = nil
// }
//
// for contact in contacts {
// for phoneNumber in contact.phoneNumbers {
// let parsedPhoneNumber: ParsedPhoneNumber?
// if let number = parsedPhoneNumbers[phoneNumber] {
// parsedPhoneNumber = number
// } else if let number = ParsedPhoneNumber(string: phoneNumber) {
// parsedPhoneNumber = number
// parsedPhoneNumbers[phoneNumber] = number
// } else {
// parsedPhoneNumber = nil
// }
//
// if parsedPeerPhoneNumber == parsedPhoneNumber {
// result.append((contact.stableId, peer))
// continue outer
// }
// }
// }
} }
} }
return result return result

View File

@ -12,7 +12,7 @@
static const char *AMQueueSpecific = "AMQueueSpecific"; static const char *AMQueueSpecific = "AMQueueSpecific";
const NSInteger TGBridgeAudioEncoderSampleRate = 16000; const NSInteger TGBridgeAudioEncoderSampleRate = 48000;
typedef enum { typedef enum {
ATQueuePriorityLow, ATQueuePriorityLow,