import Foundation import Postbox import SwiftSignalKit import TelegramApi import MtProtoKit import SyncCore public func requestBlockedPeers(account: Account) -> Signal<[Peer], NoError> { return account.network.request(Api.functions.contacts.getBlocked(offset: 0, limit: 100)) |> retryRequest |> mapToSignal { result -> Signal<[Peer], NoError> in return account.postbox.transaction { transaction -> [Peer] in var peers: [Peer] = [] let apiUsers: [Api.User] let apiChats: [Api.Chat] switch result { case let .blocked(_, chats, users): apiUsers = users apiChats = chats case let .blockedSlice(_, _, chats, users): apiUsers = users apiChats = chats } for chat in apiChats { if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) { peers.append(groupOrChannel) } } for user in apiUsers { let parsed = TelegramUser(user: user) peers.append(parsed) } updatePeers(transaction: transaction, peers: peers, update: { _, updated in return updated }) return peers } } } public func requestUpdatePeerIsBlocked(account: Account, peerId: PeerId, isBlocked: Bool) -> Signal { return account.postbox.transaction { transaction -> Signal in if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) { let signal: Signal if isBlocked { signal = account.network.request(Api.functions.contacts.block(id: inputPeer)) } else { signal = account.network.request(Api.functions.contacts.unblock(id: inputPeer)) } return signal |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) } |> mapToSignal { result -> Signal in return account.postbox.transaction { transaction -> Void in if result != nil { transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in let previous: CachedUserData if let current = current as? CachedUserData { previous = current } else { previous = CachedUserData() } return previous.withUpdatedIsBlocked(isBlocked) }) } } } } else { return .complete() } } |> switchToLatest }