- update pinned messages

- load cloud messages if necessary
This commit is contained in:
overtake 2017-02-26 16:42:13 +01:00
parent 3f75e3e9f7
commit 658ab3dd4f
5 changed files with 149 additions and 26 deletions

View File

@ -13,6 +13,10 @@
C2366C871E4F403C0097CCFF /* AddressNames.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2366C851E4F403C0097CCFF /* AddressNames.swift */; }; C2366C871E4F403C0097CCFF /* AddressNames.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2366C851E4F403C0097CCFF /* AddressNames.swift */; };
C2366C891E4F40480097CCFF /* SupportPeerId.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2366C881E4F40480097CCFF /* SupportPeerId.swift */; }; C2366C891E4F40480097CCFF /* SupportPeerId.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2366C881E4F40480097CCFF /* SupportPeerId.swift */; };
C2366C8A1E4F40480097CCFF /* SupportPeerId.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2366C881E4F40480097CCFF /* SupportPeerId.swift */; }; C2366C8A1E4F40480097CCFF /* SupportPeerId.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2366C881E4F40480097CCFF /* SupportPeerId.swift */; };
C239BE971E62EE1E00C2C453 /* LoadMessagesIfNecessary.swift in Sources */ = {isa = PBXBuildFile; fileRef = C239BE961E62EE1E00C2C453 /* LoadMessagesIfNecessary.swift */; };
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 */; };
C26A37EF1E5E0C41006977AC /* ChannelParticipants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BB7C591E5C8074001527C3 /* ChannelParticipants.swift */; }; C26A37EF1E5E0C41006977AC /* ChannelParticipants.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0BB7C591E5C8074001527C3 /* ChannelParticipants.swift */; };
C2A315C01E2E776A00D89000 /* RequestStartBot.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01749581E1092BC0057C89A /* RequestStartBot.swift */; }; C2A315C01E2E776A00D89000 /* RequestStartBot.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01749581E1092BC0057C89A /* RequestStartBot.swift */; };
D001F3E81E128A1C007A8C60 /* ChannelState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0CFF1D62255C00955575 /* ChannelState.swift */; }; D001F3E81E128A1C007A8C60 /* ChannelState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B0CFF1D62255C00955575 /* ChannelState.swift */; };
@ -413,6 +417,8 @@
C2366C821E4F3EAA0097CCFF /* GroupReturnAndLeft.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupReturnAndLeft.swift; sourceTree = "<group>"; }; C2366C821E4F3EAA0097CCFF /* GroupReturnAndLeft.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroupReturnAndLeft.swift; sourceTree = "<group>"; };
C2366C851E4F403C0097CCFF /* AddressNames.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressNames.swift; sourceTree = "<group>"; }; C2366C851E4F403C0097CCFF /* AddressNames.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressNames.swift; sourceTree = "<group>"; };
C2366C881E4F40480097CCFF /* SupportPeerId.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SupportPeerId.swift; sourceTree = "<group>"; }; C2366C881E4F40480097CCFF /* SupportPeerId.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SupportPeerId.swift; sourceTree = "<group>"; };
C239BE961E62EE1E00C2C453 /* LoadMessagesIfNecessary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadMessagesIfNecessary.swift; sourceTree = "<group>"; };
C239BE9B1E630CA700C2C453 /* UpdatePinnedMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdatePinnedMessage.swift; sourceTree = "<group>"; };
D003702A1DA42586004308D3 /* PhoneNumber.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneNumber.swift; sourceTree = "<group>"; }; D003702A1DA42586004308D3 /* PhoneNumber.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneNumber.swift; sourceTree = "<group>"; };
D00C7CCB1E3620C30080C3D5 /* CachedChannelParticipants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedChannelParticipants.swift; sourceTree = "<group>"; }; D00C7CCB1E3620C30080C3D5 /* CachedChannelParticipants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachedChannelParticipants.swift; sourceTree = "<group>"; };
D00C7CCE1E3628180080C3D5 /* UpdateCachedChannelParticipants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateCachedChannelParticipants.swift; sourceTree = "<group>"; }; D00C7CCE1E3628180080C3D5 /* UpdateCachedChannelParticipants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UpdateCachedChannelParticipants.swift; sourceTree = "<group>"; };
@ -942,6 +948,7 @@
D02ABC7A1E30058F00CAE539 /* DeleteMessagesInteractively.swift */, D02ABC7A1E30058F00CAE539 /* DeleteMessagesInteractively.swift */,
D0AAD1A91E32638500D5B9DE /* ApplyMaxReadIndexInteractively.swift */, D0AAD1A91E32638500D5B9DE /* ApplyMaxReadIndexInteractively.swift */,
D00C7CDF1E3785700080C3D5 /* MarkMessageContentAsConsumedInteractively.swift */, D00C7CDF1E3785700080C3D5 /* MarkMessageContentAsConsumedInteractively.swift */,
C239BE961E62EE1E00C2C453 /* LoadMessagesIfNecessary.swift */,
); );
name = Messages; name = Messages;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1081,6 +1088,7 @@
D0613FD61E606B3B00202CDB /* ConvertGroupToSupergroup.swift */, D0613FD61E606B3B00202CDB /* ConvertGroupToSupergroup.swift */,
D033FEB21E61F3C000644997 /* ReportPeer.swift */, D033FEB21E61F3C000644997 /* ReportPeer.swift */,
D033FEB51E61F3F900644997 /* BlockedPeers.swift */, D033FEB51E61F3F900644997 /* BlockedPeers.swift */,
C239BE9B1E630CA700C2C453 /* UpdatePinnedMessage.swift */,
); );
name = Peers; name = Peers;
sourceTree = "<group>"; sourceTree = "<group>";
@ -1403,6 +1411,7 @@
D0BEAF5D1E54941B00BD963D /* Authorization.swift in Sources */, D0BEAF5D1E54941B00BD963D /* Authorization.swift in Sources */,
D0B843831DA6EDB8005F29E1 /* CachedGroupData.swift in Sources */, D0B843831DA6EDB8005F29E1 /* CachedGroupData.swift in Sources */,
D0E35A121DE4A25E00BC6096 /* OutgoingChatContextResultMessageAttribute.swift in Sources */, D0E35A121DE4A25E00BC6096 /* OutgoingChatContextResultMessageAttribute.swift in Sources */,
C239BE9C1E630CA700C2C453 /* UpdatePinnedMessage.swift in Sources */,
D0B844531DAC0773005F29E1 /* TelegramUserPresence.swift in Sources */, D0B844531DAC0773005F29E1 /* TelegramUserPresence.swift in Sources */,
D0B843871DA6F705005F29E1 /* UpdateCachedPeerData.swift in Sources */, D0B843871DA6F705005F29E1 /* UpdateCachedPeerData.swift in Sources */,
D03B0D6D1D631AA300955575 /* ContactManagement.swift in Sources */, D03B0D6D1D631AA300955575 /* ContactManagement.swift in Sources */,
@ -1443,6 +1452,7 @@
D03B0E441D631E6600955575 /* NetworkLogging.m in Sources */, D03B0E441D631E6600955575 /* NetworkLogging.m in Sources */,
D03121021DA57E93006A2A60 /* TelegramPeerNotificationSettings.swift in Sources */, D03121021DA57E93006A2A60 /* TelegramPeerNotificationSettings.swift in Sources */,
D03B0CBB1D62233C00955575 /* MergeLists.swift in Sources */, D03B0CBB1D62233C00955575 /* MergeLists.swift in Sources */,
C239BE971E62EE1E00C2C453 /* LoadMessagesIfNecessary.swift in Sources */,
D03B0CC11D62235000955575 /* StringFormat.swift in Sources */, D03B0CC11D62235000955575 /* StringFormat.swift in Sources */,
D0B843C31DA7FF30005F29E1 /* NBPhoneMetaDataGenerator.m in Sources */, D0B843C31DA7FF30005F29E1 /* NBPhoneMetaDataGenerator.m in Sources */,
C2366C861E4F403C0097CCFF /* AddressNames.swift in Sources */, C2366C861E4F403C0097CCFF /* AddressNames.swift in Sources */,
@ -1477,6 +1487,8 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
C239BE9D1E630CB300C2C453 /* UpdatePinnedMessage.swift in Sources */,
C239BE981E62F0D200C2C453 /* LoadMessagesIfNecessary.swift in Sources */,
C26A37EF1E5E0C41006977AC /* ChannelParticipants.swift in Sources */, C26A37EF1E5E0C41006977AC /* ChannelParticipants.swift in Sources */,
D050F26A1E4A5B6D00988324 /* ManagedGlobalNotificationSettings.swift in Sources */, D050F26A1E4A5B6D00988324 /* ManagedGlobalNotificationSettings.swift in Sources */,
D050F26B1E4A5B6D00988324 /* ApplyMaxReadIndexInteractively.swift in Sources */, D050F26B1E4A5B6D00988324 /* ApplyMaxReadIndexInteractively.swift in Sources */,

