Add additional usernames indexing

This commit is contained in:
Ilya Laktyushin 2022-10-25 01:49:10 +03:00
parent 4844818014
commit 4d1335d8c6
9 changed files with 51 additions and 34 deletions

View File

@ -599,7 +599,7 @@ public enum ContactListPeer: Equatable {
case let .peer(peer, _, _):
return peer.indexName
case let .deviceContact(_, contact):
return .personName(first: contact.firstName, last: contact.lastName, addressName: "", phoneNumber: "")
return .personName(first: contact.firstName, last: contact.lastName, addressNames: [], phoneNumber: "")
}
}

View File

@ -1679,7 +1679,8 @@ public func channelVisibilityController(context: AccountContext, updatedPresenta
action = presentationData.strings.Channel_Setup_ActivateAlertShow
}
presentControllerImpl?(textAlertController(context: context, title: title, text: text, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: action, action: {
let _ = context.engine.peers.toggleAddressNameActive(domain: .peer(peerId), name: name, active: true).start(error: { error in
let _ = (context.engine.peers.toggleAddressNameActive(domain: .peer(peerId), name: name, active: true)
|> deliverOnMainQueue).start(error: { error in
let errorText: String
switch error {
case .activeLimitReached:

View File

@ -1,27 +1,27 @@
import Foundation
public enum PeerIndexNameRepresentation: Equatable {
case title(title: String, addressName: String?)
case personName(first: String, last: String, addressName: String?, phoneNumber: String?)
case title(title: String, addressNames: [String])
case personName(first: String, last: String, addressNames: [String], phoneNumber: String?)
public var isEmpty: Bool {
switch self {
case let .title(title, addressName):
case let .title(title, addressNames):
if !title.isEmpty {
return false
}
if let addressName = addressName, !addressName.isEmpty {
if !addressNames.isEmpty {
return false
}
return true
case let .personName(first, last, addressName, phoneNumber):
case let .personName(first, last, addressNames, phoneNumber):
if !first.isEmpty {
return false
}
if !last.isEmpty {
return false
}
if let addressName = addressName, !addressName.isEmpty {
if !addressNames.isEmpty {
return false
}
if let phoneNumber = phoneNumber, !phoneNumber.isEmpty {
@ -72,16 +72,16 @@ extension PeerIndexNameRepresentation {
public var indexTokens: [ValueBoxKey] {
switch self {
case let .title(title, addressName):
case let .title(title, addressNames):
var tokens: [ValueBoxKey] = stringIndexTokens(title, transliteration: .combined)
if let addressName = addressName {
for addressName in addressNames {
tokens.append(contentsOf: stringIndexTokens(addressName, transliteration: .none))
}
return tokens
case let .personName(first, last, addressName, phoneNumber):
case let .personName(first, last, addressNames, phoneNumber):
var tokens: [ValueBoxKey] = stringIndexTokens(first, transliteration: .combined)
tokens.append(contentsOf: stringIndexTokens(last, transliteration: .combined))
if let addressName = addressName {
for addressName in addressNames {
tokens.append(contentsOf: stringIndexTokens(addressName, transliteration: .none))
}
if let phoneNumber = phoneNumber {

View File

@ -168,7 +168,11 @@ public final class TelegramChannel: Peer, Equatable {
public let usernames: [TelegramPeerUsername]
public var indexName: PeerIndexNameRepresentation {
return .title(title: self.title, addressName: self.username)
var addressNames = self.usernames.map { $0.username }
if addressNames.isEmpty, let username = self.username, !username.isEmpty {
addressNames = [username]
}
return .title(title: self.title, addressNames: addressNames)
}
public var associatedMediaIds: [MediaId]? { return nil }

View File

@ -89,7 +89,7 @@ public final class TelegramGroup: Peer, Equatable {
public let version: Int
public var indexName: PeerIndexNameRepresentation {
return .title(title: self.title, addressName: nil)
return .title(title: self.title, addressNames: [])
}
public var associatedMediaIds: [MediaId]? { return nil }

View File

@ -11,7 +11,7 @@ public final class TelegramSecretChat: Peer, Equatable {
public let messageAutoremoveTimeout: Int32?
public var indexName: PeerIndexNameRepresentation {
return .title(title: "", addressName: nil)
return .title(title: "", addressNames: [])
}
public var associatedMediaIds: [MediaId]? { return nil }

View File

@ -137,7 +137,11 @@ public final class TelegramUser: Peer, Equatable {
}
public var indexName: PeerIndexNameRepresentation {
return .personName(first: self.firstName ?? "", last: self.lastName ?? "", addressName: self.username, phoneNumber: self.phone)
var addressNames = self.usernames.map { $0.username }
if addressNames.isEmpty, let username = self.username, !username.isEmpty {
addressNames = [username]
}
return .personName(first: self.firstName ?? "", last: self.lastName ?? "", addressNames: addressNames, phoneNumber: self.phone)
}
public var associatedMediaIds: [MediaId]? {

View File

@ -222,8 +222,12 @@ func _internal_toggleAddressNameActive(account: Account, domain: AddressNameDoma
switch domain {
case .account:
return account.network.request(Api.functions.account.toggleUsername(username: name, active: active ? .boolTrue : .boolFalse), automaticFloodWait: false)
|> mapError { _ -> ToggleAddressNameActiveError in
return .generic
|> mapError { error -> ToggleAddressNameActiveError in
if error.errorDescription == "USERNAMES_ACTIVE_TOO_MUCH" {
return .activeLimitReached
} else {
return .generic
}
}
|> mapToSignal { result -> Signal<Void, ToggleAddressNameActiveError> in
return account.postbox.transaction { transaction -> Void in
@ -276,8 +280,12 @@ func _internal_toggleAddressNameActive(account: Account, domain: AddressNameDoma
case let .peer(peerId):
if let peer = transaction.getPeer(peerId), let inputChannel = apiInputChannel(peer) {
return account.network.request(Api.functions.channels.toggleUsername(channel: inputChannel, username: name, active: active ? .boolTrue : .boolFalse), automaticFloodWait: false)
|> mapError { _ -> ToggleAddressNameActiveError in
return .generic
|> mapError { error -> ToggleAddressNameActiveError in
if error.errorDescription == "USERNAMES_ACTIVE_TOO_MUCH" {
return .activeLimitReached
} else {
return .generic
}
}
|> mapToSignal { result -> Signal<Void, ToggleAddressNameActiveError> in
return account.postbox.transaction { transaction -> Void in

View File

@ -145,27 +145,27 @@ public enum EnginePeer: Equatable {
}
public enum IndexName: Equatable {
case title(title: String, addressName: String?)
case personName(first: String, last: String, addressName: String?, phoneNumber: String?)
case title(title: String, addressNames: [String])
case personName(first: String, last: String, addressNames: [String], phoneNumber: String?)
public var isEmpty: Bool {
switch self {
case let .title(title, addressName):
case let .title(title, addressNames):
if !title.isEmpty {
return false
}
if let addressName = addressName, !addressName.isEmpty {
if !addressNames.isEmpty {
return false
}
return true
case let .personName(first, last, addressName, phoneNumber):
case let .personName(first, last, addressNames, phoneNumber):
if !first.isEmpty {
return false
}
if !last.isEmpty {
return false
}
if let addressName = addressName, !addressName.isEmpty {
if !addressNames.isEmpty {
return false
}
if let phoneNumber = phoneNumber, !phoneNumber.isEmpty {
@ -396,19 +396,19 @@ public extension EnginePeer.Presence {
public extension EnginePeer.IndexName {
init(_ indexName: PeerIndexNameRepresentation) {
switch indexName {
case let .title(title, addressName):
self = .title(title: title, addressName: addressName)
case let .personName(first, last, addressName, phoneNumber):
self = .personName(first: first, last: last, addressName: addressName, phoneNumber: phoneNumber)
case let .title(title, addressNames):
self = .title(title: title, addressNames: addressNames)
case let .personName(first, last, addressNames, phoneNumber):
self = .personName(first: first, last: last, addressNames: addressNames, phoneNumber: phoneNumber)
}
}
func _asIndexName() -> PeerIndexNameRepresentation {
switch self {
case let .title(title, addressName):
return .title(title: title, addressName: addressName)
case let .personName(first, last, addressName, phoneNumber):
return .personName(first: first, last: last, addressName: addressName, phoneNumber: phoneNumber)
case let .title(title, addressNames):
return .title(title: title, addressNames: addressNames)
case let .personName(first, last, addressNames, phoneNumber):
return .personName(first: first, last: last, addressNames: addressNames, phoneNumber: phoneNumber)
}
}