From 5e5fefeb0f92a59f5179beb1712f9a8fd5423011 Mon Sep 17 00:00:00 2001 From: overtake Date: Fri, 29 Dec 2017 14:22:35 +0400 Subject: [PATCH 1/3] no message --- TelegramCore.xcodeproj/project.pbxproj | 1 + TelegramCore/Api.swift | 77 ++++++---- TelegramCore/ExportMessageLink.swift | 2 +- TelegramCore/SearchMessages.swift | 194 ++++++++++++++----------- TelegramCore/SearchPeers.swift | 41 ++++-- TelegramCore/Serialization.swift | 2 +- 6 files changed, 185 insertions(+), 132 deletions(-) diff --git a/TelegramCore.xcodeproj/project.pbxproj b/TelegramCore.xcodeproj/project.pbxproj index 9954255401..41c11db8eb 100644 --- a/TelegramCore.xcodeproj/project.pbxproj +++ b/TelegramCore.xcodeproj/project.pbxproj @@ -2764,6 +2764,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = NO; FRAMEWORK_VERSION = A; GCC_OPTIMIZATION_LEVEL = 0; INFOPLIST_FILE = TelegramCoreMac/Info.plist; diff --git a/TelegramCore/Api.swift b/TelegramCore/Api.swift index 865c3db939..1a1fd50ae8 100644 --- a/TelegramCore/Api.swift +++ b/TelegramCore/Api.swift @@ -461,7 +461,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1056001329] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentialsSaved($0) } dict[873977640] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentials($0) } dict[178373535] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentialsApplePay($0) } - dict[2035705766] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentialsAndroidPay($0) } + dict[-905587442] = { return Api.InputPaymentCredentials.parse_inputPaymentCredentialsAndroidPay($0) } dict[-1239335713] = { return Api.ShippingOption.parse_shippingOption($0) } dict[512535275] = { return Api.PostAddress.parse_postAddress($0) } dict[2104790276] = { return Api.DataJSON.parse_dataJSON($0) } @@ -572,7 +572,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[646922073] = { return Api.ContactLink.parse_contactLinkHasPhone($0) } dict[-721239344] = { return Api.ContactLink.parse_contactLinkContact($0) } dict[-971322408] = { return Api.WebDocument.parse_webDocument($0) } - dict[446822276] = { return Api.contacts.Found.parse_found($0) } + dict[-1290580579] = { return Api.contacts.Found.parse_found($0) } dict[-368018716] = { return Api.ChannelAdminLogEventsFilter.parse_channelAdminLogEventsFilter($0) } dict[1889961234] = { return Api.PeerNotifySettings.parse_peerNotifySettingsEmpty($0) } dict[-1697798976] = { return Api.PeerNotifySettings.parse_peerNotifySettings($0) } @@ -12430,7 +12430,7 @@ public struct Api { case inputPaymentCredentialsSaved(id: String, tmpPassword: Buffer) case inputPaymentCredentials(flags: Int32, data: Api.DataJSON) case inputPaymentCredentialsApplePay(paymentData: Api.DataJSON) - case inputPaymentCredentialsAndroidPay(paymentToken: Api.DataJSON) + case inputPaymentCredentialsAndroidPay(paymentToken: Api.DataJSON, googleTransactionId: String) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -12454,11 +12454,12 @@ public struct Api { } paymentData.serialize(buffer, true) break - case .inputPaymentCredentialsAndroidPay(let paymentToken): + case .inputPaymentCredentialsAndroidPay(let paymentToken, let googleTransactionId): if boxed { - buffer.appendInt32(2035705766) + buffer.appendInt32(-905587442) } paymentToken.serialize(buffer, true) + serializeString(googleTransactionId, buffer: buffer, boxed: false) break } } @@ -12511,9 +12512,12 @@ public struct Api { if let signature = reader.readInt32() { _1 = Api.parse(reader, signature: signature) as? Api.DataJSON } + var _2: String? + _2 = parseString(reader) let _c1 = _1 != nil - if _c1 { - return Api.InputPaymentCredentials.inputPaymentCredentialsAndroidPay(paymentToken: _1!) + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.InputPaymentCredentials.inputPaymentCredentialsAndroidPay(paymentToken: _1!, googleTransactionId: _2!) } else { return nil @@ -16702,13 +16706,18 @@ public struct Api { } public enum Found { - case found(results: [Api.Peer], chats: [Api.Chat], users: [Api.User]) + case found(myResults: [Api.Peer], results: [Api.Peer], chats: [Api.Chat], users: [Api.User]) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .found(let results, let chats, let users): + case .found(let myResults, let results, let chats, let users): if boxed { - buffer.appendInt32(446822276) + buffer.appendInt32(-1290580579) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(myResults.count)) + for item in myResults { + item.serialize(buffer, true) } buffer.appendInt32(481674261) buffer.appendInt32(Int32(results.count)) @@ -16734,19 +16743,24 @@ public struct Api { if let _ = reader.readInt32() { _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Peer.self) } - var _2: [Api.Chat]? + var _2: [Api.Peer]? if let _ = reader.readInt32() { - _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Chat.self) + _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Peer.self) } - var _3: [Api.User]? + var _3: [Api.Chat]? if let _ = reader.readInt32() { - _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) + _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Chat.self) + } + var _4: [Api.User]? + if let _ = reader.readInt32() { + _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.contacts.Found.found(results: _1!, chats: _2!, users: _3!) + let _c4 = _4 != nil + if _c1 && _c2 && _c3 && _c4 { + return Api.contacts.Found.found(myResults: _1!, results: _2!, chats: _3!, users: _4!) } else { return nil @@ -20038,21 +20052,6 @@ public struct Api { }) } - public static func exportMessageLink(channel: Api.InputChannel, id: Int32) -> (CustomStringConvertible, Buffer, (Buffer) -> Api.ExportedMessageLink?) { - let buffer = Buffer() - buffer.appendInt32(-934882771) - channel.serialize(buffer, true) - serializeInt32(id, buffer: buffer, boxed: false) - return (FunctionDescription({return "(channels.exportMessageLink channel: \(channel), id: \(id))"}), buffer, { (buffer: Buffer) -> Api.ExportedMessageLink? in - let reader = BufferReader(buffer) - var result: Api.ExportedMessageLink? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.ExportedMessageLink - } - return result - }) - } - public static func toggleSignatures(channel: Api.InputChannel, enabled: Api.Bool) -> (CustomStringConvertible, Buffer, (Buffer) -> Api.Updates?) { let buffer = Buffer() buffer.appendInt32(527021574) @@ -20236,6 +20235,22 @@ public struct Api { return result }) } + + public static func exportMessageLink(channel: Api.InputChannel, id: Int32, grouped: Api.Bool) -> (CustomStringConvertible, Buffer, (Buffer) -> Api.ExportedMessageLink?) { + let buffer = Buffer() + buffer.appendInt32(-826838685) + channel.serialize(buffer, true) + serializeInt32(id, buffer: buffer, boxed: false) + grouped.serialize(buffer, true) + return (FunctionDescription({return "(channels.exportMessageLink channel: \(channel), id: \(id), grouped: \(grouped))"}), buffer, { (buffer: Buffer) -> Api.ExportedMessageLink? in + let reader = BufferReader(buffer) + var result: Api.ExportedMessageLink? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.ExportedMessageLink + } + return result + }) + } } public struct payments { public static func getPaymentForm(msgId: Int32) -> (CustomStringConvertible, Buffer, (Buffer) -> Api.payments.PaymentForm?) { diff --git a/TelegramCore/ExportMessageLink.swift b/TelegramCore/ExportMessageLink.swift index c2ebb6a79a..a3d29078c6 100644 --- a/TelegramCore/ExportMessageLink.swift +++ b/TelegramCore/ExportMessageLink.swift @@ -13,7 +13,7 @@ public func exportMessageLink(account:Account, peerId:PeerId, messageId:MessageI return modifier.getPeer(peerId) } |> mapToSignal { peer -> Signal in if let peer = peer, let input = apiInputChannel(peer) { - return account.network.request(Api.functions.channels.exportMessageLink(channel: input, id: messageId.id)) |> mapError {_ in return } |> map { res in + return account.network.request(Api.functions.channels.exportMessageLink(channel: input, id: messageId.id, grouped: Api.Bool.boolTrue)) |> mapError {_ in return } |> map { res in switch res { case .exportedMessageLink(let link): return link diff --git a/TelegramCore/SearchMessages.swift b/TelegramCore/SearchMessages.swift index 29c86b03ff..bd23ff7b61 100644 --- a/TelegramCore/SearchMessages.swift +++ b/TelegramCore/SearchMessages.swift @@ -9,37 +9,60 @@ import Foundation import MtProtoKitDynamic #endif -public func searchMessages(account: Account, peerId: PeerId?, query: String, fromId:PeerId? = nil, tagMask: MessageTags? = nil) -> Signal<[Message], NoError> { - if let peerId = peerId, peerId.namespace == Namespaces.Peer.SecretChat { - return account.postbox.modify { modifier -> [Message] in - return modifier.searchMessages(peerId: peerId, query: query, tags: tagMask) +public enum SearchMessagesLocation: Equatable { + case general + case peer(peerId: PeerId, fromId: PeerId?, tags: MessageTags?) + + public static func ==(lhs: SearchMessagesLocation, rhs: SearchMessagesLocation) -> Bool { + switch lhs { + case .general: + if case .general = rhs { + return true + } else { + return false + } + case let .peer(lhsPeerId, lhsFromId, lhsTags): + if case let .peer(rhsPeerId, rhsFromId, rhsTags) = rhs, lhsPeerId == rhsPeerId, lhsFromId == rhsFromId, lhsTags == rhsTags { + return true + } else { + return false + } } - } else { - let searchResult: Signal - - let filter: Api.MessagesFilter - - if let tags = tagMask { - if tags.contains(.file) { - filter = .inputMessagesFilterDocument - } else if tags.contains(.music) { - filter = .inputMessagesFilterMusic - } else if tags.contains(.webPage) { - filter = .inputMessagesFilterUrl + } +} + +public func searchMessages(account: Account, location: SearchMessagesLocation, query: String) -> Signal<[Message], NoError> { + let remoteSearchResult: Signal + switch location { + case let .peer(peerId, fromId, tags): + if peerId.namespace == Namespaces.Peer.SecretChat { + return account.postbox.modify { modifier -> [Message] in + return modifier.searchMessages(peerId: peerId, query: query, tags: tags) + } + } + + let filter: Api.MessagesFilter + + if let tags = tags { + if tags.contains(.file) { + filter = .inputMessagesFilterDocument + } else if tags.contains(.music) { + filter = .inputMessagesFilterMusic + } else if tags.contains(.webPage) { + filter = .inputMessagesFilterUrl + } else { + filter = .inputMessagesFilterEmpty + } } else { filter = .inputMessagesFilterEmpty } - } else { - filter = .inputMessagesFilterEmpty - } - if let peerId = peerId { - searchResult = account.postbox.modify { modifier -> (peer:Peer?, from: Peer?) in + remoteSearchResult = account.postbox.modify { modifier -> (peer:Peer?, from: Peer?) in if let fromId = fromId { return (peer: modifier.getPeer(peerId), from: modifier.getPeer(fromId)) } return (peer: modifier.getPeer(peerId), from: nil) - } |> mapToSignal { values -> Signal in + } |> mapToSignal { values -> Signal in if let peer = values.peer, let inputPeer = apiInputPeer(peer) { var fromInputUser:Api.InputUser? = nil var flags:Int32 = 0 @@ -58,72 +81,71 @@ public func searchMessages(account: Account, peerId: PeerId?, query: String, fro return .never() } } - } else { - searchResult = account.network.request(Api.functions.messages.searchGlobal(q: query, offsetDate: 0, offsetPeer: Api.InputPeer.inputPeerEmpty, offsetId: 0, limit: 64)) - |> mapError {_ in} |> map {Optional($0)} + case .general: + remoteSearchResult = account.network.request(Api.functions.messages.searchGlobal(q: query, offsetDate: 0, offsetPeer: Api.InputPeer.inputPeerEmpty, offsetId: 0, limit: 64)) + |> mapError { _ in } |> map(Optional.init) + } + + let processedSearchResult = remoteSearchResult + |> mapToSignal { result -> Signal<[Message], NoError> in + guard let result = result else { + return .single([]) + } + let messages: [Api.Message] + let chats: [Api.Chat] + let users: [Api.User] + switch result { + case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers): + messages = apiMessages + chats = apiChats + users = apiUsers + case let .messages(apiMessages, apiChats, apiUsers): + messages = apiMessages + chats = apiChats + users = apiUsers + case let.messagesSlice(_, apiMessages, apiChats, apiUsers): + messages = apiMessages + chats = apiChats + users = apiUsers + } + + return account.postbox.modify { modifier -> [Message] 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 renderedMessages: [Message] = [] + for message in messages { + if let message = StoreMessage(apiMessage: message), let renderedMessage = locallyRenderedMessage(message: message, peers: peers) { + renderedMessages.append(renderedMessage) + } + } + + if case .general = location { + let secretMessages = modifier.searchMessages(peerId: nil, query: query, tags: nil) + renderedMessages.append(contentsOf: secretMessages) + } + + renderedMessages.sort(by: { lhs, rhs in + return MessageIndex(lhs) > MessageIndex(rhs) + }) + + return renderedMessages + } + } - let processedSearchResult = searchResult - |> mapToSignal { result -> Signal<[Message], NoError> in - guard let result = result else { - return .single([]) - } - let messages: [Api.Message] - let chats: [Api.Chat] - let users: [Api.User] - switch result { - case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers): - messages = apiMessages - chats = apiChats - users = apiUsers - case let .messages(apiMessages, apiChats, apiUsers): - messages = apiMessages - chats = apiChats - users = apiUsers - case let.messagesSlice(_, apiMessages, apiChats, apiUsers): - messages = apiMessages - chats = apiChats - users = apiUsers - } - - return account.postbox.modify { modifier -> [Message] 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 renderedMessages: [Message] = [] - for message in messages { - if let message = StoreMessage(apiMessage: message), let renderedMessage = locallyRenderedMessage(message: message, peers: peers) { - renderedMessages.append(renderedMessage) - } - } - - if peerId == nil { - let secretMessages = modifier.searchMessages(peerId: nil, query: query, tags: nil) - renderedMessages.append(contentsOf: secretMessages) - } - - renderedMessages.sort(by: { lhs, rhs in - return MessageIndex(lhs) > MessageIndex(rhs) - }) - - return renderedMessages - } - - } - - return processedSearchResult - } + return processedSearchResult } diff --git a/TelegramCore/SearchPeers.swift b/TelegramCore/SearchPeers.swift index d28abfc99b..ff765319f9 100644 --- a/TelegramCore/SearchPeers.swift +++ b/TelegramCore/SearchPeers.swift @@ -23,35 +23,33 @@ public struct FoundPeer: Equatable { } } -public func searchPeers(account: Account, query: String) -> Signal<[FoundPeer], NoError> { - let searchResult = account.network.request(Api.functions.contacts.search(q: query, limit: 10)) +public func searchPeers(account: Account, query: String) -> Signal<([FoundPeer], [FoundPeer]), NoError> { + let searchResult = account.network.request(Api.functions.contacts.search(q: query, limit: 20)) |> map { Optional($0) } |> `catch` { _ in return Signal.single(nil) - } + } let processedSearchResult = searchResult - |> mapToSignal { result -> Signal<[FoundPeer], NoError> in + |> mapToSignal { result -> Signal<([FoundPeer], [FoundPeer]), NoError> in if let result = result { switch result { - case let .found(results, chats, users): - return account.postbox.modify { modifier -> [FoundPeer] in + case let .found(myResults, results, chats, users): + return account.postbox.modify { modifier -> ([FoundPeer], [FoundPeer]) in var peers: [PeerId: Peer] = [:] - var subscribres:[PeerId : Int32] = [:] + var subscribers:[PeerId : Int32] = [:] 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 switch chat { case let .channel(_, _, _, _, _, _, _, _, _, _, _, participantsCount): if let participantsCount = participantsCount { - subscribres[groupOrChannel.id] = participantsCount + subscribers[groupOrChannel.id] = participantsCount } default: break @@ -59,6 +57,22 @@ public func searchPeers(account: Account, query: String) -> Signal<[FoundPeer], } } + var renderedMyPeers: [FoundPeer] = [] + for result in myResults { + 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] { + renderedMyPeers.append(FoundPeer(peer: peer, subscribers: subscribers[peerId])) + } + } + var renderedPeers: [FoundPeer] = [] for result in results { let peerId: PeerId @@ -71,18 +85,19 @@ public func searchPeers(account: Account, query: String) -> Signal<[FoundPeer], peerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: channelId) } if let peer = peers[peerId] { - renderedPeers.append(FoundPeer(peer: peer, subscribers: subscribres[peerId])) + renderedPeers.append(FoundPeer(peer: peer, subscribers: subscribers[peerId])) } } - return renderedPeers + return (renderedMyPeers, renderedPeers) } } } else { - return .single([]) + return .single(([], [])) } } return processedSearchResult } + diff --git a/TelegramCore/Serialization.swift b/TelegramCore/Serialization.swift index 999b984bc2..373690b932 100644 --- a/TelegramCore/Serialization.swift +++ b/TelegramCore/Serialization.swift @@ -20,7 +20,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 73 + return 74 } public func parseMessage(_ data: Data!) -> Any! { From 1b7c78cf9b86aae254cb642a2ea777555d27033e Mon Sep 17 00:00:00 2001 From: Mikhail Filimonov Date: Wed, 24 Jan 2018 12:17:39 +0400 Subject: [PATCH 2/3] no message --- TelegramCore/ExportMessageLink.swift | 5 +---- TelegramCore/SearchMessages.swift | 12 ------------ TelegramCore/SearchPeers.swift | 9 --------- TelegramCore/Serialization.swift | 4 ---- 4 files changed, 1 insertion(+), 29 deletions(-) diff --git a/TelegramCore/ExportMessageLink.swift b/TelegramCore/ExportMessageLink.swift index 314f44670c..5ccd85a316 100644 --- a/TelegramCore/ExportMessageLink.swift +++ b/TelegramCore/ExportMessageLink.swift @@ -13,11 +13,8 @@ public func exportMessageLink(account:Account, peerId:PeerId, messageId:MessageI return modifier.getPeer(peerId) } |> mapToSignal { peer -> Signal in if let peer = peer, let input = apiInputChannel(peer) { -<<<<<<< HEAD - return account.network.request(Api.functions.channels.exportMessageLink(channel: input, id: messageId.id, grouped: Api.Bool.boolTrue)) |> mapError {_ in return } |> map { res in -======= return account.network.request(Api.functions.channels.exportMessageLink(channel: input, id: messageId.id, grouped: .boolTrue)) |> mapError {_ in return } |> map { res in ->>>>>>> 50c01586839b0113730b0aaa9a4011b954868da2 + switch res { case let .exportedMessageLink(link, _): return link diff --git a/TelegramCore/SearchMessages.swift b/TelegramCore/SearchMessages.swift index 081521c551..a0029d9eaa 100644 --- a/TelegramCore/SearchMessages.swift +++ b/TelegramCore/SearchMessages.swift @@ -11,10 +11,7 @@ import Foundation public enum SearchMessagesLocation: Equatable { case general -<<<<<<< HEAD -======= case group(PeerGroupId) ->>>>>>> 50c01586839b0113730b0aaa9a4011b954868da2 case peer(peerId: PeerId, fromId: PeerId?, tags: MessageTags?) public static func ==(lhs: SearchMessagesLocation, rhs: SearchMessagesLocation) -> Bool { @@ -25,15 +22,12 @@ public enum SearchMessagesLocation: Equatable { } else { return false } -<<<<<<< HEAD -======= case let .group(groupId): if case .group(groupId) = rhs { return true } else { return false } ->>>>>>> 50c01586839b0113730b0aaa9a4011b954868da2 case let .peer(lhsPeerId, lhsFromId, lhsTags): if case let .peer(rhsPeerId, rhsFromId, rhsTags) = rhs, lhsPeerId == rhsPeerId, lhsFromId == rhsFromId, lhsTags == rhsTags { return true @@ -94,12 +88,9 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q return .never() } } -<<<<<<< HEAD -======= case let .group(groupId): remoteSearchResult = account.network.request(Api.functions.channels.searchFeed(feedId: groupId.rawValue, q: query, offsetDate: 0, offsetPeer: Api.InputPeer.inputPeerEmpty, offsetId: 0, limit: 64)) |> mapError { _ in } |> map(Optional.init) ->>>>>>> 50c01586839b0113730b0aaa9a4011b954868da2 case .general: remoteSearchResult = account.network.request(Api.functions.messages.searchGlobal(q: query, offsetDate: 0, offsetPeer: Api.InputPeer.inputPeerEmpty, offsetId: 0, limit: 64)) |> mapError { _ in } |> map(Optional.init) @@ -126,13 +117,10 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q messages = apiMessages chats = apiChats users = apiUsers -<<<<<<< HEAD -======= case .messagesNotModified: messages = [] chats = [] users = [] ->>>>>>> 50c01586839b0113730b0aaa9a4011b954868da2 } return account.postbox.modify { modifier -> [Message] in diff --git a/TelegramCore/SearchPeers.swift b/TelegramCore/SearchPeers.swift index 0522a1f285..0e8f8f77c2 100644 --- a/TelegramCore/SearchPeers.swift +++ b/TelegramCore/SearchPeers.swift @@ -61,21 +61,12 @@ public func searchPeers(account: Account, query: String) -> Signal<([FoundPeer], for result in myResults { let peerId: PeerId switch result { -<<<<<<< HEAD - 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) -======= 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) ->>>>>>> 50c01586839b0113730b0aaa9a4011b954868da2 } if let peer = peers[peerId] { renderedMyPeers.append(FoundPeer(peer: peer, subscribers: subscribers[peerId])) diff --git a/TelegramCore/Serialization.swift b/TelegramCore/Serialization.swift index cd042c6119..35146f1eb5 100644 --- a/TelegramCore/Serialization.swift +++ b/TelegramCore/Serialization.swift @@ -20,11 +20,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { -<<<<<<< HEAD - return 74 -======= return 76 ->>>>>>> 50c01586839b0113730b0aaa9a4011b954868da2 } public func parseMessage(_ data: Data!) -> Any! { From cf4f84a1b78e324d59abf25f0965d219b354ca11 Mon Sep 17 00:00:00 2001 From: Mikhail Filimonov Date: Wed, 7 Feb 2018 13:39:41 +0400 Subject: [PATCH 3/3] no message --- TelegramCore.xcodeproj/project.pbxproj | 3 ++- TelegramCore/Authorization.swift | 2 +- TelegramCore/Download.swift | 18 +++++++++++++++--- TelegramCore/EnqueueMessage.swift | 13 ++++++++++++- TelegramCore/MultipartUpload.swift | 12 ++++++++---- TelegramCore/PendingMessageManager.swift | 18 +++++++++++++++++- TelegramCore/RecentAccountSessions.swift | 16 ++++++++++++---- TelegramCore/SearchPeers.swift | 2 +- 8 files changed, 68 insertions(+), 16 deletions(-) diff --git a/TelegramCore.xcodeproj/project.pbxproj b/TelegramCore.xcodeproj/project.pbxproj index 39749dcb19..2186714f95 100644 --- a/TelegramCore.xcodeproj/project.pbxproj +++ b/TelegramCore.xcodeproj/project.pbxproj @@ -2931,6 +2931,7 @@ CLANG_WARN_SUSPICIOUS_MOVES = YES; CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2950,7 +2951,7 @@ SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.0; }; name = "Debug Hockeyapp"; diff --git a/TelegramCore/Authorization.swift b/TelegramCore/Authorization.swift index 86e9acd33a..9e0f3bd9bd 100644 --- a/TelegramCore/Authorization.swift +++ b/TelegramCore/Authorization.swift @@ -27,7 +27,7 @@ public func sendAuthorizationCode(account: UnauthorizedAccount, phoneNumber: Str switch error.errorDescription { case Regex("(PHONE_|USER_|NETWORK_)MIGRATE_(\\d+)"): let range = error.errorDescription.range(of: "MIGRATE_")! - let updatedMasterDatacenterId = Int32(error.errorDescription.substring(from: range.upperBound))! + let updatedMasterDatacenterId = Int32(error.errorDescription[range.upperBound ..< error.errorDescription.endIndex])! let updatedAccount = account.changedMasterDatacenterId(updatedMasterDatacenterId) return updatedAccount |> mapToSignalPromotingError { updatedAccount -> Signal<(Api.auth.SentCode, UnauthorizedAccount), MTRpcError> in diff --git a/TelegramCore/Download.swift b/TelegramCore/Download.swift index 220db0f5e7..d6ab254831 100644 --- a/TelegramCore/Download.swift +++ b/TelegramCore/Download.swift @@ -22,6 +22,12 @@ private func roundUp(_ value: Int, to multiple: Int) -> Int { return value + multiple - remainder } +enum UploadPartError { + case generic + case invalidMedia +} + + class Download: NSObject, MTRequestMessageServiceDelegate { let datacenterId: Int let isCdn: Bool @@ -75,7 +81,7 @@ class Download: NSObject, MTRequestMessageServiceDelegate { self.context.authTokenForDatacenter(withIdRequired: self.datacenterId, authToken:self.mtProto.requiredAuthToken, masterDatacenterId: self.mtProto.authTokenMasterDatacenterId) } - func uploadPart(fileId: Int64, index: Int, data: Data, bigTotalParts: Int? = nil) -> Signal { + func uploadPart(fileId: Int64, index: Int, data: Data, bigTotalParts: Int? = nil) -> Signal { return Signal { subscriber in let request = MTRequest() @@ -110,7 +116,13 @@ class Download: NSObject, MTRequestMessageServiceDelegate { return ActionDisposable { self.requestService.removeRequest(byInternalId: internalId) } - } |> retryRequest + } |> `catch` { value -> Signal in + if value.errorCode == 400 { + return .fail(.invalidMedia) + } else { + return .fail(.generic) + } + } } func webFilePart(location: Api.InputWebFileLocation, offset: Int, length: Int) -> Signal { @@ -160,7 +172,7 @@ class Download: NSObject, MTRequestMessageServiceDelegate { } |> retryRequest } - func part(location: Api.InputFileLocation, offset: Int, length: Int) -> Signal { + func part(location: Api.InputFileLocation, offset: Int, length: Int) -> Signal { return Signal { subscriber in let request = MTRequest() diff --git a/TelegramCore/EnqueueMessage.swift b/TelegramCore/EnqueueMessage.swift index f433039c31..bd5b793b6c 100644 --- a/TelegramCore/EnqueueMessage.swift +++ b/TelegramCore/EnqueueMessage.swift @@ -173,7 +173,7 @@ public func resendMessages(account: Account, messageIds: [MessageId]) -> Signal< } func enqueueMessages(modifier: Modifier, account: Account, peerId: PeerId, messages: [(Bool, EnqueueMessage)]) -> [MessageId?] { - if let peer = modifier.getPeer(peerId) { + if let peer = modifier.getPeer(peerId), let accountPeer = modifier.getPeer(account.peerId) { var storeMessages: [StoreMessage] = [] var timestamp = Int32(account.network.context.globalTime()) switch peerId.namespace { @@ -231,6 +231,17 @@ func enqueueMessages(modifier: Modifier, account: Account, peerId: PeerId, messa attributes.append(ConsumableContentMessageAttribute(consumed: false)) } } + if let peer = peer as? TelegramChannel { + switch peer.info { + case let .broadcast(info): + attributes.append(ViewCountMessageAttribute(count: 1)) + if info.flags.contains(.messagesShouldHaveSignatures) { + attributes.append(AuthorSignatureMessageAttribute(signature: accountPeer.displayTitle)) + } + case .group: + break + } + } var entitiesAttribute: TextEntitiesMessageAttribute? for attribute in attributes { diff --git a/TelegramCore/MultipartUpload.swift b/TelegramCore/MultipartUpload.swift index d03d978cd5..3ba0003aee 100644 --- a/TelegramCore/MultipartUpload.swift +++ b/TelegramCore/MultipartUpload.swift @@ -145,7 +145,7 @@ private final class MultipartUploadManager { let dataSignal: Signal var committedOffset: Int - let uploadPart: (UploadPart) -> Signal + let uploadPart: (UploadPart) -> Signal let progress: (Float) -> Void let completed: (MultipartIntermediateResult?) -> Void @@ -159,7 +159,7 @@ private final class MultipartUploadManager { let state: MultipartUploadState - init(headerSize: Int32, data: Signal, encryptionKey: SecretFileEncryptionKey?, hintFileSize: Int?, uploadPart: @escaping (UploadPart) -> Signal, progress: @escaping (Float) -> Void, completed: @escaping (MultipartIntermediateResult?) -> Void) { + init(headerSize: Int32, data: Signal, encryptionKey: SecretFileEncryptionKey?, hintFileSize: Int?, uploadPart: @escaping (UploadPart) -> Signal, progress: @escaping (Float) -> Void, completed: @escaping (MultipartIntermediateResult?) -> Void) { self.dataSignal = data var fileId: Int64 = 0 @@ -256,7 +256,9 @@ private final class MultipartUploadManager { } let part = self.uploadPart(UploadPart(fileId: self.fileId, index: partIndex, data: partData, bigTotalParts: currentBigTotalParts)) |> deliverOn(self.queue) - self.uploadingParts[0] = (partSize, part.start(completed: { [weak self] in + self.uploadingParts[0] = (partSize, part.start(error: { [weak self] error in + self?.completed(nil) + }, completed: { [weak self] in if let strongSelf = self { let _ = strongSelf.uploadingParts.removeValue(forKey: 0) strongSelf.headerPartReady = true @@ -295,7 +297,9 @@ private final class MultipartUploadManager { } let part = self.uploadPart(UploadPart(fileId: self.fileId, index: partIndex, data: partData, bigTotalParts: currentBigTotalParts)) |> deliverOn(self.queue) - self.uploadingParts[nextOffset] = (partSize, part.start(completed: { [weak self] in + self.uploadingParts[nextOffset] = (partSize, part.start(error: { [weak self] error in + self?.completed(nil) + }, completed: { [weak self] in if let strongSelf = self { let _ = strongSelf.uploadingParts.removeValue(forKey: nextOffset) strongSelf.uploadedParts[partOffset] = partSize diff --git a/TelegramCore/PendingMessageManager.swift b/TelegramCore/PendingMessageManager.swift index f3150bf8bf..e5fa6524fd 100644 --- a/TelegramCore/PendingMessageManager.swift +++ b/TelegramCore/PendingMessageManager.swift @@ -381,7 +381,23 @@ public final class PendingMessageManager { subscriber(status) } - messageContext.disposable.set((uploadSignal |> deliverOn(self.queue)).start(next: { [weak self] next in + + + messageContext.disposable.set((uploadSignal |> deliverOn(self.queue) |> `catch` { [weak self] _ -> Signal in + if let strongSelf = self { + let modify = strongSelf.postbox.modify { modifier -> Void in + modifier.updateMessage(id, update: { currentMessage in + var storeForwardInfo: StoreMessageForwardInfo? + if let forwardInfo = currentMessage.forwardInfo { + storeForwardInfo = StoreMessageForwardInfo(authorId: forwardInfo.author.id, sourceId: forwardInfo.source?.id, sourceMessageId: forwardInfo.sourceMessageId, date: forwardInfo.date, authorSignature: forwardInfo.authorSignature) + } + return .update(StoreMessage(id: id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, timestamp: currentMessage.timestamp, flags: [.Failed], tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: currentMessage.attributes, media: currentMessage.media)) + }) + } + return modify |> mapToSignal { _ in return .complete() } + } + return .fail(Void()) + }).start(next: { [weak self] next in if let strongSelf = self { assert(strongSelf.queue.isCurrent()) diff --git a/TelegramCore/RecentAccountSessions.swift b/TelegramCore/RecentAccountSessions.swift index 296bae143b..2ee8e6b3f9 100644 --- a/TelegramCore/RecentAccountSessions.swift +++ b/TelegramCore/RecentAccountSessions.swift @@ -22,11 +22,19 @@ public func requestRecentAccountSessions(account: Account) -> Signal<[RecentAcco } } -public func terminateAccountSession(account: Account, hash: Int64) -> Signal { +public enum TerminateSessionError { + case generic + case freshReset +} + +public func terminateAccountSession(account: Account, hash: Int64) -> Signal { return account.network.request(Api.functions.account.resetAuthorization(hash: hash)) - |> retryRequest - |> mapToSignal { _ -> Signal in - return .complete() + |> map {_ in} + |> mapError { error -> TerminateSessionError in + if error.errorCode == 406 { + return .freshReset + } + return .generic } } diff --git a/TelegramCore/SearchPeers.swift b/TelegramCore/SearchPeers.swift index 0e8f8f77c2..64a9755cc7 100644 --- a/TelegramCore/SearchPeers.swift +++ b/TelegramCore/SearchPeers.swift @@ -24,7 +24,7 @@ public struct FoundPeer: Equatable { } public func searchPeers(account: Account, query: String) -> Signal<([FoundPeer], [FoundPeer]), NoError> { - let searchResult = account.network.request(Api.functions.contacts.search(q: query, limit: 20)) + let searchResult = account.network.request(Api.functions.contacts.search(q: query, limit: 20), automaticFloodWait: false) |> map { Optional($0) } |> `catch` { _ in return Signal.single(nil)