View File

@ -887,20 +887,6 @@ private func finalStateWithUpdates(account: Account, state: AccountMutableState,
} }
} }
private func messagesIdsGroupedByPeerId(_ ids: Set<MessageId>) -> [PeerId: [MessageId]] {
var dict: [PeerId: [MessageId]] = [:]
for id in ids {
let peerId = id.peerId
if dict[peerId] == nil {
dict[peerId] = [id]
} else {
dict[peerId]!.append(id)
}
}
return dict
}
private func resolveAssociatedMessages(account: Account, state: AccountMutableState) -> Signal<AccountMutableState, NoError> { private func resolveAssociatedMessages(account: Account, state: AccountMutableState) -> Signal<AccountMutableState, NoError> {
let missingMessageIds = state.initialState.messageIds.subtracting(state.storedMessages) let missingMessageIds = state.initialState.messageIds.subtracting(state.storedMessages)

View File

@ -1,13 +1,121 @@
// import Foundation
// LoadMessagesIfNecessary.swift #if os(macOS)
// TelegramCore import PostboxMac
// import SwiftSignalKitMac
// Created by keepcoder on 26/02/2017. import MtProtoKitMac
// Copyright © 2017 Peter. All rights reserved. #else
// import Postbox
import SwiftSignalKit
import MtProtoKitDynamic
#endif
import Cocoa
class LoadMessagesIfNecessary: NSObject {
public enum GetMessagesStrategy {
case local
case cloud
}
public func getMessagesLoadIfNecessary(_ messageIds:[MessageId], postbox:Postbox, network:Network, strategy:GetMessagesStrategy = .cloud) -> Signal <[Message], Void> {
let postboxSignal = postbox.modify { modifier -> ([Message], Set<MessageId>, SimpleDictionary<PeerId, Peer>) in
var messages:[Message] = []
var missingMessageIds:Set<MessageId> = Set()
var supportPeers:SimpleDictionary<PeerId, Peer> = SimpleDictionary()
for messageId in messageIds {
if let message = modifier.getMessage(messageId) {
messages.append(message)
} else {
missingMessageIds.insert(messageId)
if let peer = modifier.getPeer(messageId.peerId) {
supportPeers[messageId.peerId] = peer
}
}
}
return (messages, missingMessageIds, supportPeers)
}
if strategy == .cloud {
return postboxSignal |> mapToSignal { (existMessages, missingMessageIds, supportPeers) in
var signals: [Signal<([Api.Message], [Api.Chat], [Api.User]), NoError>] = []
for (peerId, messageIds) in messagesIdsGroupedByPeerId(missingMessageIds) {
if let peer = supportPeers[peerId] {
var signal: Signal<Api.messages.Messages, MTRpcError>?
if peerId.namespace == Namespaces.Peer.CloudUser || peerId.namespace == Namespaces.Peer.CloudGroup {
signal = network.request(Api.functions.messages.getMessages(id: messageIds.map({ $0.id })))
} else if peerId.namespace == Namespaces.Peer.CloudChannel {
if let inputChannel = apiInputChannel(peer) {
signal = network.request(Api.functions.channels.getMessages(channel: inputChannel, id: messageIds.map({ $0.id })))
}
}
if let signal = signal {
signals.append(signal |> map { result in
switch result {
case let .messages(messages, chats, users):
return (messages, chats, users)
case let .messagesSlice(_, messages, chats, users):
return (messages, chats, users)
case let .channelMessages(_, _, _, messages, chats, users):
return (messages, chats, users)
}
} |> `catch` { _ in
return Signal<([Api.Message], [Api.Chat], [Api.User]), NoError>.single(([], [], []))
})
}
}
}
return combineLatest(signals) |> mapToSignal { results -> Signal<[Message], Void> in
return postbox.modify { modifier -> [Message] in
for (messages, chats, users) in results {
if !messages.isEmpty {
var storeMessages: [StoreMessage] = []
for message in messages {
if let message = StoreMessage(apiMessage: message) {
storeMessages.append(message)
}
}
_ = modifier.addMessages(storeMessages, location: .Random)
}
var peers: [Peer] = []
var peerPresences: [PeerId: PeerPresence] = [:]
for chat in chats {
if let groupOrChannel = parseTelegramGroupOrChannel(chat: chat) {
peers.append(groupOrChannel)
}
}
for user in users {
let telegramUser = TelegramUser(user: user)
peers.append(telegramUser)
if let presence = TelegramUserPresence(apiUser: user) {
peerPresences[telegramUser.id] = presence
}
}
updatePeers(modifier: modifier, peers: peers, update: { _, updated -> Peer in
return updated
})
modifier.updatePeerPresences(peerPresences)
}
var loadedMessages:[Message] = []
for messageId in missingMessageIds {
if let message = modifier.getMessage(messageId) {
loadedMessages.append(message)
}
}
return existMessages + loadedMessages
}
}
}
} else {
return postboxSignal |> map {$0.0}
}
} }

View File

@ -56,3 +56,19 @@ public extension Message {
return false return false
} }
} }
func messagesIdsGroupedByPeerId(_ ids: Set<MessageId>) -> [PeerId: [MessageId]] {
var dict: [PeerId: [MessageId]] = [:]
for id in ids {
let peerId = id.peerId
if dict[peerId] == nil {
dict[peerId] = [id]
} else {
dict[peerId]!.append(id)
}
}
return dict
}

