Swiftgram/TelegramCore/SearchPeers.swift
2016-12-16 20:32:40 +03:00

58 lines
2.3 KiB
Swift

import Foundation
#if os(macOS)
import PostboxMac
import SwiftSignalKitMac
import MtProtoKitMac
#else
import Postbox
import SwiftSignalKit
import MtProtoKitDynamic
#endif
public func searchPeers(account: Account, query: String) -> Signal<[Peer], NoError> {
let searchResult = account.network.request(Api.functions.contacts.search(q: query, limit: 10))
|> retryRequest
let processedSearchResult = searchResult
|> mapToSignal { result -> Signal<[Peer], NoError> in
switch result {
case let .found(results, chats, users):
return account.postbox.modify { modifier -> [Peer] in
var peers: [PeerId: Peer] = [:]
for user in users {
if let user = TelegramUser.merge(modifier.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
}
}
var renderedPeers: [Peer] = []
for result in results {
let peerId: PeerId
switch result {
case let .peerUser(userId):
peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: userId)
case let .peerChat(chatId):
peerId = PeerId(namespace: Namespaces.Peer.CloudGroup, id: chatId)
case let .peerChannel(channelId):
peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId)
}
if let peer = peers[peerId] {
renderedPeers.append(peer)
}
}
return renderedPeers
}
}
}
return processedSearchResult
}