From e1d6329524470be51e8b083a3a63a7982bed81c2 Mon Sep 17 00:00:00 2001 From: overtake Date: Tue, 28 Feb 2017 21:42:16 +0300 Subject: [PATCH] - some refactor --- TelegramCore.xcodeproj/project.pbxproj | 12 ++--- ...ion.swift => StickerSetInstallation.swift} | 51 +++++++++++++++---- 2 files changed, 47 insertions(+), 16 deletions(-) rename TelegramCore/{StickersCloudInstallation.swift => StickerSetInstallation.swift} (81%) diff --git a/TelegramCore.xcodeproj/project.pbxproj b/TelegramCore.xcodeproj/project.pbxproj index 550cfaae25..1b52a4ad0c 100644 --- a/TelegramCore.xcodeproj/project.pbxproj +++ b/TelegramCore.xcodeproj/project.pbxproj @@ -17,8 +17,8 @@ C239BE981E62F0D200C2C453 /* LoadMessagesIfNecessary.swift in Sources */ = {isa = PBXBuildFile; fileRef = C239BE961E62EE1E00C2C453 /* LoadMessagesIfNecessary.swift */; }; C239BE9C1E630CA700C2C453 /* UpdatePinnedMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C239BE9B1E630CA700C2C453 /* UpdatePinnedMessage.swift */; }; C239BE9D1E630CB300C2C453 /* UpdatePinnedMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C239BE9B1E630CA700C2C453 /* UpdatePinnedMessage.swift */; }; - C251D7431E65E50500283EDE /* StickersCloudInstallation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C251D7421E65E50500283EDE /* StickersCloudInstallation.swift */; }; - C251D7441E65E50500283EDE /* StickersCloudInstallation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C251D7421E65E50500283EDE /* StickersCloudInstallation.swift */; }; + C251D7431E65E50500283EDE /* StickerSetInstallation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C251D7421E65E50500283EDE /* StickerSetInstallation.swift */; }; + C251D7441E65E50500283EDE /* StickerSetInstallation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C251D7421E65E50500283EDE /* StickerSetInstallation.swift */; }; C26A37EF1E5E0C41006977AC /* ChannelParticipants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BB7C591E5C8074001527C3 /* ChannelParticipants.swift */; }; C2A315C01E2E776A00D89000 /* RequestStartBot.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01749581E1092BC0057C89A /* RequestStartBot.swift */; }; D001F3E81E128A1C007A8C60 /* ChannelState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0CFF1D62255C00955575 /* ChannelState.swift */; }; @@ -429,7 +429,7 @@ C2366C881E4F40480097CCFF /* SupportPeerId.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SupportPeerId.swift; sourceTree = ""; }; C239BE961E62EE1E00C2C453 /* LoadMessagesIfNecessary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadMessagesIfNecessary.swift; sourceTree = ""; }; C239BE9B1E630CA700C2C453 /* UpdatePinnedMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdatePinnedMessage.swift; sourceTree = ""; }; - C251D7421E65E50500283EDE /* StickersCloudInstallation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickersCloudInstallation.swift; sourceTree = ""; }; + C251D7421E65E50500283EDE /* StickerSetInstallation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StickerSetInstallation.swift; sourceTree = ""; }; D003702A1DA42586004308D3 /* PhoneNumber.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneNumber.swift; sourceTree = ""; }; D00C7CCB1E3620C30080C3D5 /* CachedChannelParticipants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedChannelParticipants.swift; sourceTree = ""; }; D00C7CCE1E3628180080C3D5 /* UpdateCachedChannelParticipants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateCachedChannelParticipants.swift; sourceTree = ""; }; @@ -709,7 +709,7 @@ D021E0E11DB5401A00C6B04F /* StickerManagement.swift */, D01D6BF81E42A713006151C6 /* SearchStickers.swift */, D049EAD71E43DAD200A2CD3A /* ManagedRecentStickers.swift */, - C251D7421E65E50500283EDE /* StickersCloudInstallation.swift */, + C251D7421E65E50500283EDE /* StickerSetInstallation.swift */, ); name = "Sticker Management"; sourceTree = ""; @@ -1496,7 +1496,7 @@ D0B843C51DA7FF30005F29E1 /* NBPhoneNumber.m in Sources */, D03B0D0D1D62255C00955575 /* SynchronizePeerReadState.swift in Sources */, D03B0D081D62255C00955575 /* ChannelState.swift in Sources */, - C251D7431E65E50500283EDE /* StickersCloudInstallation.swift in Sources */, + C251D7431E65E50500283EDE /* StickerSetInstallation.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1693,7 +1693,7 @@ D073CE6F1DCBCF17007511FD /* OutgoingMessageInfoAttribute.swift in Sources */, D0B844431DAB91FD005F29E1 /* Account.swift in Sources */, D0448CA01E27F5EB005A61A7 /* Random.swift in Sources */, - C251D7441E65E50500283EDE /* StickersCloudInstallation.swift in Sources */, + C251D7441E65E50500283EDE /* StickerSetInstallation.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/TelegramCore/StickersCloudInstallation.swift b/TelegramCore/StickerSetInstallation.swift similarity index 81% rename from TelegramCore/StickersCloudInstallation.swift rename to TelegramCore/StickerSetInstallation.swift index 20cc73acb4..0e4074d017 100644 --- a/TelegramCore/StickersCloudInstallation.swift +++ b/TelegramCore/StickerSetInstallation.swift @@ -7,7 +7,8 @@ import Foundation import SwiftSignalKit #endif -public enum CloudStickersLoadingError { + +public enum RequestStickerSetError { case generic case invalid } @@ -30,32 +31,48 @@ fileprivate extension Api.StickerSet { } } -public func requestCloudStickerPack(account:Account, reference: StickerPackReference) -> Signal<(StickerPackCollectionInfo, [ItemCollectionItem], Bool), CloudStickersLoadingError> { +public enum RequestStickerSetResult { + case local(info: ItemCollectionInfo, items: [ItemCollectionItem]) + case remote(info: ItemCollectionInfo, items: [ItemCollectionItem], installed: Bool) +} + +public func requestStickerSet(account:Account, reference: StickerPackReference) -> Signal { + let collectionId:ItemCollectionId? let input:Api.InputStickerSet + switch reference { case let .name(name): + collectionId = nil input = .inputStickerSetShortName(shortName: name) case let .id(id, accessHash): + collectionId = ItemCollectionId(namespace: Namespaces.ItemCollection.CloudStickerPacks, id: id) input = .inputStickerSetID(id: id, accessHash: accessHash) } - return account.network.request(Api.functions.messages.getStickerSet(stickerset: input)) - |> mapError { _ -> CloudStickersLoadingError in + let localSignal:(ItemCollectionId) -> Signal<(ItemCollectionInfo, [ItemCollectionItem])?, Void> = { collectionId in + return account.postbox.modify { modifier -> (ItemCollectionInfo, [ItemCollectionItem])? in + return modifier.getItemCollection(namespace: Namespaces.ItemCollection.CloudStickerPacks, id: collectionId) + } + } + + let remoteSignal = account.network.request(Api.functions.messages.getStickerSet(stickerset: input)) + |> mapError { _ -> RequestStickerSetError in return .invalid } - |> map { result -> (StickerPackCollectionInfo, [ItemCollectionItem], Bool) in + |> map { result -> RequestStickerSetResult in var items: [ItemCollectionItem] = [] - let info:StickerPackCollectionInfo + let info:ItemCollectionInfo let installed:Bool switch result { case let .stickerSet(set, packs, documents): + + info = set.info switch set { case let .stickerSet(data): installed = (data.flags & (1 << 0) != 0) } - info = set.info var indexKeysByFile: [MediaId: [MemoryBuffer]] = [:] for pack in packs { @@ -87,9 +104,23 @@ public func requestCloudStickerPack(account:Account, reference: StickerPackRefer } break } - return (info, items, installed) + return .remote(info: info, items: items, installed: installed) } + + if let collectionId = collectionId { + return localSignal(collectionId) |> mapError {_ in return .generic} |> mapToSignal { result -> Signal in + if let result = result { + return .single(.local(info: result.0, items: result.1)) + } else { + return remoteSignal + } + } + } else { + return remoteSignal + } + + } public enum InstallStickerSetError { @@ -171,11 +202,11 @@ public func installStickerSetInteractively(account:Account, info: StickerPackCol for index in removableIndexes { collections.remove(at: index) } - + collections.insert((info.id, info, items), at: 0) modifier.replaceItemCollections(namespace: info.id.namespace, itemCollections: collections) - } |> map { _ in return addResult} |> mapError {_ in return .generic} + } |> map { _ in return addResult} |> mapError {_ in return .generic} } }