fix reactions push

This commit is contained in:
overtake
2021-12-24 19:22:50 +04:00
parent 447e58f6af
commit b128a7d0fb
3 changed files with 69 additions and 44 deletions

View File

@@ -610,7 +610,7 @@ struct AccountFinalState {
struct AccountReplayedFinalState {
let state: AccountFinalState
let addedIncomingMessageIds: [MessageId]
let addedReactionEvents: [(reactionAuthor: Peer, message: Message, timestamp: Int32)]
let addedReactionEvents: [(reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)]
let wasScheduledMessageIds: [MessageId]
let addedSecretMessageIds: [MessageId]
let deletedMessageIds: [DeletedMessageId]
@@ -628,7 +628,7 @@ struct AccountReplayedFinalState {
struct AccountFinalStateEvents {
let addedIncomingMessageIds: [MessageId]
let addedReactionEvents: [(reactionAuthor: Peer, message: Message, timestamp: Int32)]
let addedReactionEvents: [(reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)]
let wasScheduledMessageIds:[MessageId]
let deletedMessageIds: [DeletedMessageId]
let updatedTypingActivities: [PeerActivitySpace: [PeerId: PeerInputActivity?]]
@@ -651,7 +651,7 @@ struct AccountFinalStateEvents {
return self.addedIncomingMessageIds.isEmpty && self.addedReactionEvents.isEmpty && self.wasScheduledMessageIds.isEmpty && self.deletedMessageIds.isEmpty && self.updatedTypingActivities.isEmpty && self.updatedWebpages.isEmpty && self.updatedCalls.isEmpty && self.addedCallSignalingData.isEmpty && self.updatedGroupCallParticipants.isEmpty && self.updatedPeersNearby?.isEmpty ?? true && self.isContactUpdates.isEmpty && self.displayAlerts.isEmpty && self.delayNotificatonsUntil == nil && self.updatedMaxMessageId == nil && self.updatedQts == nil && self.externallyUpdatedPeerId.isEmpty && !authorizationListUpdated && self.updatedIncomingThreadReadStates.isEmpty && self.updatedOutgoingThreadReadStates.isEmpty
}
init(addedIncomingMessageIds: [MessageId] = [], addedReactionEvents: [(reactionAuthor: Peer, message: Message, timestamp: Int32)] = [], wasScheduledMessageIds: [MessageId] = [], deletedMessageIds: [DeletedMessageId] = [], updatedTypingActivities: [PeerActivitySpace: [PeerId: PeerInputActivity?]] = [:], updatedWebpages: [MediaId: TelegramMediaWebpage] = [:], updatedCalls: [Api.PhoneCall] = [], addedCallSignalingData: [(Int64, Data)] = [], updatedGroupCallParticipants: [(Int64, GroupCallParticipantsContext.Update)] = [], updatedPeersNearby: [PeerNearby]? = nil, isContactUpdates: [(PeerId, Bool)] = [], displayAlerts: [(text: String, isDropAuth: Bool)] = [], delayNotificatonsUntil: Int32? = nil, updatedMaxMessageId: Int32? = nil, updatedQts: Int32? = nil, externallyUpdatedPeerId: Set<PeerId> = Set(), authorizationListUpdated: Bool = false, updatedIncomingThreadReadStates: [MessageId: MessageId.Id] = [:], updatedOutgoingThreadReadStates: [MessageId: MessageId.Id] = [:]) {
init(addedIncomingMessageIds: [MessageId] = [], addedReactionEvents: [(reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)] = [], wasScheduledMessageIds: [MessageId] = [], deletedMessageIds: [DeletedMessageId] = [], updatedTypingActivities: [PeerActivitySpace: [PeerId: PeerInputActivity?]] = [:], updatedWebpages: [MediaId: TelegramMediaWebpage] = [:], updatedCalls: [Api.PhoneCall] = [], addedCallSignalingData: [(Int64, Data)] = [], updatedGroupCallParticipants: [(Int64, GroupCallParticipantsContext.Update)] = [], updatedPeersNearby: [PeerNearby]? = nil, isContactUpdates: [(PeerId, Bool)] = [], displayAlerts: [(text: String, isDropAuth: Bool)] = [], delayNotificatonsUntil: Int32? = nil, updatedMaxMessageId: Int32? = nil, updatedQts: Int32? = nil, externallyUpdatedPeerId: Set<PeerId> = Set(), authorizationListUpdated: Bool = false, updatedIncomingThreadReadStates: [MessageId: MessageId.Id] = [:], updatedOutgoingThreadReadStates: [MessageId: MessageId.Id] = [:]) {
self.addedIncomingMessageIds = addedIncomingMessageIds
self.addedReactionEvents = addedReactionEvents
self.wasScheduledMessageIds = wasScheduledMessageIds

View File

@@ -4,6 +4,49 @@ import SwiftSignalKit
import TelegramApi
import MtProtoKit
private func reactionGeneratedEvent(_ previousReactions: ReactionsMessageAttribute?, _ updatedReactions: ReactionsMessageAttribute?, message: Message, transaction: Transaction) -> (reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)? {
if let updatedReactions = updatedReactions, !message.flags.contains(.Incoming) {
let prev = previousReactions?.reactions ?? []
let updated = updatedReactions.reactions.filter { value in
return !prev.contains(where: {
$0.value == value.value && $0.count == value.count
})
}
let myUpdated = updatedReactions.reactions.filter { value in
return value.isSelected
}.first
let myPrevious = prev.filter { value in
return value.isSelected
}.first
let previousCount = prev.reduce(0, {
$0 + $1.count
})
let updatedCount = updatedReactions.reactions.reduce(0, {
$0 + $1.count
})
let newReaction = updated.filter {
!$0.isSelected
}.first?.value
if !updated.isEmpty && myUpdated == myPrevious, updatedCount >= previousCount, let value = newReaction {
if let topPeer = updatedReactions.recentPeers.last {
if let reactionAuthor = transaction.getPeer(topPeer.peerId) {
return (reactionAuthor: reactionAuthor, reaction: value, message: message, timestamp: Int32(Date().timeIntervalSince1970))
}
} else {
if let reactionAuthor = transaction.getPeer(message.id.peerId) {
return (reactionAuthor: reactionAuthor, reaction: value, message: message, timestamp: Int32(Date().timeIntervalSince1970))
}
}
}
}
return nil
}
private func peerIdsFromUpdateGroups(_ groups: [UpdateGroup]) -> Set<PeerId> {
var peerIds = Set<PeerId>()
@@ -2430,7 +2473,7 @@ func replayFinalState(
}
var wasScheduledMessageIds:[MessageId] = []
var addedIncomingMessageIds: [MessageId] = []
var addedReactionEvents: [(reactionAuthor: Peer, message: Message, timestamp: Int32)] = []
var addedReactionEvents: [(reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)] = []
if !wasOperationScheduledMessageIds.isEmpty {
let existingIds = transaction.filterStoredMessageIds(Set(wasOperationScheduledMessageIds))
@@ -2670,6 +2713,7 @@ func replayFinalState(
invalidateGroupStats.insert(Namespaces.PeerGroup.archive)
}
case let .EditMessage(id, message):
var generatedEvent: (reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)?
transaction.updateMessage(id, update: { previousMessage in
var updatedFlags = message.flags
var updatedLocalTags = message.localTags
@@ -2681,8 +2725,21 @@ func replayFinalState(
} else {
updatedFlags.remove(.Incoming)
}
let peers: [PeerId:Peer] = previousMessage.peers.reduce([:], { current, value in
var current = current
current[value.0] = value.1
return current
})
if let message = locallyRenderedMessage(message: message, peers: peers) {
generatedEvent = reactionGeneratedEvent(previousMessage.reactionsAttribute, message.reactionsAttribute, message: message, transaction: transaction)
}
return .update(message.withUpdatedLocalTags(updatedLocalTags).withUpdatedFlags(updatedFlags))
})
if let generatedEvent = generatedEvent {
addedReactionEvents.append(generatedEvent)
}
case let .UpdateMessagePoll(pollId, apiPoll, results):
if let poll = transaction.getMedia(pollId) as? TelegramMediaPoll {
var updatedPoll = poll
@@ -3230,7 +3287,7 @@ func replayFinalState(
})
}
case let .UpdateMessageReactions(messageId, reactions, eventTimestamp):
var generatedEvent: (reactionAuthor: Peer, message: Message, timestamp: Int32)?
var generatedEvent: (reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)?
transaction.updateMessage(messageId, update: { currentMessage in
var updatedReactions = ReactionsMessageAttribute(apiReactions: reactions)
@@ -3255,38 +3312,7 @@ func replayFinalState(
attributes.append(updatedReactions)
}
if let eventTimestamp = eventTimestamp, !currentMessage.flags.contains(.Incoming), let chatPeer = currentMessage.peers[currentMessage.id.peerId] {
let _ = chatPeer
var previousCount = 0
if let previousReactions = previousReactions {
for reaction in previousReactions.reactions {
previousCount += Int(reaction.count)
}
}
var updatedCount = 0
for reaction in updatedReactions.reactions {
updatedCount += Int(reaction.count)
}
if updatedCount > previousCount {
if let topPeer = updatedReactions.recentPeers.last {
var wasPresentBefore = false
if let previousReactions = previousReactions {
for recentPeer in previousReactions.recentPeers {
if recentPeer.peerId == topPeer.peerId {
wasPresentBefore = true
break
}
}
}
if !wasPresentBefore, let reactionAuthor = transaction.getPeer(topPeer.peerId), transaction.isPeerContact(peerId: topPeer.peerId) {
generatedEvent = (reactionAuthor: reactionAuthor, message: currentMessage.withUpdatedAttributes(attributes), timestamp: eventTimestamp)
}
}
}
}
generatedEvent = reactionGeneratedEvent(previousReactions, updatedReactions, message: currentMessage, transaction: transaction)
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: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
})

View File

@@ -105,8 +105,8 @@ public final class AccountStateManager {
return self.notificationMessagesPipe.signal()
}
private let reactionNotificationsPipe = ValuePipe<[(reactionAuthor: Peer, message: Message)]>()
public var reactionNotifications: Signal<[(reactionAuthor: Peer, message: Message)], NoError> {
private let reactionNotificationsPipe = ValuePipe<[(reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)]>()
public var reactionNotifications: Signal<[(reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)], NoError> {
return self.reactionNotificationsPipe.signal()
}
@@ -746,16 +746,15 @@ public final class AccountStateManager {
let timestamp = Int32(Date().timeIntervalSince1970)
let minReactionTimestamp = timestamp - 20
let reactionEvents = events.addedReactionEvents.compactMap { event -> (reactionAuthor: Peer, message: Message)? in
let reactionEvents = events.addedReactionEvents.compactMap { event -> (reactionAuthor: Peer, reaction: String, message: Message, timestamp: Int32)? in
if event.timestamp >= minReactionTimestamp {
return (event.reactionAuthor, event.message)
return (event.reactionAuthor, event.reaction, event.message, event.timestamp)
} else {
return nil
}
}
if !reactionEvents.isEmpty {
self.reactionNotificationsPipe.putNext(reactionEvents)
}
if !events.displayAlerts.isEmpty {
self.displayAlertsPipe.putNext(events.displayAlerts)