View File

@ -13,7 +13,7 @@ public enum UpdatePinnedMessageError {
case generic case generic
} }
public func updatePinnedMessage(_ pinnedMessageId:MessageId?, for peerId:PeerId, account:Account) -> Signal<Void, UpdatePinnedMessageError> { public func updatePinnedMessage(_ pinnedMessageId:MessageId?, silent:Bool = false, for peerId:PeerId, account:Account) -> Signal<Void, UpdatePinnedMessageError> {
return account.postbox.modify { modifier -> Peer? in return account.postbox.modify { modifier -> Peer? in
return modifier.getPeer(peerId) return modifier.getPeer(peerId)
} |> mapError { () -> UpdatePinnedMessageError in } |> mapError { () -> UpdatePinnedMessageError in
@ -32,7 +32,7 @@ public func updatePinnedMessage(_ pinnedMessageId:MessageId?, for peerId:PeerId,
var flags:Int32 = 0 var flags:Int32 = 0
let messageId:Int32 = pinnedMessageId?.id ?? 0 let messageId:Int32 = pinnedMessageId?.id ?? 0
if messageId > 0 { if silent {
flags |= (1 << 0) flags |= (1 << 0)
} }
@ -43,6 +43,7 @@ public func updatePinnedMessage(_ pinnedMessageId:MessageId?, for peerId:PeerId,
return .generic return .generic
} }
|> mapToSignal { updates -> Signal<Void, UpdatePinnedMessageError> in |> mapToSignal { updates -> Signal<Void, UpdatePinnedMessageError> in
account.stateManager.addUpdates(updates)
return account.postbox.modify { modifier in return account.postbox.modify { modifier in
modifier.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in modifier.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in
if let current = current as? CachedChannelData { if let current = current as? CachedChannelData {