From 5cdce4b21ad190f13f684b3bba052bc465ab2abf Mon Sep 17 00:00:00 2001 From: Isaac <> Date: Sat, 24 May 2025 22:42:26 +0800 Subject: [PATCH] Support monoforum reactions --- submodules/TelegramApi/Sources/Api0.swift | 6 +-- submodules/TelegramApi/Sources/Api23.swift | 24 +++++---- submodules/TelegramApi/Sources/Api26.swift | 52 +++++++++++------- submodules/TelegramApi/Sources/Api38.swift | 14 ++--- .../Account/AccountIntermediateState.swift | 10 ++-- .../TelegramCore/Sources/ForumChannels.swift | 4 +- .../State/AccountStateManagementUtils.swift | 54 ++++++++++++------- .../Sources/State/AccountViewTracker.swift | 4 +- .../State/HistoryViewStateValidation.swift | 2 +- .../TelegramCore/Sources/State/Holes.swift | 10 +++- ...kAllUnseenPersonalMessagesOperations.swift | 22 +++++++- ...rkAllUnseenPersonalMessagesOperation.swift | 6 +-- ...rkAllUnseenPersonalMessagesOperation.swift | 10 +++- 13 files changed, 143 insertions(+), 75 deletions(-) diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 0875ba38b9..882d494eb8 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -872,7 +872,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1054465340] = { return Api.RichText.parse_textUnderline($0) } dict[1009288385] = { return Api.RichText.parse_textUrl($0) } dict[289586518] = { return Api.SavedContact.parse_savedPhoneContact($0) } - dict[2099641667] = { return Api.SavedDialog.parse_monoForumDialog($0) } + dict[1681948327] = { return Api.SavedDialog.parse_monoForumDialog($0) } dict[-1115174036] = { return Api.SavedDialog.parse_savedDialog($0) } dict[-881854424] = { return Api.SavedReactionTag.parse_savedReactionTag($0) } dict[-539360103] = { return Api.SavedStarGift.parse_savedStarGift($0) } @@ -1040,7 +1040,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1738720581] = { return Api.Update.parse_updateChannelParticipant($0) } dict[422509539] = { return Api.Update.parse_updateChannelPinnedTopic($0) } dict[-31881726] = { return Api.Update.parse_updateChannelPinnedTopics($0) } - dict[-366410403] = { return Api.Update.parse_updateChannelReadMessagesContents($0) } + dict[636691703] = { return Api.Update.parse_updateChannelReadMessagesContents($0) } dict[277713951] = { return Api.Update.parse_updateChannelTooLong($0) } dict[-1937192669] = { return Api.Update.parse_updateChannelUserTyping($0) } dict[129403168] = { return Api.Update.parse_updateChannelViewForumAsMessages($0) } @@ -1087,7 +1087,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1318109142] = { return Api.Update.parse_updateMessageID($0) } dict[-1398708869] = { return Api.Update.parse_updateMessagePoll($0) } dict[619974263] = { return Api.Update.parse_updateMessagePollVote($0) } - dict[1578843320] = { return Api.Update.parse_updateMessageReactions($0) } + dict[506035194] = { return Api.Update.parse_updateMessageReactions($0) } dict[-2030252155] = { return Api.Update.parse_updateMoveStickerSetToTop($0) } dict[-1991136273] = { return Api.Update.parse_updateNewAuthorization($0) } dict[1656358105] = { return Api.Update.parse_updateNewChannelMessage($0) } diff --git a/submodules/TelegramApi/Sources/Api23.swift b/submodules/TelegramApi/Sources/Api23.swift index 2915ff9ee4..f9353065f0 100644 --- a/submodules/TelegramApi/Sources/Api23.swift +++ b/submodules/TelegramApi/Sources/Api23.swift @@ -48,14 +48,14 @@ public extension Api { } public extension Api { indirect enum SavedDialog: TypeConstructorDescription { - case monoForumDialog(flags: Int32, peer: Api.Peer, topMessage: Int32, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, draft: Api.DraftMessage?) + case monoForumDialog(flags: Int32, peer: Api.Peer, topMessage: Int32, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, unreadReactionsCount: Int32, draft: Api.DraftMessage?) case savedDialog(flags: Int32, peer: Api.Peer, topMessage: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .monoForumDialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let draft): + case .monoForumDialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadReactionsCount, let draft): if boxed { - buffer.appendInt32(2099641667) + buffer.appendInt32(1681948327) } serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) @@ -63,6 +63,7 @@ public extension Api { serializeInt32(readInboxMaxId, buffer: buffer, boxed: false) serializeInt32(readOutboxMaxId, buffer: buffer, boxed: false) serializeInt32(unreadCount, buffer: buffer, boxed: false) + serializeInt32(unreadReactionsCount, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 1) != 0 {draft!.serialize(buffer, true)} break case .savedDialog(let flags, let peer, let topMessage): @@ -78,8 +79,8 @@ public extension Api { public func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .monoForumDialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let draft): - return ("monoForumDialog", [("flags", flags as Any), ("peer", peer as Any), ("topMessage", topMessage as Any), ("readInboxMaxId", readInboxMaxId as Any), ("readOutboxMaxId", readOutboxMaxId as Any), ("unreadCount", unreadCount as Any), ("draft", draft as Any)]) + case .monoForumDialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadReactionsCount, let draft): + return ("monoForumDialog", [("flags", flags as Any), ("peer", peer as Any), ("topMessage", topMessage as Any), ("readInboxMaxId", readInboxMaxId as Any), ("readOutboxMaxId", readOutboxMaxId as Any), ("unreadCount", unreadCount as Any), ("unreadReactionsCount", unreadReactionsCount as Any), ("draft", draft as Any)]) case .savedDialog(let flags, let peer, let topMessage): return ("savedDialog", [("flags", flags as Any), ("peer", peer as Any), ("topMessage", topMessage as Any)]) } @@ -100,9 +101,11 @@ public extension Api { _5 = reader.readInt32() var _6: Int32? _6 = reader.readInt32() - var _7: Api.DraftMessage? + var _7: Int32? + _7 = reader.readInt32() + var _8: Api.DraftMessage? if Int(_1!) & Int(1 << 1) != 0 {if let signature = reader.readInt32() { - _7 = Api.parse(reader, signature: signature) as? Api.DraftMessage + _8 = Api.parse(reader, signature: signature) as? Api.DraftMessage } } let _c1 = _1 != nil let _c2 = _2 != nil @@ -110,9 +113,10 @@ public extension Api { let _c4 = _4 != nil let _c5 = _5 != nil let _c6 = _6 != nil - let _c7 = (Int(_1!) & Int(1 << 1) == 0) || _7 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 { - return Api.SavedDialog.monoForumDialog(flags: _1!, peer: _2!, topMessage: _3!, readInboxMaxId: _4!, readOutboxMaxId: _5!, unreadCount: _6!, draft: _7) + let _c7 = _7 != nil + let _c8 = (Int(_1!) & Int(1 << 1) == 0) || _8 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 { + return Api.SavedDialog.monoForumDialog(flags: _1!, peer: _2!, topMessage: _3!, readInboxMaxId: _4!, readOutboxMaxId: _5!, unreadCount: _6!, unreadReactionsCount: _7!, draft: _8) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api26.swift b/submodules/TelegramApi/Sources/Api26.swift index 84126e260d..c001972a2d 100644 --- a/submodules/TelegramApi/Sources/Api26.swift +++ b/submodules/TelegramApi/Sources/Api26.swift @@ -1012,7 +1012,7 @@ public extension Api { case updateChannelParticipant(flags: Int32, channelId: Int64, date: Int32, actorId: Int64, userId: Int64, prevParticipant: Api.ChannelParticipant?, newParticipant: Api.ChannelParticipant?, invite: Api.ExportedChatInvite?, qts: Int32) case updateChannelPinnedTopic(flags: Int32, channelId: Int64, topicId: Int32) case updateChannelPinnedTopics(flags: Int32, channelId: Int64, order: [Int32]?) - case updateChannelReadMessagesContents(flags: Int32, channelId: Int64, topMsgId: Int32?, messages: [Int32]) + case updateChannelReadMessagesContents(flags: Int32, channelId: Int64, topMsgId: Int32?, savedPeerId: Api.Peer?, messages: [Int32]) case updateChannelTooLong(flags: Int32, channelId: Int64, pts: Int32?) case updateChannelUserTyping(flags: Int32, channelId: Int64, topMsgId: Int32?, fromId: Api.Peer, action: Api.SendMessageAction) case updateChannelViewForumAsMessages(channelId: Int64, enabled: Api.Bool) @@ -1059,7 +1059,7 @@ public extension Api { case updateMessageID(id: Int32, randomId: Int64) case updateMessagePoll(flags: Int32, pollId: Int64, poll: Api.Poll?, results: Api.PollResults) case updateMessagePollVote(pollId: Int64, peer: Api.Peer, options: [Buffer], qts: Int32) - case updateMessageReactions(flags: Int32, peer: Api.Peer, msgId: Int32, topMsgId: Int32?, reactions: Api.MessageReactions) + case updateMessageReactions(flags: Int32, peer: Api.Peer, msgId: Int32, topMsgId: Int32?, savedPeerId: Api.Peer?, reactions: Api.MessageReactions) case updateMoveStickerSetToTop(flags: Int32, stickerset: Int64) case updateNewAuthorization(flags: Int32, hash: Int64, date: Int32?, device: String?, location: String?) case updateNewChannelMessage(message: Api.Message, pts: Int32, ptsCount: Int32) @@ -1426,13 +1426,14 @@ public extension Api { serializeInt32(item, buffer: buffer, boxed: false) }} break - case .updateChannelReadMessagesContents(let flags, let channelId, let topMsgId, let messages): + case .updateChannelReadMessagesContents(let flags, let channelId, let topMsgId, let savedPeerId, let messages): if boxed { - buffer.appendInt32(-366410403) + buffer.appendInt32(636691703) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt64(channelId, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 0) != 0 {serializeInt32(topMsgId!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 1) != 0 {savedPeerId!.serialize(buffer, true)} buffer.appendInt32(481674261) buffer.appendInt32(Int32(messages.count)) for item in messages { @@ -1846,14 +1847,15 @@ public extension Api { } serializeInt32(qts, buffer: buffer, boxed: false) break - case .updateMessageReactions(let flags, let peer, let msgId, let topMsgId, let reactions): + case .updateMessageReactions(let flags, let peer, let msgId, let topMsgId, let savedPeerId, let reactions): if boxed { - buffer.appendInt32(1578843320) + buffer.appendInt32(506035194) } serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) serializeInt32(msgId, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 0) != 0 {serializeInt32(topMsgId!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 1) != 0 {savedPeerId!.serialize(buffer, true)} reactions.serialize(buffer, true) break case .updateMoveStickerSetToTop(let flags, let stickerset): @@ -2461,8 +2463,8 @@ public extension Api { return ("updateChannelPinnedTopic", [("flags", flags as Any), ("channelId", channelId as Any), ("topicId", topicId as Any)]) case .updateChannelPinnedTopics(let flags, let channelId, let order): return ("updateChannelPinnedTopics", [("flags", flags as Any), ("channelId", channelId as Any), ("order", order as Any)]) - case .updateChannelReadMessagesContents(let flags, let channelId, let topMsgId, let messages): - return ("updateChannelReadMessagesContents", [("flags", flags as Any), ("channelId", channelId as Any), ("topMsgId", topMsgId as Any), ("messages", messages as Any)]) + case .updateChannelReadMessagesContents(let flags, let channelId, let topMsgId, let savedPeerId, let messages): + return ("updateChannelReadMessagesContents", [("flags", flags as Any), ("channelId", channelId as Any), ("topMsgId", topMsgId as Any), ("savedPeerId", savedPeerId as Any), ("messages", messages as Any)]) case .updateChannelTooLong(let flags, let channelId, let pts): return ("updateChannelTooLong", [("flags", flags as Any), ("channelId", channelId as Any), ("pts", pts as Any)]) case .updateChannelUserTyping(let flags, let channelId, let topMsgId, let fromId, let action): @@ -2555,8 +2557,8 @@ public extension Api { return ("updateMessagePoll", [("flags", flags as Any), ("pollId", pollId as Any), ("poll", poll as Any), ("results", results as Any)]) case .updateMessagePollVote(let pollId, let peer, let options, let qts): return ("updateMessagePollVote", [("pollId", pollId as Any), ("peer", peer as Any), ("options", options as Any), ("qts", qts as Any)]) - case .updateMessageReactions(let flags, let peer, let msgId, let topMsgId, let reactions): - return ("updateMessageReactions", [("flags", flags as Any), ("peer", peer as Any), ("msgId", msgId as Any), ("topMsgId", topMsgId as Any), ("reactions", reactions as Any)]) + case .updateMessageReactions(let flags, let peer, let msgId, let topMsgId, let savedPeerId, let reactions): + return ("updateMessageReactions", [("flags", flags as Any), ("peer", peer as Any), ("msgId", msgId as Any), ("topMsgId", topMsgId as Any), ("savedPeerId", savedPeerId as Any), ("reactions", reactions as Any)]) case .updateMoveStickerSetToTop(let flags, let stickerset): return ("updateMoveStickerSetToTop", [("flags", flags as Any), ("stickerset", stickerset as Any)]) case .updateNewAuthorization(let flags, let hash, let date, let device, let location): @@ -3367,16 +3369,21 @@ public extension Api { _2 = reader.readInt64() var _3: Int32? if Int(_1!) & Int(1 << 0) != 0 {_3 = reader.readInt32() } - var _4: [Int32]? + var _4: Api.Peer? + if Int(_1!) & Int(1 << 1) != 0 {if let signature = reader.readInt32() { + _4 = Api.parse(reader, signature: signature) as? Api.Peer + } } + var _5: [Int32]? if let _ = reader.readInt32() { - _4 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) + _5 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = (Int(_1!) & Int(1 << 0) == 0) || _3 != nil - let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.Update.updateChannelReadMessagesContents(flags: _1!, channelId: _2!, topMsgId: _3, messages: _4!) + let _c4 = (Int(_1!) & Int(1 << 1) == 0) || _4 != nil + let _c5 = _5 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 { + return Api.Update.updateChannelReadMessagesContents(flags: _1!, channelId: _2!, topMsgId: _3, savedPeerId: _4, messages: _5!) } else { return nil @@ -4202,17 +4209,22 @@ public extension Api { _3 = reader.readInt32() var _4: Int32? if Int(_1!) & Int(1 << 0) != 0 {_4 = reader.readInt32() } - var _5: Api.MessageReactions? + var _5: Api.Peer? + if Int(_1!) & Int(1 << 1) != 0 {if let signature = reader.readInt32() { + _5 = Api.parse(reader, signature: signature) as? Api.Peer + } } + var _6: Api.MessageReactions? if let signature = reader.readInt32() { - _5 = Api.parse(reader, signature: signature) as? Api.MessageReactions + _6 = Api.parse(reader, signature: signature) as? Api.MessageReactions } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil let _c4 = (Int(_1!) & Int(1 << 0) == 0) || _4 != nil - let _c5 = _5 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 { - return Api.Update.updateMessageReactions(flags: _1!, peer: _2!, msgId: _3!, topMsgId: _4, reactions: _5!) + let _c5 = (Int(_1!) & Int(1 << 1) == 0) || _5 != nil + let _c6 = _6 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 { + return Api.Update.updateMessageReactions(flags: _1!, peer: _2!, msgId: _3!, topMsgId: _4, savedPeerId: _5, reactions: _6!) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api38.swift b/submodules/TelegramApi/Sources/Api38.swift index c602f4ff7f..f244a6ac73 100644 --- a/submodules/TelegramApi/Sources/Api38.swift +++ b/submodules/TelegramApi/Sources/Api38.swift @@ -7149,18 +7149,19 @@ public extension Api.functions.messages { } } public extension Api.functions.messages { - static func getUnreadReactions(flags: Int32, peer: Api.InputPeer, topMsgId: Int32?, offsetId: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + static func getUnreadReactions(flags: Int32, peer: Api.InputPeer, topMsgId: Int32?, savedPeerId: Api.InputPeer?, offsetId: Int32, addOffset: Int32, limit: Int32, maxId: Int32, minId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(841173339) + buffer.appendInt32(-1115713364) serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) if Int(flags) & Int(1 << 0) != 0 {serializeInt32(topMsgId!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 1) != 0 {savedPeerId!.serialize(buffer, true)} serializeInt32(offsetId, buffer: buffer, boxed: false) serializeInt32(addOffset, buffer: buffer, boxed: false) serializeInt32(limit, buffer: buffer, boxed: false) serializeInt32(maxId, buffer: buffer, boxed: false) serializeInt32(minId, buffer: buffer, boxed: false) - return (FunctionDescription(name: "messages.getUnreadReactions", parameters: [("flags", String(describing: flags)), ("peer", String(describing: peer)), ("topMsgId", String(describing: topMsgId)), ("offsetId", String(describing: offsetId)), ("addOffset", String(describing: addOffset)), ("limit", String(describing: limit)), ("maxId", String(describing: maxId)), ("minId", String(describing: minId))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.Messages? in + return (FunctionDescription(name: "messages.getUnreadReactions", parameters: [("flags", String(describing: flags)), ("peer", String(describing: peer)), ("topMsgId", String(describing: topMsgId)), ("savedPeerId", String(describing: savedPeerId)), ("offsetId", String(describing: offsetId)), ("addOffset", String(describing: addOffset)), ("limit", String(describing: limit)), ("maxId", String(describing: maxId)), ("minId", String(describing: minId))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.Messages? in let reader = BufferReader(buffer) var result: Api.messages.Messages? if let signature = reader.readInt32() { @@ -7479,13 +7480,14 @@ public extension Api.functions.messages { } } public extension Api.functions.messages { - static func readReactions(flags: Int32, peer: Api.InputPeer, topMsgId: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + static func readReactions(flags: Int32, peer: Api.InputPeer, topMsgId: Int32?, savedPeerId: Api.InputPeer?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(1420459918) + buffer.appendInt32(-1631301741) serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) if Int(flags) & Int(1 << 0) != 0 {serializeInt32(topMsgId!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.readReactions", parameters: [("flags", String(describing: flags)), ("peer", String(describing: peer)), ("topMsgId", String(describing: topMsgId))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.AffectedHistory? in + if Int(flags) & Int(1 << 1) != 0 {savedPeerId!.serialize(buffer, true)} + return (FunctionDescription(name: "messages.readReactions", parameters: [("flags", String(describing: flags)), ("peer", String(describing: peer)), ("topMsgId", String(describing: topMsgId)), ("savedPeerId", String(describing: savedPeerId))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.AffectedHistory? in let reader = BufferReader(buffer) var result: Api.messages.AffectedHistory? if let signature = reader.readInt32() { diff --git a/submodules/TelegramCore/Sources/Account/AccountIntermediateState.swift b/submodules/TelegramCore/Sources/Account/AccountIntermediateState.swift index 53e4d60cfd..c4311f0405 100644 --- a/submodules/TelegramCore/Sources/Account/AccountIntermediateState.swift +++ b/submodules/TelegramCore/Sources/Account/AccountIntermediateState.swift @@ -67,7 +67,7 @@ enum AccountStateMutationOperation { case DeleteMessages([MessageId]) case EditMessage(MessageId, StoreMessage) case UpdateMessagePoll(MediaId, Api.Poll?, Api.PollResults) - case UpdateMessageReactions(MessageId, Api.MessageReactions, Int32?) + case UpdateMessageReactions(MessageId, Int64?, Api.MessageReactions, Int32?) case UpdateMedia(MediaId, Media?) case ReadInbox(MessageId) case ReadOutbox(MessageId, Int32?) @@ -97,7 +97,7 @@ enum AccountStateMutationOperation { case UpdatePinnedSavedItemIds(AccountStateUpdatePinnedItemIdsOperation) case UpdatePinnedTopic(peerId: PeerId, threadId: Int64, isPinned: Bool) case UpdatePinnedTopicOrder(peerId: PeerId, threadIds: [Int64]) - case ReadMessageContents(peerIdsAndMessageIds: (PeerId?, [Int32]), date: Int32?) + case ReadMessageContents(peerIdsAndMessageIds: (PeerId?, Int64?, [Int32]), date: Int32?) case UpdateMessageImpressionCount(MessageId, Int32) case UpdateMessageForwardsCount(MessageId, Int32) case UpdateInstalledStickerPacks(AccountStateUpdateStickerPacksOperation) @@ -376,8 +376,8 @@ struct AccountMutableState { self.addOperation(.UpdateMessagePoll(id, poll, results)) } - mutating func updateMessageReactions(_ messageId: MessageId, reactions: Api.MessageReactions, eventTimestamp: Int32?) { - self.addOperation(.UpdateMessageReactions(messageId, reactions, eventTimestamp)) + mutating func updateMessageReactions(_ messageId: MessageId, threadId: Int64?, reactions: Api.MessageReactions, eventTimestamp: Int32?) { + self.addOperation(.UpdateMessageReactions(messageId, threadId, reactions, eventTimestamp)) } mutating func updateMedia(_ id: MediaId, media: Media?) { @@ -608,7 +608,7 @@ struct AccountMutableState { self.addOperation(.UpdatePinnedTopicOrder(peerId: peerId, threadIds: threadIds)) } - mutating func addReadMessagesContents(_ peerIdsAndMessageIds: (PeerId?, [Int32]), date: Int32?) { + mutating func addReadMessagesContents(_ peerIdsAndMessageIds: (PeerId?, Int64?, [Int32]), date: Int32?) { self.addOperation(.ReadMessageContents(peerIdsAndMessageIds: peerIdsAndMessageIds, date: date)) } diff --git a/submodules/TelegramCore/Sources/ForumChannels.swift b/submodules/TelegramCore/Sources/ForumChannels.swift index 6febb45e68..a114815f47 100644 --- a/submodules/TelegramCore/Sources/ForumChannels.swift +++ b/submodules/TelegramCore/Sources/ForumChannels.swift @@ -821,7 +821,7 @@ func _internal_requestMessageHistoryThreads(accountPeerId: PeerId, postbox: Post index: topicIndex, threadPeer: threadPeer )) - case let .monoForumDialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, _): + case let .monoForumDialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadReactionsCount, _): let isMarkedUnread = (flags & (1 << 3)) != 0 let data = MessageHistoryThreadData( creationDate: 0, @@ -871,7 +871,7 @@ func _internal_requestMessageHistoryThreads(accountPeerId: PeerId, postbox: Post data: data, topMessage: topMessage, unreadMentionsCount: 0, - unreadReactionsCount: 0, + unreadReactionsCount: unreadReactionsCount, index: topicIndex, threadPeer: threadPeer )) diff --git a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift index ef9f61a669..7f99ebc3e2 100644 --- a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift @@ -1538,10 +1538,15 @@ private func finalStateWithUpdatesAndServerTime(accountPeerId: PeerId, postbox: let isPinned = (flags & (1 << 0)) != 0 updatedState.addUpdatePinnedTopic(peerId: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(channelId)), threadId: Int64(topicId), isPinned: isPinned) case let .updateReadMessagesContents(_, messages, _, _, date): - updatedState.addReadMessagesContents((nil, messages), date: date) - case let .updateChannelReadMessagesContents(_, channelId, topMsgId, messages): - let _ = topMsgId - updatedState.addReadMessagesContents((PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(channelId)), messages), date: nil) + updatedState.addReadMessagesContents((nil, nil, messages), date: date) + case let .updateChannelReadMessagesContents(_, channelId, topMsgId, savedPeerId, messages): + var threadId: Int64? + if let savedPeerId { + threadId = savedPeerId.peerId.toInt64() + } else if let topMsgId { + threadId = Int64(topMsgId) + } + updatedState.addReadMessagesContents((PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(channelId)), threadId, messages), date: nil) case let .updateChannelMessageViews(channelId, id, views): updatedState.addUpdateMessageImpressionCount(id: MessageId(peerId: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(channelId)), namespace: Namespaces.Message.Cloud, id: id), count: views) /*case let .updateChannelMessageForwards(channelId, id, forwards): @@ -1794,8 +1799,15 @@ private func finalStateWithUpdatesAndServerTime(accountPeerId: PeerId, postbox: return current } }) - case let .updateMessageReactions(_, peer, msgId, _, reactions): - updatedState.updateMessageReactions(MessageId(peerId: peer.peerId, namespace: Namespaces.Message.Cloud, id: msgId), reactions: reactions, eventTimestamp: updatesDate) + case let .updateMessageReactions(_, peer, msgId, topMsgId, savedPeerId, reactions): + var threadId: Int64? + if let savedPeerId { + threadId = savedPeerId.peerId.toInt64() + } else if let topMsgId { + threadId = Int64(topMsgId) + } + + updatedState.updateMessageReactions(MessageId(peerId: peer.peerId, namespace: Namespaces.Message.Cloud, id: msgId), threadId: threadId, reactions: reactions, eventTimestamp: updatesDate) case .updateAttachMenuBots: updatedState.addUpdateAttachMenuBots() case let .updateWebViewResultSent(queryId): @@ -2108,8 +2120,7 @@ func resolveForumThreads(accountPeerId: PeerId, postbox: Postbox, source: FetchM } case let .savedDialog(savedDialog): switch savedDialog { - case let .monoForumDialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, _): - + case let .monoForumDialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadReactionsCount, _): state.operations.append(.ResetForumTopic( topicId: PeerAndBoundThreadId(peerId: peerId, threadId: peer.peerId.toInt64()), data: StoreMessageHistoryThreadData( @@ -2133,7 +2144,7 @@ func resolveForumThreads(accountPeerId: PeerId, postbox: Postbox, source: FetchM ), topMessageId: topMessage, unreadMentionCount: 0, - unreadReactionCount: 0 + unreadReactionCount: unreadReactionsCount ), pts: result.pts )) @@ -2268,7 +2279,7 @@ func resolveForumThreads(accountPeerId: PeerId, postbox: Postbox, source: FetchM } case let .savedDialog(savedDialog): switch savedDialog { - case let .monoForumDialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, _): + case let .monoForumDialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadReactionsCount, _): let data = MessageHistoryThreadData( creationDate: 0, isOwnedByMe: true, @@ -2292,7 +2303,7 @@ func resolveForumThreads(accountPeerId: PeerId, postbox: Postbox, source: FetchM } transaction.replaceMessageTagSummary(peerId: peerId, threadId: peer.peerId.toInt64(), tagMask: .unseenPersonalMessage, namespace: Namespaces.Message.Cloud, customTag: nil, count: 0, maxId: topMessage) - transaction.replaceMessageTagSummary(peerId: peerId, threadId: peer.peerId.toInt64(), tagMask: .unseenReaction, namespace: Namespaces.Message.Cloud, customTag: nil, count: 0, maxId: topMessage) + transaction.replaceMessageTagSummary(peerId: peerId, threadId: peer.peerId.toInt64(), tagMask: .unseenReaction, namespace: Namespaces.Message.Cloud, customTag: nil, count: unreadReactionsCount, maxId: topMessage) case .savedDialog: break } @@ -2429,7 +2440,7 @@ func resolveForumThreads(accountPeerId: PeerId, postbox: Postbox, source: FetchM } case let .savedDialog(savedDialog): switch savedDialog { - case let .monoForumDialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, _): + case let .monoForumDialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadReactionsCount, _): fetchedChatList.threadInfos[PeerAndBoundThreadId(peerId: peerId, threadId: peer.peerId.toInt64())] = StoreMessageHistoryThreadData( data: MessageHistoryThreadData( @@ -2452,7 +2463,7 @@ func resolveForumThreads(accountPeerId: PeerId, postbox: Postbox, source: FetchM ), topMessageId: topMessage, unreadMentionCount: 0, - unreadReactionCount: 0 + unreadReactionCount: unreadReactionsCount ) case .savedDialog: break @@ -2618,7 +2629,7 @@ private func messagesFromOperations(state: AccountMutableState) -> [StoreMessage private func reactionsFromState(_ state: AccountMutableState) -> [MessageReaction.Reaction] { var result: [MessageReaction.Reaction] = [] for operation in state.operations { - if case let .UpdateMessageReactions(_, reactions, _) = operation { + if case let .UpdateMessageReactions(_, _, reactions, _) = operation { for reaction in ReactionsMessageAttribute(apiReactions: reactions).reactions { result.append(reaction.value) } @@ -3303,9 +3314,14 @@ private func pollChannel(accountPeerId: PeerId, postbox: Postbox, network: Netwo updatedState.updateMessagesPinned(ids: messages.map { id in MessageId(peerId: channelPeerId, namespace: Namespaces.Message.Cloud, id: id) }, pinned: (flags & (1 << 0)) != 0) - case let .updateChannelReadMessagesContents(_, _, topMsgId, messages): - let _ = topMsgId - updatedState.addReadMessagesContents((peer.id, messages), date: nil) + case let .updateChannelReadMessagesContents(_, _, topMsgId, savedPeerId, messages): + var threadId: Int64? + if let savedPeerId { + threadId = savedPeerId.peerId.toInt64() + } else if let topMsgId { + threadId = Int64(topMsgId) + } + updatedState.addReadMessagesContents((peer.id, threadId, messages), date: nil) case let .updateChannelMessageViews(_, id, views): updatedState.addUpdateMessageImpressionCount(id: MessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud, id: id), count: views) case let .updateChannelWebPage(_, apiWebpage, _, _): @@ -4677,7 +4693,7 @@ func replayFinalState( case let .UpdatePinnedTopicOrder(peerId, threadIds): transaction.setPeerPinnedThreads(peerId: peerId, threadIds: threadIds) case let .ReadMessageContents(peerIdAndMessageIds, date): - let (peerId, messageIds) = peerIdAndMessageIds + let (peerId, _, messageIds) = peerIdAndMessageIds if let peerId = peerId { for id in messageIds { @@ -4867,7 +4883,7 @@ func replayFinalState( return state }) } - case let .UpdateMessageReactions(messageId, reactions, _): + case let .UpdateMessageReactions(messageId, _, reactions, _): transaction.updateMessage(messageId, update: { currentMessage in var updatedReactions = ReactionsMessageAttribute(apiReactions: reactions) diff --git a/submodules/TelegramCore/Sources/State/AccountViewTracker.swift b/submodules/TelegramCore/Sources/State/AccountViewTracker.swift index a212fbad0d..9a087065be 100644 --- a/submodules/TelegramCore/Sources/State/AccountViewTracker.swift +++ b/submodules/TelegramCore/Sources/State/AccountViewTracker.swift @@ -870,7 +870,7 @@ public final class AccountViewTracker { } for update in updateList { switch update { - case let .updateMessageReactions(_, peer, msgId, _, reactions): + case let .updateMessageReactions(_, peer, msgId, _, _, reactions): transaction.updateMessage(MessageId(peerId: peer.peerId, namespace: Namespaces.Message.Cloud, id: msgId), update: { currentMessage in var updatedReactions = ReactionsMessageAttribute(apiReactions: reactions) @@ -1689,7 +1689,7 @@ public final class AccountViewTracker { } transaction.replaceMessageTagSummary(peerId: peerId, threadId: threadId, tagMask: .unseenReaction, namespace: Namespaces.Message.Cloud, customTag: nil, count: 0, maxId: maxId) - addSynchronizeMarkAllUnseenReactionsOperation(transaction: transaction, peerId: peerId, maxId: summary.range.maxId) + addSynchronizeMarkAllUnseenReactionsOperation(transaction: transaction, peerId: peerId, maxId: summary.range.maxId, threadId: threadId) } return ids diff --git a/submodules/TelegramCore/Sources/State/HistoryViewStateValidation.swift b/submodules/TelegramCore/Sources/State/HistoryViewStateValidation.swift index 60a87f252f..3d99f0956e 100644 --- a/submodules/TelegramCore/Sources/State/HistoryViewStateValidation.swift +++ b/submodules/TelegramCore/Sources/State/HistoryViewStateValidation.swift @@ -539,7 +539,7 @@ private func validateChannelMessagesBatch(postbox: Postbox, network: Network, ac if tag == MessageTags.unseenPersonalMessage { requestSignal = network.request(Api.functions.messages.getUnreadMentions(flags: 0, peer: inputPeer, topMsgId: nil, offsetId: messageIds[messageIds.count - 1].id + 1, addOffset: 0, limit: Int32(messageIds.count), maxId: messageIds[messageIds.count - 1].id + 1, minId: messageIds[0].id - 1)) } else if tag == MessageTags.unseenReaction { - requestSignal = network.request(Api.functions.messages.getUnreadReactions(flags: 0, peer: inputPeer, topMsgId: nil, offsetId: messageIds[messageIds.count - 1].id + 1, addOffset: 0, limit: Int32(messageIds.count), maxId: messageIds[messageIds.count - 1].id + 1, minId: messageIds[0].id - 1)) + requestSignal = network.request(Api.functions.messages.getUnreadReactions(flags: 0, peer: inputPeer, topMsgId: nil, savedPeerId: nil, offsetId: messageIds[messageIds.count - 1].id + 1, addOffset: 0, limit: Int32(messageIds.count), maxId: messageIds[messageIds.count - 1].id + 1, minId: messageIds[0].id - 1)) } else if let filter = messageFilterForTagMask(tag) { requestSignal = network.request(Api.functions.messages.search(flags: 0, peer: inputPeer, q: "", fromId: nil, savedPeerId: nil, savedReaction: nil, topMsgId: nil, filter: filter, minDate: 0, maxDate: 0, offsetId: messageIds[messageIds.count - 1].id + 1, addOffset: 0, limit: Int32(messageIds.count), maxId: messageIds[messageIds.count - 1].id + 1, minId: messageIds[0].id - 1, hash: hash)) } else { diff --git a/submodules/TelegramCore/Sources/State/Holes.swift b/submodules/TelegramCore/Sources/State/Holes.swift index c73d259282..122b5e5acd 100644 --- a/submodules/TelegramCore/Sources/State/Holes.swift +++ b/submodules/TelegramCore/Sources/State/Holes.swift @@ -718,8 +718,16 @@ func fetchMessageHistoryHole(accountPeerId: PeerId, source: FetchMessageHistoryH flags |= (1 << 0) topMsgId = Int32(clamping: threadId) } + var savedPeerId: Api.InputPeer? + if let subPeerId = peerInput.requestSubPeerId(accountPeerId: accountPeerId, peer: peer), let subPeer = subPeer, subPeer.id == subPeerId { + flags |= (1 << 1) + if let inputPeer = apiInputPeer(subPeer) { + flags |= 1 << 2 + savedPeerId = inputPeer + } + } - request = source.request(Api.functions.messages.getUnreadReactions(flags: flags, peer: inputPeer, topMsgId: topMsgId, offsetId: offsetId, addOffset: addOffset, limit: Int32(selectedLimit), maxId: maxId, minId: minId)) + request = source.request(Api.functions.messages.getUnreadReactions(flags: flags, peer: inputPeer, topMsgId: topMsgId, savedPeerId: savedPeerId, offsetId: offsetId, addOffset: addOffset, limit: Int32(selectedLimit), maxId: maxId, minId: minId)) } else if tag == .liveLocation { let selectedLimit = count diff --git a/submodules/TelegramCore/Sources/State/ManagedSynchronizeMarkAllUnseenPersonalMessagesOperations.swift b/submodules/TelegramCore/Sources/State/ManagedSynchronizeMarkAllUnseenPersonalMessagesOperations.swift index b54dcc1974..4a3ae84ae2 100644 --- a/submodules/TelegramCore/Sources/State/ManagedSynchronizeMarkAllUnseenPersonalMessagesOperations.swift +++ b/submodules/TelegramCore/Sources/State/ManagedSynchronizeMarkAllUnseenPersonalMessagesOperations.swift @@ -280,11 +280,29 @@ func managedSynchronizeMarkAllUnseenReactionsOperations(postbox: Postbox, networ } private func synchronizeMarkAllUnseenReactions(transaction: Transaction, postbox: Postbox, network: Network, stateManager: AccountStateManager, peerId: PeerId, operation: SynchronizeMarkAllUnseenReactionsOperation) -> Signal { - guard let inputPeer = transaction.getPeer(peerId).flatMap(apiInputPeer) else { + guard let peer = transaction.getPeer(peerId) else { + return .complete() + } + guard let inputPeer = apiInputPeer(peer) else { return .complete() } - let signal = network.request(Api.functions.messages.readReactions(flags: 0, peer: inputPeer, topMsgId: nil)) + var flags: Int32 = 0 + var topMsgId: Int32? + var savedPeerId: Api.InputPeer? + if let threadId = operation.threadId { + if peer.isMonoForum { + if let subPeerId = transaction.getPeer(PeerId(threadId)).flatMap(apiInputPeer) { + flags |= 1 << 1 + savedPeerId = subPeerId + } + } else { + flags |= 1 << 0 + topMsgId = Int32(clamping: threadId) + } + } + + let signal = network.request(Api.functions.messages.readReactions(flags: flags, peer: inputPeer, topMsgId: topMsgId, savedPeerId: savedPeerId)) |> map(Optional.init) |> `catch` { _ -> Signal in return .fail(true) diff --git a/submodules/TelegramCore/Sources/State/SynchronizeMarkAllUnseenPersonalMessagesOperation.swift b/submodules/TelegramCore/Sources/State/SynchronizeMarkAllUnseenPersonalMessagesOperation.swift index ec9b12729d..1183e351eb 100644 --- a/submodules/TelegramCore/Sources/State/SynchronizeMarkAllUnseenPersonalMessagesOperation.swift +++ b/submodules/TelegramCore/Sources/State/SynchronizeMarkAllUnseenPersonalMessagesOperation.swift @@ -25,13 +25,13 @@ func addSynchronizeMarkAllUnseenPersonalMessagesOperation(transaction: Transacti transaction.operationLogAddEntry(peerId: peerId, tag: tag, tagLocalIndex: .automatic, tagMergedIndex: .automatic, contents: SynchronizeMarkAllUnseenPersonalMessagesOperation(maxId: maxId)) } -func addSynchronizeMarkAllUnseenReactionsOperation(transaction: Transaction, peerId: PeerId, maxId: MessageId.Id) { +func addSynchronizeMarkAllUnseenReactionsOperation(transaction: Transaction, peerId: PeerId, maxId: MessageId.Id, threadId: Int64?) { let tag: PeerOperationLogTag = OperationLogTags.SynchronizeMarkAllUnseenReactions var topLocalIndex: Int32? var currentMaxId: MessageId.Id? transaction.operationLogEnumerateEntries(peerId: peerId, tag: tag, { entry in topLocalIndex = entry.tagLocalIndex - if let operation = entry.contents as? SynchronizeMarkAllUnseenReactionsOperation { + if let operation = entry.contents as? SynchronizeMarkAllUnseenReactionsOperation, operation.threadId == threadId { currentMaxId = operation.maxId } return false @@ -44,5 +44,5 @@ func addSynchronizeMarkAllUnseenReactionsOperation(transaction: Transaction, pee let _ = transaction.operationLogRemoveEntry(peerId: peerId, tag: tag, tagLocalIndex: topLocalIndex) } - transaction.operationLogAddEntry(peerId: peerId, tag: tag, tagLocalIndex: .automatic, tagMergedIndex: .automatic, contents: SynchronizeMarkAllUnseenReactionsOperation(maxId: maxId)) + transaction.operationLogAddEntry(peerId: peerId, tag: tag, tagLocalIndex: .automatic, tagMergedIndex: .automatic, contents: SynchronizeMarkAllUnseenReactionsOperation(threadId: threadId, maxId: maxId)) } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_SynchronizeMarkAllUnseenPersonalMessagesOperation.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_SynchronizeMarkAllUnseenPersonalMessagesOperation.swift index 5f45fd0c6f..43ee067dcc 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_SynchronizeMarkAllUnseenPersonalMessagesOperation.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_SynchronizeMarkAllUnseenPersonalMessagesOperation.swift @@ -17,17 +17,25 @@ public final class SynchronizeMarkAllUnseenPersonalMessagesOperation: PostboxCod } public final class SynchronizeMarkAllUnseenReactionsOperation: PostboxCoding { + public let threadId: Int64? public let maxId: MessageId.Id - public init(maxId: MessageId.Id) { + public init(threadId: Int64?, maxId: MessageId.Id) { + self.threadId = threadId self.maxId = maxId } public init(decoder: PostboxDecoder) { + self.threadId = decoder.decodeOptionalInt64ForKey("threadId") self.maxId = decoder.decodeInt32ForKey("maxId", orElse: Int32.min + 1) } public func encode(_ encoder: PostboxEncoder) { + if let threadId = self.threadId { + encoder.encodeInt64(threadId, forKey: "threadId") + } else { + encoder.encodeNil(forKey: "threadId") + } encoder.encodeInt32(self.maxId, forKey: "maxId") } }