From a1779a54675c43c33a47ad1e7177be624a75afb9 Mon Sep 17 00:00:00 2001 From: overtake Date: Fri, 15 Sep 2017 16:12:52 +0300 Subject: [PATCH 1/2] no message --- TelegramCore/Account.swift | 40 ++++------ .../AccountStateManagementUtils.swift | 8 ++ TelegramCore/ConvertGroupToSupergroup.swift | 1 + TelegramCore/Network.swift | 3 +- TelegramCore/RequestUserPhotos.swift | 8 +- TelegramCore/TelegramMediaImage.swift | 1 + TelegramCore/TelegramUser.swift | 80 +++++++++++-------- 7 files changed, 82 insertions(+), 59 deletions(-) diff --git a/TelegramCore/Account.swift b/TelegramCore/Account.swift index 10dc540d74..36fe3b7251 100644 --- a/TelegramCore/Account.swift +++ b/TelegramCore/Account.swift @@ -651,35 +651,27 @@ public class Account { |> distinctUntilChanged |> mapToSignal { [weak self] online -> Signal in if let strongSelf = self { - if online { - let delayRequest: Signal = .complete() |> delay(60.0, queue: Queue.concurrentDefaultQueue()) - let pushStatusOnce = strongSelf.network.request(Api.functions.account.updateStatus(offline: .boolFalse)) - |> retryRequest - |> mapToSignal { _ -> Signal in return .complete() } - let pushStatusRepeatedly = (pushStatusOnce |> then(delayRequest)) |> restart - let peerId = strongSelf.peerId - let updatePresenceLocally = strongSelf.postbox.modify { modifier -> Void in - let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 + 60.0 * 60.0 * 24.0 * 356.0 - modifier.updatePeerPresences([peerId: TelegramUserPresence(status: .present(until: Int32(timestamp)))]) + let delayRequest: Signal = .complete() |> delay(60.0, queue: Queue.concurrentDefaultQueue()) + let pushStatusOnce = strongSelf.network.request(Api.functions.account.updateStatus(offline: online ? .boolFalse : .boolTrue)) + |> retryRequest + |> mapToSignal { _ -> Signal in return .complete() } + let pushStatusRepeatedly = (pushStatusOnce |> then(delayRequest)) |> restart + let peerId = strongSelf.peerId + let updatePresenceLocally = strongSelf.postbox.modify { modifier -> Void in + let timestamp: Double + if online { + timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 + 60.0 * 60.0 * 24.0 * 356.0 + } else { + timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 - 1.0 } - return combineLatest(pushStatusRepeatedly, updatePresenceLocally) - |> mapToSignal { _ -> Signal in return .complete() } - } else { - let pushStatusOnce = strongSelf.network.request(Api.functions.account.updateStatus(offline: .boolTrue)) - |> retryRequest - |> mapToSignal { _ -> Signal in return .complete() } - let peerId = strongSelf.peerId - let updatePresenceLocally = strongSelf.postbox.modify { modifier -> Void in - let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970 - 1.0 - modifier.updatePeerPresences([peerId: TelegramUserPresence(status: .present(until: Int32(timestamp)))]) - } - return combineLatest(pushStatusOnce, updatePresenceLocally) - |> mapToSignal { _ -> Signal in return .complete() } + modifier.updatePeerPresences([peerId: TelegramUserPresence(status: .present(until: Int32(timestamp)))]) } + return combineLatest(pushStatusRepeatedly, updatePresenceLocally) + |> mapToSignal { _ -> Signal in return .complete() } } else { return .complete() } - } + } self.updatedPresenceDisposable.set(updatedPresence.start()) self.deviceContactListDisposable.set(managedDeviceContacts(postbox: self.postbox, network: self.network, deviceContacts: self.deviceContactList.get()).start()) diff --git a/TelegramCore/AccountStateManagementUtils.swift b/TelegramCore/AccountStateManagementUtils.swift index 53bedcdc4a..89450aec68 100644 --- a/TelegramCore/AccountStateManagementUtils.swift +++ b/TelegramCore/AccountStateManagementUtils.swift @@ -936,6 +936,14 @@ private func finalStateWithUpdates(account: Account, state: AccountMutableState, return peer } }) + case let .updateUserPhoto(userId, _, photo, _): + updatedState.updatePeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), { peer in + if let user = peer as? TelegramUser { + return user.withUpdatedPhoto(parsedTelegramProfilePhoto(photo)) + } else { + return peer + } + }) case let .updateUserPhone(userId, phone): updatedState.updatePeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), { peer in if let user = peer as? TelegramUser { diff --git a/TelegramCore/ConvertGroupToSupergroup.swift b/TelegramCore/ConvertGroupToSupergroup.swift index 09e49ef89d..8d4ceab07c 100644 --- a/TelegramCore/ConvertGroupToSupergroup.swift +++ b/TelegramCore/ConvertGroupToSupergroup.swift @@ -18,6 +18,7 @@ public func convertGroupToSupergroup(account: Account, peerId: PeerId) -> Signal |> mapError { _ -> ConvertGroupToSupergroupError in return .generic } + |> timeout(5.0, queue: Queue.concurrentDefaultQueue(), alternate: .fail(.generic)) |> mapToSignal { updates -> Signal in account.stateManager.addUpdates(updates) var createdPeerId: PeerId? diff --git a/TelegramCore/Network.swift b/TelegramCore/Network.swift index b2daad64c6..80963dd3a0 100644 --- a/TelegramCore/Network.swift +++ b/TelegramCore/Network.swift @@ -455,6 +455,7 @@ private final class NetworkHelper: NSObject, MTContextChangeListener { } public final class Network: NSObject, MTRequestMessageServiceDelegate { + private let queue: Queue = Queue() let datacenterId: Int let context: MTContext let mtProto: MTProto @@ -516,7 +517,7 @@ public final class Network: NSObject, MTRequestMessageServiceDelegate { })) requestService.delegate = self - let shouldKeepConnectionSignal = self.shouldKeepConnection.get() + let shouldKeepConnectionSignal = self.shouldKeepConnection.get() |> deliverOn(queue) |> distinctUntilChanged self.shouldKeepConnectionDisposable.set(shouldKeepConnectionSignal.start(next: { [weak self] value in if let strongSelf = self { diff --git a/TelegramCore/RequestUserPhotos.swift b/TelegramCore/RequestUserPhotos.swift index 6be45d2937..3f718fbdc9 100644 --- a/TelegramCore/RequestUserPhotos.swift +++ b/TelegramCore/RequestUserPhotos.swift @@ -13,6 +13,7 @@ import Foundation public struct TelegramPeerPhoto { public let image: TelegramMediaImage + public let reference:TelegramMediaRemoteImageReference public let index:Int public let totalCount:Int } @@ -45,13 +46,16 @@ public func requestPeerPhotos(account:Account, peerId:PeerId) -> Signal<[Telegra for i in 0 ..< photos.count { let photo = photos[i] let image:TelegramMediaImage + let reference: TelegramMediaRemoteImageReference switch photo { case let .photo(data): image = TelegramMediaImage(imageId: MediaId(namespace: Namespaces.Media.CloudImage, id: data.id), representations: telegramMediaImageRepresentationsFromApiSizes(data.sizes)) + reference = .remoteImage(imageId: data.id, accessHash: data.accessHash) case let .photoEmpty(id: id): image = TelegramMediaImage(imageId: MediaId(namespace: Namespaces.Media.CloudImage, id: id), representations: []) + reference = .remoteImage(imageId: id, accessHash: 0) } - images.append(TelegramPeerPhoto(image: image, index: i, totalCount: totalCount)) + images.append(TelegramPeerPhoto(image: image, reference: reference, index: i, totalCount: totalCount)) } return images @@ -116,7 +120,7 @@ public func requestPeerPhotos(account:Account, peerId:PeerId) -> Signal<[Telegra switch media.action { case let .photoUpdated(image): if let image = image { - photos.append(TelegramPeerPhoto(image: image, index: index, totalCount: messages.count)) + photos.append(TelegramPeerPhoto(image: image, reference: .none, index: index, totalCount: messages.count)) } default: break diff --git a/TelegramCore/TelegramMediaImage.swift b/TelegramCore/TelegramMediaImage.swift index 02ce510f0e..dd1ce7763f 100644 --- a/TelegramCore/TelegramMediaImage.swift +++ b/TelegramCore/TelegramMediaImage.swift @@ -7,6 +7,7 @@ import Foundation public enum TelegramMediaRemoteImageReference { case remoteImage(imageId: Int64, accessHash: Int64) + case none } public final class TelegramMediaImage: Media, Equatable { diff --git a/TelegramCore/TelegramUser.swift b/TelegramCore/TelegramUser.swift index 7ecc562ed9..1a2b1f37c1 100644 --- a/TelegramCore/TelegramUser.swift +++ b/TelegramCore/TelegramUser.swift @@ -222,45 +222,61 @@ public final class TelegramUser: Peer { } } +func parsedTelegramProfilePhoto(_ photo: Api.UserProfilePhoto?) -> [TelegramMediaImageRepresentation] { + var telegramPhoto: [TelegramMediaImageRepresentation] = [] + if let photo = photo { + switch photo { + case let .userProfilePhoto(_, photoSmall, photoBig): + if let smallResource = mediaResourceFromApiFileLocation(photoSmall, size: nil), let largeResource = mediaResourceFromApiFileLocation(photoBig, size: nil) { + telegramPhoto.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 80.0, height: 80.0), resource: smallResource)) + telegramPhoto.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: largeResource)) + } + case .userProfilePhotoEmpty: + break + } + } + return telegramPhoto +} + public extension TelegramUser { public convenience init(user: Api.User) { switch user { - case let .user(flags, id, accessHash, firstName, lastName, username, phone, photo, _, _, _, botInlinePlaceholder, _): - var telegramPhoto: [TelegramMediaImageRepresentation] = [] - if let photo = photo { - switch photo { - case let .userProfilePhoto(_, photoSmall, photoBig): - if let smallResource = mediaResourceFromApiFileLocation(photoSmall, size: nil), let largeResource = mediaResourceFromApiFileLocation(photoBig, size: nil) { - telegramPhoto.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 80.0, height: 80.0), resource: smallResource)) - telegramPhoto.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: largeResource)) - } - case .userProfilePhotoEmpty: - break + case let .user(flags, id, accessHash, firstName, lastName, username, phone, photo, _, _, _, botInlinePlaceholder, _): + var telegramPhoto: [TelegramMediaImageRepresentation] = [] + if let photo = photo { + switch photo { + case let .userProfilePhoto(_, photoSmall, photoBig): + if let smallResource = mediaResourceFromApiFileLocation(photoSmall, size: nil), let largeResource = mediaResourceFromApiFileLocation(photoBig, size: nil) { + telegramPhoto.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 80.0, height: 80.0), resource: smallResource)) + telegramPhoto.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: largeResource)) } + case .userProfilePhotoEmpty: + break } - - var userFlags: UserInfoFlags = [] - if (flags & (1 << 17)) != 0 { - userFlags.insert(.isVerified) + } + + var userFlags: UserInfoFlags = [] + if (flags & (1 << 17)) != 0 { + userFlags.insert(.isVerified) + } + + var botInfo: BotUserInfo? + if (flags & (1 << 14)) != 0 { + var botFlags = BotUserInfoFlags() + if (flags & (1 << 15)) != 0 { + botFlags.insert(.hasAccessToChatHistory) } - - var botInfo: BotUserInfo? - if (flags & (1 << 14)) != 0 { - var botFlags = BotUserInfoFlags() - if (flags & (1 << 15)) != 0 { - botFlags.insert(.hasAccessToChatHistory) - } - if (flags & (1 << 16)) == 0 { - botFlags.insert(.worksWithGroups) - } - if (flags & (1 << 21)) == 0 { - botFlags.insert(.requiresGeolocationForInlineRequests) - } - botInfo = BotUserInfo(flags: botFlags, inlinePlaceholder: botInlinePlaceholder) + if (flags & (1 << 16)) == 0 { + botFlags.insert(.worksWithGroups) } - self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), accessHash: accessHash, firstName: firstName, lastName: lastName, username: username, phone: phone, photo: telegramPhoto, botInfo: botInfo, flags: userFlags) - case let .userEmpty(id): - self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, flags: []) + if (flags & (1 << 21)) == 0 { + botFlags.insert(.requiresGeolocationForInlineRequests) + } + botInfo = BotUserInfo(flags: botFlags, inlinePlaceholder: botInlinePlaceholder) + } + self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), accessHash: accessHash, firstName: firstName, lastName: lastName, username: username, phone: phone, photo: telegramPhoto, botInfo: botInfo, flags: userFlags) + case let .userEmpty(id): + self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: id), accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, flags: []) } } From 0671c33ab8961a413478c698b5ea3befb889d83a Mon Sep 17 00:00:00 2001 From: overtake Date: Tue, 19 Sep 2017 19:46:19 +0300 Subject: [PATCH 2/2] no message --- TelegramCore.xcodeproj/project.pbxproj | 8 ++++++++ TelegramCore/TelegramUser.swift | 10 ---------- TelegramCore/module.private-mac.modulemap | 3 +++ 3 files changed, 11 insertions(+), 10 deletions(-) create mode 100644 TelegramCore/module.private-mac.modulemap diff --git a/TelegramCore.xcodeproj/project.pbxproj b/TelegramCore.xcodeproj/project.pbxproj index 15f6b01e9d..cbafd53561 100644 --- a/TelegramCore.xcodeproj/project.pbxproj +++ b/TelegramCore.xcodeproj/project.pbxproj @@ -2328,6 +2328,7 @@ "$(PROJECT_DIR)/third-party/FFmpeg-iOS/lib", "$(PROJECT_DIR)/third-party/libwebp/lib", ); + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private.modulemap"; OTHER_LDFLAGS = "-Wl,-dead_strip"; PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramCore; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2369,6 +2370,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private-mac.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.TelegramCoreMac; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; @@ -2448,6 +2450,7 @@ "$(PROJECT_DIR)/third-party/FFmpeg-iOS/lib", "$(PROJECT_DIR)/third-party/libwebp/lib", ); + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private.modulemap"; OTHER_LDFLAGS = "-Wl,-dead_strip"; PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramCore; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2592,6 +2595,7 @@ "$(PROJECT_DIR)/third-party/FFmpeg-iOS/lib", "$(PROJECT_DIR)/third-party/libwebp/lib", ); + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private.modulemap"; OTHER_LDFLAGS = "-Wl,-dead_strip"; OTHER_SWIFT_FLAGS = "-DDEBUG -Xfrontend -debug-time-function-bodies"; PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramCore; @@ -2629,6 +2633,7 @@ "$(PROJECT_DIR)/third-party/FFmpeg-iOS/lib", "$(PROJECT_DIR)/third-party/libwebp/lib", ); + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private.modulemap"; OTHER_LDFLAGS = "-Wl,-dead_strip"; OTHER_SWIFT_FLAGS = "-DDEBUG -Xfrontend -debug-time-function-bodies"; PRODUCT_BUNDLE_IDENTIFIER = org.telegram.TelegramCore; @@ -2682,6 +2687,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private-mac.modulemap"; OTHER_SWIFT_FLAGS = "-DDEBUG"; PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.TelegramCoreMac; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2712,6 +2718,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private-mac.modulemap"; OTHER_SWIFT_FLAGS = "-DDEBUG"; PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.TelegramCoreMac; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2741,6 +2748,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.11; + MODULEMAP_PRIVATE_FILE = "$(SRCROOT)/TelegramCore/module.private-mac.modulemap"; PRODUCT_BUNDLE_IDENTIFIER = org.telegram.Telegram.TelegramCoreMac; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; diff --git a/TelegramCore/TelegramUser.swift b/TelegramCore/TelegramUser.swift index 0411f7ac0c..2b91f1d71e 100644 --- a/TelegramCore/TelegramUser.swift +++ b/TelegramCore/TelegramUser.swift @@ -226,15 +226,6 @@ func parsedTelegramProfilePhoto(_ photo: Api.UserProfilePhoto?) -> [TelegramMedi var telegramPhoto: [TelegramMediaImageRepresentation] = [] if let photo = photo { switch photo { -<<<<<<< HEAD - case let .userProfilePhoto(_, photoSmall, photoBig): - if let smallResource = mediaResourceFromApiFileLocation(photoSmall, size: nil), let largeResource = mediaResourceFromApiFileLocation(photoBig, size: nil) { - telegramPhoto.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 80.0, height: 80.0), resource: smallResource)) - telegramPhoto.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: largeResource)) - } - case .userProfilePhotoEmpty: - break -======= case let .userProfilePhoto(_, photoSmall, photoBig): if let smallResource = mediaResourceFromApiFileLocation(photoSmall, size: nil), let largeResource = mediaResourceFromApiFileLocation(photoBig, size: nil) { telegramPhoto.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 80.0, height: 80.0), resource: smallResource)) @@ -242,7 +233,6 @@ func parsedTelegramProfilePhoto(_ photo: Api.UserProfilePhoto?) -> [TelegramMedi } case .userProfilePhotoEmpty: break ->>>>>>> 9645d068bc34ff98458140a86db8fc15af4c28dd } } return telegramPhoto diff --git a/TelegramCore/module.private-mac.modulemap b/TelegramCore/module.private-mac.modulemap new file mode 100644 index 0000000000..4d71be2a5a --- /dev/null +++ b/TelegramCore/module.private-mac.modulemap @@ -0,0 +1,3 @@ +module TelegramCoreMac.TelegramCorePrivate { + export * +}