Update reactions

This commit is contained in:
Ali
2022-01-28 01:59:28 +04:00
parent 8edb5f967c
commit 7cd4c4e489
9 changed files with 268 additions and 44 deletions

View File

@@ -3,7 +3,6 @@ import Postbox
import TelegramApi
import SwiftSignalKit
func _internal_installInteractiveReadMessagesAction(postbox: Postbox, stateManager: AccountStateManager, peerId: PeerId) -> Disposable {
return postbox.installStoreMessageAction(peerId: peerId, { messages, transaction in
var consumeMessageIds: [MessageId] = []
@@ -17,7 +16,7 @@ func _internal_installInteractiveReadMessagesAction(postbox: Postbox, stateManag
var hasUnconsumedContent = false
var hasUnseenReactions = false
if message.tags.contains(.unseenPersonalMessage) {
if message.tags.contains(.unseenPersonalMessage) || message.tags.contains(.unseenReaction) {
inner: for attribute in message.attributes {
if let attribute = attribute as? ConsumablePersonalMentionMessageAttribute, !attribute.consumed, !attribute.pending {
hasUnconsumedMention = true
@@ -65,7 +64,9 @@ func _internal_installInteractiveReadMessagesAction(postbox: Postbox, stateManag
}
}
}
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: currentMessage.forwardInfo.flatMap(StoreMessageForwardInfo.init), authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
var tags = currentMessage.tags
tags.remove(.unseenReaction)
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: currentMessage.forwardInfo.flatMap(StoreMessageForwardInfo.init), authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
})
if consumeMessageIds.contains(id) {
@@ -81,3 +82,82 @@ func _internal_installInteractiveReadMessagesAction(postbox: Postbox, stateManag
}
})
}
public struct VisibleMessageRange {
public var lowerBound: MessageIndex
public var upperBound: MessageIndex?
public init(lowerBound: MessageIndex, upperBound: MessageIndex?) {
self.lowerBound = lowerBound
self.upperBound = upperBound
}
fileprivate func contains(index: MessageIndex) -> Bool {
if index < lowerBound {
return false
}
if let upperBound = self.upperBound {
if index > upperBound {
return false
}
}
return true
}
}
private final class StoreOrUpdateMessageActionImpl: StoreOrUpdateMessageAction {
private let getVisibleRange: () -> VisibleMessageRange?
private let didReadReactionsInMessages: ([MessageId: [ReactionsMessageAttribute.RecentPeer]]) -> Void
init(getVisibleRange: @escaping () -> VisibleMessageRange?, didReadReactionsInMessages: @escaping ([MessageId: [ReactionsMessageAttribute.RecentPeer]]) -> Void) {
self.getVisibleRange = getVisibleRange
self.didReadReactionsInMessages = didReadReactionsInMessages
}
func addOrUpdate(messages: [StoreMessage], transaction: Transaction) {
var readReactionIds: [MessageId: [ReactionsMessageAttribute.RecentPeer]] = [:]
guard let visibleRange = self.getVisibleRange() else {
return
}
for message in messages {
guard let index = message.index else {
continue
}
if !visibleRange.contains(index: index) {
continue
}
if message.tags.contains(.unseenReaction) {
inner: for attribute in message.attributes {
if let attribute = attribute as? ReactionsMessageAttribute, attribute.hasUnseen {
readReactionIds[index.id] = attribute.recentPeers
}
}
}
}
for id in readReactionIds.keys {
transaction.updateMessage(id, update: { currentMessage in
var attributes = currentMessage.attributes
reactionsLoop: for j in 0 ..< attributes.count {
if let attribute = attributes[j] as? ReactionsMessageAttribute {
attributes[j] = attribute.withAllSeen()
break reactionsLoop
}
}
var tags = currentMessage.tags
tags.remove(.unseenReaction)
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: currentMessage.forwardInfo.flatMap(StoreMessageForwardInfo.init), authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
})
transaction.setPendingMessageAction(type: .readReaction, id: id, action: ReadReactionAction())
}
self.didReadReactionsInMessages(readReactionIds)
}
}
func _internal_installInteractiveReadReactionsAction(postbox: Postbox, stateManager: AccountStateManager, peerId: PeerId, getVisibleRange: @escaping () -> VisibleMessageRange?, didReadReactionsInMessages: @escaping ([MessageId: [ReactionsMessageAttribute.RecentPeer]]) -> Void) -> Disposable {
return postbox.installStoreOrUpdateMessageAction(peerId: peerId, action: StoreOrUpdateMessageActionImpl(getVisibleRange: getVisibleRange, didReadReactionsInMessages: didReadReactionsInMessages))
}