mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-04 21:41:45 +00:00
no message
This commit is contained in:
parent
d6025daae8
commit
d57b82cc15
@ -141,6 +141,10 @@ public final class AccountViewTracker {
|
|||||||
private var pendingWebpageMessageIds: [MessageId: Int] = [:]
|
private var pendingWebpageMessageIds: [MessageId: Int] = [:]
|
||||||
private var webpageDisposables: [MessageId: Disposable] = [:]
|
private var webpageDisposables: [MessageId: Disposable] = [:]
|
||||||
|
|
||||||
|
private var updatedViewCountMessageIdsAndTimestamps: [MessageId: Int32] = [:]
|
||||||
|
private var nextUpdatedViewCountDisposableId: Int32 = 0
|
||||||
|
private var updatedViewCountDisposables = DisposableDict<Int32>()
|
||||||
|
|
||||||
private var cachedDataContexts: [PeerId: PeerCachedDataContext] = [:]
|
private var cachedDataContexts: [PeerId: PeerCachedDataContext] = [:]
|
||||||
private var cachedChannelParticipantsContexts: [PeerId: CachedChannelParticipantsContext] = [:]
|
private var cachedChannelParticipantsContexts: [PeerId: CachedChannelParticipantsContext] = [:]
|
||||||
|
|
||||||
@ -148,6 +152,10 @@ public final class AccountViewTracker {
|
|||||||
self.account = account
|
self.account = account
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
self.updatedViewCountDisposables.dispose()
|
||||||
|
}
|
||||||
|
|
||||||
private func updatePendingWebpages(viewId: Int32, messageIds: Set<MessageId>) {
|
private func updatePendingWebpages(viewId: Int32, messageIds: Set<MessageId>) {
|
||||||
self.queue.async {
|
self.queue.async {
|
||||||
var addedMessageIds: [MessageId] = []
|
var addedMessageIds: [MessageId] = []
|
||||||
@ -208,6 +216,72 @@ public final class AccountViewTracker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func updatedViewCountMessageIds(messageIds: Set<MessageId>) {
|
||||||
|
self.queue.async {
|
||||||
|
var addedMessageIds: [MessageId] = []
|
||||||
|
let timestamp = Int32(CFAbsoluteTimeGetCurrent())
|
||||||
|
for messageId in messageIds {
|
||||||
|
let messageTimestamp = self.updatedViewCountMessageIdsAndTimestamps[messageId]
|
||||||
|
if messageTimestamp == nil || messageTimestamp! < timestamp - 5 * 60 {
|
||||||
|
self.updatedViewCountMessageIdsAndTimestamps[messageId] = timestamp
|
||||||
|
addedMessageIds.append(messageId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !addedMessageIds.isEmpty {
|
||||||
|
for (peerId, messageIds) in messagesIdsGroupedByPeerId(Set(addedMessageIds)) {
|
||||||
|
let disposableId = self.nextUpdatedViewCountDisposableId
|
||||||
|
self.nextUpdatedViewCountDisposableId += 1
|
||||||
|
|
||||||
|
if let account = self.account {
|
||||||
|
let signal = (account.postbox.modify { modifier -> Signal<Void, NoError> in
|
||||||
|
if let peer = modifier.getPeer(peerId), let inputPeer = apiInputPeer(peer) {
|
||||||
|
return account.network.request(Api.functions.messages.getMessagesViews(peer: inputPeer, id: messageIds.map { $0.id }, increment: .boolTrue))
|
||||||
|
|> map { Optional($0) }
|
||||||
|
|> `catch` { _ -> Signal<[Int32]?, NoError> in
|
||||||
|
return .single(nil)
|
||||||
|
}
|
||||||
|
|> mapToSignal { viewCounts -> Signal<Void, NoError> in
|
||||||
|
if let viewCounts = viewCounts {
|
||||||
|
return account.postbox.modify { modifier -> Void in
|
||||||
|
for i in 0 ..< messageIds.count {
|
||||||
|
if i < viewCounts.count {
|
||||||
|
modifier.updateMessage(messageIds[i], update: { currentMessage in
|
||||||
|
var storeForwardInfo: StoreMessageForwardInfo?
|
||||||
|
if let forwardInfo = currentMessage.forwardInfo {
|
||||||
|
storeForwardInfo = StoreMessageForwardInfo(authorId: forwardInfo.author.id, sourceId: forwardInfo.source?.id, sourceMessageId: forwardInfo.sourceMessageId, date: forwardInfo.date)
|
||||||
|
}
|
||||||
|
var attributes = currentMessage.attributes
|
||||||
|
loop: for i in 0 ..< attributes.count {
|
||||||
|
if let attribute = attributes[i] as? ViewCountMessageAttribute {
|
||||||
|
attributes[i] = ViewCountMessageAttribute(count: max(attribute.count, Int(viewCounts[i])))
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return .complete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return .complete()
|
||||||
|
}
|
||||||
|
} |> switchToLatest)
|
||||||
|
|> afterDisposed { [weak self] in
|
||||||
|
self?.queue.async {
|
||||||
|
self?.updatedViewCountDisposables.set(nil, forKey: disposableId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.updatedViewCountDisposables.set(signal.start(), forKey: disposableId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func updateCachedPeerData(peerId: PeerId, viewId: Int32, referenceData: CachedPeerData?) {
|
private func updateCachedPeerData(peerId: PeerId, viewId: Int32, referenceData: CachedPeerData?) {
|
||||||
self.queue.async {
|
self.queue.async {
|
||||||
let context: PeerCachedDataContext
|
let context: PeerCachedDataContext
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user