Swiftgram/submodules/TelegramCore/Sources/SearchGroupMembers.swift
2019-11-01 17:11:12 +04:00

70 lines
2.6 KiB
Swift

import Foundation
import Postbox
import SwiftSignalKit
import SyncCore
private func searchLocalGroupMembers(postbox: Postbox, peerId: PeerId, query: String) -> Signal<[Peer], NoError> {
return peerParticipants(postbox: postbox, id: peerId)
|> map { peers -> [Peer] in
let normalizedQuery = query.lowercased()
if normalizedQuery.isEmpty {
return peers
}
return peers.filter { peer in
if peer.debugDisplayTitle.isEmpty {
return false
}
if peer.indexName.matchesByTokens(normalizedQuery) {
return true
}
if let addressName = peer.addressName, addressName.lowercased().hasPrefix(normalizedQuery) {
return true
}
return false
}
}
}
public func searchGroupMembers(postbox: Postbox, network: Network, accountPeerId: PeerId, peerId: PeerId, query: String) -> Signal<[Peer], NoError> {
if peerId.namespace == Namespaces.Peer.CloudChannel && !query.isEmpty {
return searchLocalGroupMembers(postbox: postbox, peerId: peerId, query: query)
|> mapToSignal { local -> Signal<[Peer], NoError> in
let localResult: Signal<[Peer], NoError>
if local.isEmpty {
localResult = .complete()
} else {
localResult = .single(local)
}
return localResult
|> then(
channelMembers(postbox: postbox, network: network, accountPeerId: accountPeerId, peerId: peerId, category: .recent(.search(query)))
|> map { participants -> [Peer] in
var result: [Peer] = local
let existingIds = Set(local.map { $0.id })
let filtered: [Peer]
if let participants = participants {
filtered = participants.map({ $0.peer }).filter({ peer in
if existingIds.contains(peer.id) {
return false
}
if peer.debugDisplayTitle.isEmpty {
return false
}
return true
})
} else {
filtered = []
}
result.append(contentsOf: filtered)
return result
}
)
}
} else {
return searchLocalGroupMembers(postbox: postbox, peerId: peerId, query: query)
}
}