Report read for live locations

This commit is contained in:
Ali 2019-12-01 17:59:45 +04:00
parent 8eccc02e55
commit 2586a1bc70
3 changed files with 75 additions and 0 deletions

View File

@ -201,6 +201,9 @@ public func legacyLocationController(message: Message?, mapMedia: TelegramMediaM
controller.setLiveLocationsSignal(.single(freezeLocations))
} else {
controller.setLiveLocationsSignal(updatedLocations)
if message.flags.contains(.Incoming) {
context.account.viewTracker.updateSeenLiveLocationForMessageIds(messageIds: Set([message.id]))
}
}
} else {
controller = TGLocationViewController(context: legacyController.context, message: legacyMessage, peer: legacyAuthor, color: venueColor)!

View File

@ -253,6 +253,10 @@ public final class AccountViewTracker {
private var nextUpdatedViewCountDisposableId: Int32 = 0
private var updatedViewCountDisposables = DisposableDict<Int32>()
private var updatedSeenLiveLocationMessageIdsAndTimestamps: [MessageId: Int32] = [:]
private var nextSeenLiveLocationDisposableId: Int32 = 0
private var seenLiveLocationDisposables = DisposableDict<Int32>()
private var updatedUnsupportedMediaMessageIdsAndTimestamps: [MessageId: Int32] = [:]
private var nextUpdatedUnsupportedMediaDisposableId: Int32 = 0
private var updatedUnsupportedMediaDisposables = DisposableDict<Int32>()
@ -584,6 +588,61 @@ public final class AccountViewTracker {
}
}
public func updateSeenLiveLocationForMessageIds(messageIds: Set<MessageId>) {
self.queue.async {
var addedMessageIds: [MessageId] = []
let timestamp = Int32(CFAbsoluteTimeGetCurrent())
for messageId in messageIds {
let messageTimestamp = self.updatedSeenLiveLocationMessageIdsAndTimestamps[messageId]
if messageTimestamp == nil || messageTimestamp! < timestamp - 1 * 60 {
self.updatedSeenLiveLocationMessageIdsAndTimestamps[messageId] = timestamp
addedMessageIds.append(messageId)
}
}
if !addedMessageIds.isEmpty {
for (peerId, messageIds) in messagesIdsGroupedByPeerId(Set(addedMessageIds)) {
let disposableId = self.nextSeenLiveLocationDisposableId
self.nextSeenLiveLocationDisposableId += 1
if let account = self.account {
let signal = (account.postbox.transaction { transaction -> Signal<Void, NoError> in
if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) {
let request: Signal<Bool, MTRpcError>
switch inputPeer {
case .inputPeerChat, .inputPeerSelf, .inputPeerUser:
request = account.network.request(Api.functions.messages.readMessageContents(id: messageIds.map { $0.id }))
|> map { _ in true }
case let .inputPeerChannel(channelId, accessHash):
request = account.network.request(Api.functions.channels.readMessageContents(channel: .inputChannel(channelId: channelId, accessHash: accessHash), id: messageIds.map { $0.id }))
|> map { _ in true }
default:
return .complete()
}
return request
|> `catch` { _ -> Signal<Bool, NoError> in
return .single(false)
}
|> mapToSignal { _ -> Signal<Void, NoError> in
return .complete()
}
} else {
return .complete()
}
}
|> switchToLatest)
|> afterDisposed { [weak self] in
self?.queue.async {
self?.seenLiveLocationDisposables.set(nil, forKey: disposableId)
}
}
self.seenLiveLocationDisposables.set(signal.start(), forKey: disposableId)
}
}
}
}
}
public func updateUnsupportedMediaForMessageIds(messageIds: Set<MessageId>) {
self.queue.async {
var addedMessageIds: [MessageId] = []

View File

@ -398,6 +398,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
private let galleryHiddenMesageAndMediaDisposable = MetaDisposable()
private let messageProcessingManager = ChatMessageThrottledProcessingManager()
private let seenLiveLocationProcessingManager = ChatMessageThrottledProcessingManager()
private let unsupportedMessageProcessingManager = ChatMessageThrottledProcessingManager()
private let messageMentionProcessingManager = ChatMessageThrottledProcessingManager(delay: 0.2)
let prefetchManager: InChatPrefetchManager
@ -471,6 +472,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
self.messageProcessingManager.process = { [weak context] messageIds in
context?.account.viewTracker.updateViewCountForMessageIds(messageIds: messageIds)
}
self.seenLiveLocationProcessingManager.process = { [weak context] messageIds in
context?.account.viewTracker.updateSeenLiveLocationForMessageIds(messageIds: messageIds)
}
self.unsupportedMessageProcessingManager.process = { [weak context] messageIds in
context?.account.viewTracker.updateUnsupportedMediaForMessageIds(messageIds: messageIds)
}
@ -898,6 +902,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
let toLaterRange = (historyView.filteredEntries.count - 1 - (visible.firstIndex - 1), historyView.filteredEntries.count - 1)
var messageIdsWithViewCount: [MessageId] = []
var messageIdsWithLiveLocation: [MessageId] = []
var messageIdsWithUnsupportedMedia: [MessageId] = []
var messageIdsWithUnseenPersonalMention: [MessageId] = []
var messagesWithPreloadableMediaToEarlier: [(Message, Media)] = []
@ -931,6 +936,11 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
for media in message.media {
if let _ = media as? TelegramMediaUnsupported {
contentRequiredValidation = true
} else if message.flags.contains(.Incoming), let media = media as? TelegramMediaMap, let liveBroadcastingTimeout = media.liveBroadcastingTimeout {
let timestamp = Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970)
if message.timestamp + liveBroadcastingTimeout > timestamp {
messageIdsWithLiveLocation.append(message.id)
}
}
}
if contentRequiredValidation {
@ -1035,6 +1045,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
if !messageIdsWithViewCount.isEmpty {
self.messageProcessingManager.add(messageIdsWithViewCount)
}
if !messageIdsWithLiveLocation.isEmpty {
self.seenLiveLocationProcessingManager.add(messageIdsWithLiveLocation)
}
if !messageIdsWithUnsupportedMedia.isEmpty {
self.unsupportedMessageProcessingManager.add(messageIdsWithUnsupportedMedia)
}