mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
Report read for live locations
This commit is contained in:
parent
8eccc02e55
commit
2586a1bc70
@ -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)!
|
||||
|
@ -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] = []
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user