From 0163e793b9a92915cdabfde9d8301c311ce7f4a9 Mon Sep 17 00:00:00 2001 From: Peter <> Date: Thu, 20 Sep 2018 21:26:59 +0100 Subject: [PATCH] no message --- TelegramCore.xcodeproj/project.pbxproj | 6 ++++ TelegramCore/AccountIntermediateState.swift | 20 ++++++------ .../AccountStateManagementUtils.swift | 30 ++++++++++++------ TelegramCore/AccountViewTracker.swift | 4 +-- TelegramCore/EnqueueMessage.swift | 8 ++++- .../PendingMessageUploadedContent.swift | 4 +-- TelegramCore/StoreMessage_Telegram.swift | 3 ++ .../TextEntitiesMessageAttribute.swift | 6 ++-- TelegramCore/UpdateMessageMedia.swift | 31 +++++++++++++++++++ TelegramCore/WebpagePreview.swift | 4 +-- 10 files changed, 87 insertions(+), 29 deletions(-) create mode 100644 TelegramCore/UpdateMessageMedia.swift diff --git a/TelegramCore.xcodeproj/project.pbxproj b/TelegramCore.xcodeproj/project.pbxproj index 3a1cc2e6c6..b7402ef7fe 100644 --- a/TelegramCore.xcodeproj/project.pbxproj +++ b/TelegramCore.xcodeproj/project.pbxproj @@ -148,6 +148,8 @@ D0223A9C1EA5654D00211D94 /* TelegramMediaResource.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0223A9A1EA5654D00211D94 /* TelegramMediaResource.swift */; }; D02395D61F8D09A50070F5C2 /* ChannelHistoryAvailabilitySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02395D51F8D09A50070F5C2 /* ChannelHistoryAvailabilitySettings.swift */; }; D02395D71F8D09A50070F5C2 /* ChannelHistoryAvailabilitySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02395D51F8D09A50070F5C2 /* ChannelHistoryAvailabilitySettings.swift */; }; + D023E67821540624008C27D1 /* UpdateMessageMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = D023E67721540624008C27D1 /* UpdateMessageMedia.swift */; }; + D023E67921540624008C27D1 /* UpdateMessageMedia.swift in Sources */ = {isa = PBXBuildFile; fileRef = D023E67721540624008C27D1 /* UpdateMessageMedia.swift */; }; D026099E20C695AF006C34AC /* Wallpapers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D026099D20C695AF006C34AC /* Wallpapers.swift */; }; D026099F20C695AF006C34AC /* Wallpapers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D026099D20C695AF006C34AC /* Wallpapers.swift */; }; D02609BF20C6EC08006C34AC /* Crypto.m in Sources */ = {isa = PBXBuildFile; fileRef = D02609BE20C6EC08006C34AC /* Crypto.m */; }; @@ -816,6 +818,7 @@ D0223A971EA564BD00211D94 /* MediaResourceNetworkStatsTag.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaResourceNetworkStatsTag.swift; sourceTree = ""; }; D0223A9A1EA5654D00211D94 /* TelegramMediaResource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TelegramMediaResource.swift; sourceTree = ""; }; D02395D51F8D09A50070F5C2 /* ChannelHistoryAvailabilitySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelHistoryAvailabilitySettings.swift; sourceTree = ""; }; + D023E67721540624008C27D1 /* UpdateMessageMedia.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateMessageMedia.swift; sourceTree = ""; }; D026099D20C695AF006C34AC /* Wallpapers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Wallpapers.swift; sourceTree = ""; }; D02609BB20C6EB97006C34AC /* Crypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Crypto.h; sourceTree = ""; }; D02609BE20C6EC08006C34AC /* Crypto.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Crypto.m; sourceTree = ""; }; @@ -1567,6 +1570,7 @@ D0B85AC41F6B2B9400B8B5CE /* RecentlyUsedHashtags.swift */, D0E8B8B22044706300605593 /* ForwardGame.swift */, D0119CAF20CA9EA800895300 /* MarkAllChatsAsRead.swift */, + D023E67721540624008C27D1 /* UpdateMessageMedia.swift */, ); name = Messages; sourceTree = ""; @@ -2089,6 +2093,7 @@ D00D343F1E6ED6E50057B307 /* ConsumableContentMessageAttribute.swift in Sources */, D03B0CE01D62249100955575 /* StoreMessage_Telegram.swift in Sources */, D08774FE1E3E3A3500A97350 /* GlobalNotificationSettings.swift in Sources */, + D023E67821540624008C27D1 /* UpdateMessageMedia.swift in Sources */, D0EE7FC420986C5300981319 /* SecureIdPassportRegistrationValue.swift in Sources */, D00C7CCF1E3628180080C3D5 /* UpdateCachedChannelParticipants.swift in Sources */, D03B0CB91D62233400955575 /* Either.swift in Sources */, @@ -2730,6 +2735,7 @@ D0575AF21E9FFA5D006F2541 /* SynchronizeSavedGifsOperation.swift in Sources */, D0528E661E65C82400E2FEF5 /* UpdateContactName.swift in Sources */, D0EE7FC82098853100981319 /* SecureIdTemporaryRegistrationValue.swift in Sources */, + D023E67921540624008C27D1 /* UpdateMessageMedia.swift in Sources */, D053B4191F18DE5000E2D58A /* AuthorSignatureMessageAttribute.swift in Sources */, D0F7B1E81E045C87007EB8A5 /* PeerParticipants.swift in Sources */, D0C48F3A1E8138DF0075317D /* ArchivedStickerPacksInfo.swift in Sources */, diff --git a/TelegramCore/AccountIntermediateState.swift b/TelegramCore/AccountIntermediateState.swift index 9dd099040c..ffc0f077fc 100644 --- a/TelegramCore/AccountIntermediateState.swift +++ b/TelegramCore/AccountIntermediateState.swift @@ -74,7 +74,7 @@ enum AccountStateMutationOperation { case UpdateIsContact(PeerId, Bool) case UpdateCachedPeerData(PeerId, (CachedPeerData?) -> CachedPeerData?) case MergeApiUsers([Api.User]) - case MergePeerPresences([PeerId: PeerPresence], Bool) + case MergePeerPresences([PeerId: Api.UserStatus], Bool) case UpdateSecretChat(chat: Api.EncryptedChat, timestamp: Int32) case AddSecretMessages([Api.EncryptedMessage]) case ReadSecretOutbox(peerId: PeerId, maxTimestamp: Int32, actionTimestamp: Int32) @@ -268,16 +268,16 @@ struct AccountMutableState { mutating func mergeUsers(_ users: [Api.User]) { self.addOperation(.MergeApiUsers(users)) - var presences: [PeerId: PeerPresence] = [:] + var presences: [PeerId: Api.UserStatus] = [:] for user in users { switch user { - case let .user(_, id, _, _, _, _, _, _, status, _, _, _, _): - if let status = status { - presences[PeerId(namespace: Namespaces.Peer.CloudUser, id: id)] = TelegramUserPresence(apiStatus: status) - } - break - case .userEmpty: - break + case let .user(_, id, _, _, _, _, _, _, status, _, _, _, _): + if let status = status { + presences[PeerId(namespace: Namespaces.Peer.CloudUser, id: id)] = status + } + break + case .userEmpty: + break } } if !presences.isEmpty { @@ -285,7 +285,7 @@ struct AccountMutableState { } } - mutating func mergePeerPresences(_ presences: [PeerId: PeerPresence], explicit: Bool) { + mutating func mergePeerPresences(_ presences: [PeerId: Api.UserStatus], explicit: Bool) { self.addOperation(.MergePeerPresences(presences, explicit)) } diff --git a/TelegramCore/AccountStateManagementUtils.swift b/TelegramCore/AccountStateManagementUtils.swift index ee980f73ae..563477587e 100644 --- a/TelegramCore/AccountStateManagementUtils.swift +++ b/TelegramCore/AccountStateManagementUtils.swift @@ -1055,7 +1055,7 @@ private func finalStateWithUpdatesAndServerTime(account: Account, state: Account return previous.withUpdatedIsBlocked(blocked == .boolTrue) }) case let .updateUserStatus(userId, status): - updatedState.mergePeerPresences([PeerId(namespace: Namespaces.Peer.CloudUser, id: userId): TelegramUserPresence(apiStatus: status)], explicit: true) + updatedState.mergePeerPresences([PeerId(namespace: Namespaces.Peer.CloudUser, id: userId): status], explicit: true) case let .updateUserName(userId, firstName, lastName, username): //TODO add contact checking for apply first and last name updatedState.updatePeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), { peer in @@ -2040,10 +2040,10 @@ func replayFinalState(accountPeerId: PeerId, mediaBox: MediaBox, transaction: Tr return .update(message.withUpdatedLocalTags(updatedLocalTags).withUpdatedFlags(updatedFlags)) }) case let .UpdateMedia(id, media): - transaction.updateMedia(id, update: media) if let media = media as? TelegramMediaWebpage { updatedWebpages[id] = media } + updateMessageMedia(transaction: transaction, id: id, media: media) case let .ReadInbox(messageId): transaction.applyIncomingReadMaxId(messageId) case let .ReadOutbox(messageId): @@ -2143,15 +2143,27 @@ func replayFinalState(accountPeerId: PeerId, mediaBox: MediaBox, transaction: Tr transaction.updatePeerCachedData(peerIds: Set([id]), update: { _, current in return f(current) }) - case let .MergePeerPresences(presences, explicit): - var filteredPresences = presences - if let accountPresence = presences[accountPeerId] { - filteredPresences.removeValue(forKey: accountPeerId) - if explicit, let presence = accountPresence as? TelegramUserPresence, case let .present(until) = presence.status { - delayNotificatonsUntil = until + 30 + case let .MergePeerPresences(statuses, explicit): + var presences: [PeerId: PeerPresence] = [:] + for (peerId, status) in statuses { + if peerId == accountPeerId { + if explicit { + switch status { + case let .userStatusOnline(timestamp): + delayNotificatonsUntil = timestamp + 30 + case let .userStatusOffline(timestamp): + delayNotificatonsUntil = timestamp + default: + break + } + } + } else { + let presence = TelegramUserPresence(apiStatus: status) + presences[peerId] = presence } + } - transaction.updatePeerPresences(filteredPresences) + transaction.updatePeerPresences(presences) case let .UpdateSecretChat(chat, _): updateSecretChat(accountPeerId: accountPeerId, transaction: transaction, chat: chat, requestData: nil) case let .AddSecretMessages(messages): diff --git a/TelegramCore/AccountViewTracker.swift b/TelegramCore/AccountViewTracker.swift index c2218259ff..21919ca44c 100644 --- a/TelegramCore/AccountViewTracker.swift +++ b/TelegramCore/AccountViewTracker.swift @@ -113,12 +113,12 @@ private func fetchWebpage(account: Account, messageId: MessageId) -> Signal UploadedMediaTransform in if let media = mediaReference?.media { if let id = media.id { - transaction.updateMedia(id, update: media) + let _ = transaction.updateMedia(id, update: media) transaction.updateMessage(messageId, update: { currentMessage in var storeForwardInfo: StoreMessageForwardInfo? if let forwardInfo = currentMessage.forwardInfo { @@ -522,7 +522,7 @@ private func uploadedMediaFileContent(network: Network, postbox: Postbox, auxili return postbox.transaction { transaction -> UploadedMediaTransform in if let media = mediaReference?.media { if let id = media.id { - transaction.updateMedia(id, update: media) + let _ = transaction.updateMedia(id, update: media) transaction.updateMessage(messageId, update: { currentMessage in var storeForwardInfo: StoreMessageForwardInfo? if let forwardInfo = currentMessage.forwardInfo { diff --git a/TelegramCore/StoreMessage_Telegram.swift b/TelegramCore/StoreMessage_Telegram.swift index 2005f170aa..a094384d95 100644 --- a/TelegramCore/StoreMessage_Telegram.swift +++ b/TelegramCore/StoreMessage_Telegram.swift @@ -98,6 +98,9 @@ public func tagsForStoreMessage(incoming: Bool, attributes: [MessageAttribute], } } + if !incoming { + assert(true) + } return (tags, globalTags) } diff --git a/TelegramCore/TextEntitiesMessageAttribute.swift b/TelegramCore/TextEntitiesMessageAttribute.swift index 1d14dc8c5c..610af95ff4 100644 --- a/TelegramCore/TextEntitiesMessageAttribute.swift +++ b/TelegramCore/TextEntitiesMessageAttribute.swift @@ -221,11 +221,11 @@ public class TextEntitiesMessageAttribute: MessageAttribute, Equatable { func apiTextAttributeEntities(_ attribute: TextEntitiesMessageAttribute, associatedPeers: SimpleDictionary) -> [Api.MessageEntity] { - var entities:[Api.MessageEntity] = [] + var entities: [Api.MessageEntity] = [] for entity in attribute.entities { - let offset:Int32 = Int32(entity.range.lowerBound) - let length:Int32 = Int32(entity.range.upperBound - entity.range.lowerBound) + let offset: Int32 = Int32(entity.range.lowerBound) + let length: Int32 = Int32(entity.range.upperBound - entity.range.lowerBound) switch entity.type { case .Unknown: break diff --git a/TelegramCore/UpdateMessageMedia.swift b/TelegramCore/UpdateMessageMedia.swift new file mode 100644 index 0000000000..b3ff13b6a3 --- /dev/null +++ b/TelegramCore/UpdateMessageMedia.swift @@ -0,0 +1,31 @@ +import Foundation +#if os(macOS) +import PostboxMac +#else +import Postbox +#endif + +func updateMessageMedia(transaction: Transaction, id: MediaId, media: Media?) { + let updatedMessageIndices = transaction.updateMedia(id, update: media) + for index in updatedMessageIndices { + transaction.updateMessage(index.id, update: { currentMessage in + var textEntities: [MessageTextEntity]? + for attribute in currentMessage.attributes { + if let attribute = attribute as? TextEntitiesMessageAttribute { + textEntities = attribute.entities + break + } + } + let (tags, _) = tagsForStoreMessage(incoming: currentMessage.flags.contains(.Incoming), attributes: currentMessage.attributes, media: currentMessage.media, textEntities: textEntities) + if tags == currentMessage.tags { + return .skip + } + + 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: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: currentMessage.attributes, media: currentMessage.media)) + }) + } +} diff --git a/TelegramCore/WebpagePreview.swift b/TelegramCore/WebpagePreview.swift index b312e2104c..4fc76ced2f 100644 --- a/TelegramCore/WebpagePreview.swift +++ b/TelegramCore/WebpagePreview.swift @@ -47,7 +47,7 @@ public func actualizedWebpage(postbox: Postbox, network: Network, webpage: Teleg |> mapToSignal { result -> Signal in if let updatedWebpage = telegramMediaWebpageFromApiWebpage(result, url: nil), case .Loaded = updatedWebpage.content, updatedWebpage.webpageId == webpage.webpageId { return postbox.transaction { transaction -> TelegramMediaWebpage in - transaction.updateMedia(webpage.webpageId, update: updatedWebpage) + updateMessageMedia(transaction: transaction, id: webpage.webpageId, media: updatedWebpage) return updatedWebpage } } else { @@ -69,7 +69,7 @@ func updatedRemoteWebpage(postbox: Postbox, network: Network, webPage: WebpageRe if let updatedWebpage = telegramMediaWebpageFromApiWebpage(result, url: nil), case .Loaded = updatedWebpage.content, updatedWebpage.webpageId.id == id { return postbox.transaction { transaction -> TelegramMediaWebpage? in if transaction.getMedia(updatedWebpage.webpageId) != nil { - transaction.updateMedia(updatedWebpage.webpageId, update: updatedWebpage) + updateMessageMedia(transaction: transaction, id: updatedWebpage.webpageId, media: updatedWebpage) } return updatedWebpage }