diff --git a/TelegramCore.xcodeproj/project.pbxproj b/TelegramCore.xcodeproj/project.pbxproj index a353e19398..512675d0d8 100644 --- a/TelegramCore.xcodeproj/project.pbxproj +++ b/TelegramCore.xcodeproj/project.pbxproj @@ -46,6 +46,8 @@ D01AC9211DD5E7E500E8160F /* RequestEditMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01AC9201DD5E7E500E8160F /* RequestEditMessage.swift */; }; D01AC9231DD5E9A200E8160F /* ApplyUpdateMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01AC9221DD5E9A200E8160F /* ApplyUpdateMessage.swift */; }; D01B27A21E394D8B0022A4C0 /* PrivacySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01B27A11E394D8B0022A4C0 /* PrivacySettings.swift */; }; + D01D6BF91E42A713006151C6 /* SearchStickers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01D6BF81E42A713006151C6 /* SearchStickers.swift */; }; + D01D6BFA1E42A718006151C6 /* SearchStickers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01D6BF81E42A713006151C6 /* SearchStickers.swift */; }; D021E0DF1DB539FC00C6B04F /* StickerPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0DE1DB539FC00C6B04F /* StickerPack.swift */; }; D021E0E21DB5401A00C6B04F /* StickerManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = D021E0E11DB5401A00C6B04F /* StickerManagement.swift */; }; D02ABC7B1E30058F00CAE539 /* DeleteMessagesInteractively.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02ABC7A1E30058F00CAE539 /* DeleteMessagesInteractively.swift */; }; @@ -349,6 +351,7 @@ D01AC9201DD5E7E500E8160F /* RequestEditMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestEditMessage.swift; sourceTree = ""; }; D01AC9221DD5E9A200E8160F /* ApplyUpdateMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApplyUpdateMessage.swift; sourceTree = ""; }; D01B27A11E394D8B0022A4C0 /* PrivacySettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivacySettings.swift; sourceTree = ""; }; + D01D6BF81E42A713006151C6 /* SearchStickers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchStickers.swift; sourceTree = ""; }; D021E0DE1DB539FC00C6B04F /* StickerPack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerPack.swift; sourceTree = ""; }; D021E0E11DB5401A00C6B04F /* StickerManagement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerManagement.swift; sourceTree = ""; }; D02ABC7A1E30058F00CAE539 /* DeleteMessagesInteractively.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DeleteMessagesInteractively.swift; sourceTree = ""; }; @@ -580,6 +583,7 @@ isa = PBXGroup; children = ( D021E0E11DB5401A00C6B04F /* StickerManagement.swift */, + D01D6BF81E42A713006151C6 /* SearchStickers.swift */, ); name = "Sticker Management"; sourceTree = ""; @@ -1216,6 +1220,7 @@ D03B0CD91D62245B00955575 /* PeerUtils.swift in Sources */, D03B0CE41D62249F00955575 /* TextEntitiesMessageAttribute.swift in Sources */, D03B0CD31D62244300955575 /* Namespaces.swift in Sources */, + D01D6BF91E42A713006151C6 /* SearchStickers.swift in Sources */, D0FA8BB91E2240B4001E855B /* SecretChatIncomingDecryptedOperation.swift in Sources */, D0DF0C8A1D819C7E008AEB01 /* JoinChannel.swift in Sources */, D0F7AB2F1DCF507E009AD9A1 /* ReplyMarkupMessageAttribute.swift in Sources */, @@ -1298,6 +1303,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + D01D6BFA1E42A718006151C6 /* SearchStickers.swift in Sources */, C2A315C01E2E776A00D89000 /* RequestStartBot.swift in Sources */, D0F7B1EA1E045C87007EB8A5 /* ChangePeerNotificationSettings.swift in Sources */, D0B418A71D7E0592004562A4 /* Fetch.swift in Sources */, diff --git a/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift b/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift index 1cc9d964e8..ae10da4b7c 100644 --- a/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift +++ b/TelegramCore/ManagedCloudChatRemoveMessagesOperations.swift @@ -185,7 +185,7 @@ private func removeChat(modifier: Modifier, postbox: Postbox, network: Network, return .complete() } } else if peer.id.namespace == Namespaces.Peer.CloudGroup { - return network.request(Api.functions.messages.deleteChatUser(chatId: peer.id.id, userId: Api.InputUser.inputUserSelf)) + let deleteUser: Signal = network.request(Api.functions.messages.deleteChatUser(chatId: peer.id.id, userId: Api.InputUser.inputUserSelf)) |> map { result -> Api.Updates? in return result } @@ -198,6 +198,28 @@ private func removeChat(modifier: Modifier, postbox: Postbox, network: Network, } return .complete() } + let deleteMessages: Signal + if let inputPeer = apiInputPeer(peer), let topMessageId = modifier.getTopPeerMessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud) { + deleteMessages = network.request(Api.functions.messages.deleteHistory(flags: 0, peer: inputPeer, maxId: topMessageId.id)) + |> map { result -> Api.messages.AffectedHistory? in + return result + } + |> `catch` { _ in + return .single(nil) + } + |> mapToSignal { result in + if let result = result { + switch result { + case let .affectedHistory(pts, ptsCount, _): + stateManager.addUpdateGroups([.updatePts(pts: pts, ptsCount: ptsCount)]) + } + } + return .complete() + } + } else { + deleteMessages = .complete() + } + return deleteMessages |> then(deleteUser) } else if peer.id.namespace == Namespaces.Peer.CloudUser { if let inputPeer = apiInputPeer(peer), let topMessageId = modifier.getTopPeerMessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud) { return network.request(Api.functions.messages.deleteHistory(flags: 0, peer: inputPeer, maxId: topMessageId.id)) @@ -215,7 +237,7 @@ private func removeChat(modifier: Modifier, postbox: Postbox, network: Network, } } return .complete() - } + } } else { return .complete() } diff --git a/TelegramCore/ManagedSynchronizePinnedChatsOperations.swift b/TelegramCore/ManagedSynchronizePinnedChatsOperations.swift index 4e1b15fd46..6cbc1fb494 100644 --- a/TelegramCore/ManagedSynchronizePinnedChatsOperations.swift +++ b/TelegramCore/ManagedSynchronizePinnedChatsOperations.swift @@ -114,10 +114,108 @@ func managedSynchronizePinnedChatsOperations(postbox: Postbox, network: Network, } private func synchronizePinnedChats(modifier: Modifier, postbox: Postbox, network: Network, stateManager: AccountStateManager, operation: SynchronizePinnedChatsOperation) -> Signal { - let peerIds = modifier.getPinnedPeerIds().filter { + let rawPeerIds = modifier.getPinnedPeerIds() + let peerIds = rawPeerIds.filter { $0.namespace != Namespaces.Peer.SecretChat } + /*let peerIdsSet = Set(peerIds) + let previousCachedIds = Set(operation.previousPeerIds.filter { $0.namespace != Namespaces.Peer.SecretChat }) + let removedIds = previousCachedIds.subtracting(peerIdsSet) + + //messages.peerDialogs#3371c354 dialogs:Vector messages:Vector chats:Vector users:Vector state:updates.State = messages.PeerDialogs; + let s = network.request(Api.functions.messages.getPinnedDialogs()) + |> retryRequest + |> mapToSignal { dialogs -> Signal in + let dialogsChats: [Api.Chat] + let dialogsUsers: [Api.User] + + var storeMessages: [StoreMessage] = [] + var readStates: [PeerId: [MessageId.Namespace: PeerReadState]] = [:] + var chatStates: [PeerId: PeerChatState] = [:] + var notificationSettings: [PeerId: PeerNotificationSettings] = [:] + + switch dialogs { + case let .peerDialogs(dialogs, messages, chats, users, _): + dialogsChats = chats + dialogsUsers = users + + for dialog in dialogs { + let apiPeer: Api.Peer + let apiReadInboxMaxId: Int32 + let apiReadOutboxMaxId: Int32 + let apiTopMessage: Int32 + let apiUnreadCount: Int32 + var apiChannelPts: Int32? + let apiNotificationSettings: Api.PeerNotifySettings + switch dialog { + case let .dialog(_, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, peerNotificationSettings, pts, _): + apiPeer = peer + apiTopMessage = topMessage + apiReadInboxMaxId = readInboxMaxId + apiReadOutboxMaxId = readOutboxMaxId + apiUnreadCount = unreadCount + apiNotificationSettings = peerNotificationSettings + apiChannelPts = pts + } + + let peerId: PeerId + switch apiPeer { + 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 readStates[peerId] == nil { + readStates[peerId] = [:] + } + readStates[peerId]![Namespaces.Message.Cloud] = .idBased(maxIncomingReadId: apiReadInboxMaxId, maxOutgoingReadId: apiReadOutboxMaxId, maxKnownId: apiTopMessage, count: apiUnreadCount) + + if let apiChannelPts = apiChannelPts { + chatStates[peerId] = ChannelState(pts: apiChannelPts) + } + + notificationSettings[peerId] = TelegramPeerNotificationSettings(apiSettings: apiNotificationSettings) + } + + for message in messages { + if let storeMessage = StoreMessage(apiMessage: message) { + storeMessages.append(storeMessage) + } + } + } + + var chatPeers: [Peer] = [] + var peers: [Peer] = [] + var peerPresences: [PeerId: PeerPresence] = [:] + for chat in dialogsChats { + if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) { + peers.append(groupOrChannel) + chatPeers.append(groupOrChannel) + } + } + for user in dialogsUsers { + let telegramUser = TelegramUser(user: user) + peers.append(telegramUser) + if let presence = TelegramUserPresence(apiUser: user) { + peerPresences[telegramUser.id] = presence + } + } + + let currentPeersIds = chatPeers.map({ $0.id }) + + let cleanedUpPeerIds = currentPeersIds.filter { !removedIds.contains($0) } + + var finalPeerIds: [PeerId] = [] + + + return .never() + }*/ + + var inputPeers: [Api.InputPeer] = [] for peerId in peerIds { if let peer = modifier.getPeer(peerId), let inputPeer = apiInputPeer(peer) { diff --git a/TelegramCore/NetworkLogging.m b/TelegramCore/NetworkLogging.m index ff106f7bb2..4405ba893d 100644 --- a/TelegramCore/NetworkLogging.m +++ b/TelegramCore/NetworkLogging.m @@ -15,8 +15,10 @@ void setBridgingTraceFunction(void (*f)(NSString *, NSString *)) { #if TARGET_IPHONE_SIMULATOR static bool loggingEnabled = true; -#else +#elif defined(DEBUG) static bool loggingEnabled = true; +#else +static bool loggingEnabled = false; #endif static void TGTelegramLoggingFunction(NSString *format, va_list args) { diff --git a/TelegramCore/SearchStickers.swift b/TelegramCore/SearchStickers.swift new file mode 100644 index 0000000000..b9f4b81cf5 --- /dev/null +++ b/TelegramCore/SearchStickers.swift @@ -0,0 +1,20 @@ +import Foundation +#if os(macOS) + import PostboxMac + import SwiftSignalKitMac +#else + import Postbox + import SwiftSignalKit +#endif + +public func searchStickers(postbox: Postbox, query: String) -> Signal<[StickerPackItem], NoError> { + return postbox.modify { modifier -> [StickerPackItem] in + var result: [StickerPackItem] = [] + for item in modifier.searchItemCollection(namespace: Namespaces.ItemCollection.CloudStickerPacks, key: ValueBoxKey(query).toMemoryBuffer()) { + if let item = item as? StickerPackItem { + result.append(item) + } + } + return result + } +} diff --git a/TelegramCore/StickerManagement.swift b/TelegramCore/StickerManagement.swift index a8c75e2c12..1abb2c36ab 100644 --- a/TelegramCore/StickerManagement.swift +++ b/TelegramCore/StickerManagement.swift @@ -12,10 +12,10 @@ private func hashForInfos(_ infos: [StickerPackCollectionInfo]) -> Int32 { var acc: UInt32 = 0 for info in infos { - acc = (acc &* 20261) &+ unsafeBitCast(info.hash, to: UInt32.self) + acc = (acc &* 20261) &+ UInt32(bitPattern: info.hash) } - return unsafeBitCast(acc % UInt32(0x7FFFFFFF), to: Int32.self) + return Int32(bitPattern: acc % UInt32(0x7FFFFFFF)) } func manageStickerPacks(network: Network, postbox: Postbox) -> Signal { @@ -28,7 +28,7 @@ func manageStickerPacks(network: Network, postbox: Postbox) -> Signal mapToSignal { hash -> Signal in if hash != 0 { - return .never() + //return .never() } return network.request(Api.functions.messages.getAllStickers(hash: hash)) @@ -55,10 +55,34 @@ func manageStickerPacks(network: Network, postbox: Postbox) -> Signal map { result -> (ItemCollectionId, [ItemCollectionItem]) in var items: [ItemCollectionItem] = [] switch result { - case let .stickerSet(_, _, documents): + case let .stickerSet(_, packs, documents): + var indexKeysByFile: [MediaId: [MemoryBuffer]] = [:] + //stickerPack#12b299d4 emoticon:string documents:Vector = StickerPack; + for pack in packs { + switch pack { + case let .stickerPack(text, fileIds): + let key = ValueBoxKey(text).toMemoryBuffer() + for fileId in fileIds { + let mediaId = MediaId(namespace: Namespaces.Media.CloudFile, id: fileId) + if indexKeysByFile[mediaId] == nil { + indexKeysByFile[mediaId] = [key] + } else { + indexKeysByFile[mediaId]!.append(key) + } + } + break + } + } + for apiDocument in documents { if let file = telegramMediaFileFromApiDocument(apiDocument), let id = file.id { - items.append(StickerPackItem(index: ItemCollectionItemIndex(index: Int32(items.count), id: id.id), file: file)) + let fileIndexKeys: [MemoryBuffer] + if let indexKeys = indexKeysByFile[id] { + fileIndexKeys = indexKeys + } else { + fileIndexKeys = [] + } + items.append(StickerPackItem(index: ItemCollectionItemIndex(index: Int32(items.count), id: id.id), file: file, indexKeys: fileIndexKeys)) } } break diff --git a/TelegramCore/StickerPack.swift b/TelegramCore/StickerPack.swift index ee3f554236..ea7560cd62 100644 --- a/TelegramCore/StickerPack.swift +++ b/TelegramCore/StickerPack.swift @@ -46,24 +46,28 @@ public final class StickerPackCollectionInfo: ItemCollectionInfo, Equatable { public final class StickerPackItem: ItemCollectionItem, Equatable { public let index: ItemCollectionItemIndex public let file: TelegramMediaFile + public var indexKeys: [MemoryBuffer] - init(index: ItemCollectionItemIndex, file: TelegramMediaFile) { + init(index: ItemCollectionItemIndex, file: TelegramMediaFile, indexKeys: [MemoryBuffer]) { self.index = index self.file = file + self.indexKeys = indexKeys } public init(decoder: Decoder) { self.index = ItemCollectionItemIndex(index: decoder.decodeInt32ForKey("i.n"), id: decoder.decodeInt64ForKey("i.i")) self.file = decoder.decodeObjectForKey("f") as! TelegramMediaFile + self.indexKeys = decoder.decodeBytesArrayForKey("s") } public func encode(_ encoder: Encoder) { encoder.encodeInt32(self.index.index, forKey: "i.n") encoder.encodeInt64(self.index.id, forKey: "i.i") encoder.encodeObject(self.file, forKey: "f") + encoder.encodeBytesArray(self.indexKeys, forKey: "s") } public static func ==(lhs: StickerPackItem, rhs: StickerPackItem) -> Bool { - return lhs.index == rhs.index && lhs.file == rhs.file + return lhs.index == rhs.index && lhs.file == rhs.file && lhs.indexKeys == rhs.indexKeys } } diff --git a/TelegramCore/SynchronizePinnedChatsOperation.swift b/TelegramCore/SynchronizePinnedChatsOperation.swift index 690f334134..baca954cfc 100644 --- a/TelegramCore/SynchronizePinnedChatsOperation.swift +++ b/TelegramCore/SynchronizePinnedChatsOperation.swift @@ -6,7 +6,7 @@ import Foundation #endif final class SynchronizePinnedChatsOperation: Coding { - private let previousPeerIds: [PeerId] + let previousPeerIds: [PeerId] init(previousPeerIds: [PeerId]) { self.previousPeerIds = previousPeerIds