From 8ec570d6f45cd667ddd6cd0d15c3c39ef2129040 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Mon, 15 May 2023 15:03:45 +0400 Subject: [PATCH] Update API --- submodules/TelegramApi/Sources/Api0.swift | 11 +- submodules/TelegramApi/Sources/Api21.swift | 44 ++-- submodules/TelegramApi/Sources/Api22.swift | 28 +- submodules/TelegramApi/Sources/Api29.swift | 56 ++++ submodules/TelegramApi/Sources/Api30.swift | 99 ++++--- .../Account/AccountIntermediateState.swift | 6 +- .../State/AccountStateManagementUtils.swift | 11 +- .../TelegramEngine/Messages/Stories.swift | 22 +- .../Messages/StoryListContext.swift | 242 +++++++++--------- .../Messages/TelegramEngineMessages.swift | 4 +- .../Sources/StoryChatContent.swift | 2 +- .../Sources/StoryPeerListComponent.swift | 4 +- 12 files changed, 314 insertions(+), 215 deletions(-) diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 406604c07e..a90dde3b9d 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -786,8 +786,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1087454222] = { return Api.StickerSetCovered.parse_stickerSetFullCovered($0) } dict[872932635] = { return Api.StickerSetCovered.parse_stickerSetMultiCovered($0) } dict[2008112412] = { return Api.StickerSetCovered.parse_stickerSetNoCovered($0) } - dict[271121336] = { return Api.StoryItem.parse_storyItem($0) } - dict[-2020380585] = { return Api.StoryItem.parse_storyItemDeleted($0) } + dict[-1526488475] = { return Api.StoryItem.parse_storyItem($0) } + dict[1374088783] = { return Api.StoryItem.parse_storyItemDeleted($0) } dict[90474706] = { return Api.StoryView.parse_storyView($0) } dict[1964978502] = { return Api.TextWithEntities.parse_textWithEntities($0) } dict[-1609668650] = { return Api.Theme.parse_theme($0) } @@ -895,7 +895,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1667805217] = { return Api.Update.parse_updateReadHistoryInbox($0) } dict[791617983] = { return Api.Update.parse_updateReadHistoryOutbox($0) } dict[1757493555] = { return Api.Update.parse_updateReadMessagesContents($0) } - dict[-1653870963] = { return Api.Update.parse_updateReadStories($0) } + dict[-21679014] = { return Api.Update.parse_updateReadStories($0) } dict[821314523] = { return Api.Update.parse_updateRecentEmojiStatuses($0) } dict[1870160884] = { return Api.Update.parse_updateRecentReactions($0) } dict[-1706939360] = { return Api.Update.parse_updateRecentStickers($0) } @@ -937,7 +937,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-306628279] = { return Api.UserStatus.parse_userStatusOnline($0) } dict[-496024847] = { return Api.UserStatus.parse_userStatusRecently($0) } dict[333268946] = { return Api.UserStories.parse_userStories($0) } - dict[-47503192] = { return Api.UserStories.parse_userStoriesShort($0) } + dict[827991632] = { return Api.UserStories.parse_userStoriesSlice($0) } dict[-1274595769] = { return Api.Username.parse_username($0) } dict[-567037804] = { return Api.VideoSize.parse_videoSize($0) } dict[-128171716] = { return Api.VideoSize.parse_videoSizeEmojiMarkup($0) } @@ -1155,6 +1155,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1432995067] = { return Api.storage.FileType.parse_fileUnknown($0) } dict[276907596] = { return Api.storage.FileType.parse_fileWebp($0) } dict[1214632796] = { return Api.stories.AllStories.parse_allStories($0) } + dict[1340440049] = { return Api.stories.Stories.parse_stories($0) } dict[-79726676] = { return Api.stories.StoryViewsList.parse_storyViewsList($0) } dict[543450958] = { return Api.updates.ChannelDifference.parse_channelDifference($0) } dict[1041346555] = { return Api.updates.ChannelDifference.parse_channelDifferenceEmpty($0) } @@ -2017,6 +2018,8 @@ public extension Api { _1.serialize(buffer, boxed) case let _1 as Api.stories.AllStories: _1.serialize(buffer, boxed) + case let _1 as Api.stories.Stories: + _1.serialize(buffer, boxed) case let _1 as Api.stories.StoryViewsList: _1.serialize(buffer, boxed) case let _1 as Api.updates.ChannelDifference: diff --git a/submodules/TelegramApi/Sources/Api21.swift b/submodules/TelegramApi/Sources/Api21.swift index 35f4ec7c0b..7bf545bdd1 100644 --- a/submodules/TelegramApi/Sources/Api21.swift +++ b/submodules/TelegramApi/Sources/Api21.swift @@ -328,17 +328,17 @@ public extension Api { } public extension Api { indirect enum StoryItem: TypeConstructorDescription { - case storyItem(flags: Int32, id: Int64, date: Int32, caption: String?, entities: [Api.MessageEntity]?, media: Api.MessageMedia, privacy: [Api.PrivacyRule]?, recentViewers: [Int64]?, viewsCount: Int32?) - case storyItemDeleted(id: Int64) + case storyItem(flags: Int32, id: Int32, date: Int32, caption: String?, entities: [Api.MessageEntity]?, media: Api.MessageMedia, privacy: [Api.PrivacyRule]?, recentViewers: [Int64]?, viewsCount: Int32?) + case storyItemDeleted(id: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { case .storyItem(let flags, let id, let date, let caption, let entities, let media, let privacy, let recentViewers, let viewsCount): if boxed { - buffer.appendInt32(271121336) + buffer.appendInt32(-1526488475) } serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt64(id, buffer: buffer, boxed: false) + serializeInt32(id, buffer: buffer, boxed: false) serializeInt32(date, buffer: buffer, boxed: false) if Int(flags) & Int(1 << 0) != 0 {serializeString(caption!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 1) != 0 {buffer.appendInt32(481674261) @@ -361,9 +361,9 @@ public extension Api { break case .storyItemDeleted(let id): if boxed { - buffer.appendInt32(-2020380585) + buffer.appendInt32(1374088783) } - serializeInt64(id, buffer: buffer, boxed: false) + serializeInt32(id, buffer: buffer, boxed: false) break } } @@ -380,8 +380,8 @@ public extension Api { public static func parse_storyItem(_ reader: BufferReader) -> StoryItem? { var _1: Int32? _1 = reader.readInt32() - var _2: Int64? - _2 = reader.readInt64() + var _2: Int32? + _2 = reader.readInt32() var _3: Int32? _3 = reader.readInt32() var _4: String? @@ -421,8 +421,8 @@ public extension Api { } } public static func parse_storyItemDeleted(_ reader: BufferReader) -> StoryItem? { - var _1: Int64? - _1 = reader.readInt64() + var _1: Int32? + _1 = reader.readInt32() let _c1 = _1 != nil if _c1 { return Api.StoryItem.storyItemDeleted(id: _1!) @@ -963,7 +963,7 @@ public extension Api { case updateReadHistoryInbox(flags: Int32, folderId: Int32?, peer: Api.Peer, maxId: Int32, stillUnreadCount: Int32, pts: Int32, ptsCount: Int32) case updateReadHistoryOutbox(peer: Api.Peer, maxId: Int32, pts: Int32, ptsCount: Int32) case updateReadMessagesContents(messages: [Int32], pts: Int32, ptsCount: Int32) - case updateReadStories(userId: Int64, id: [Int64]) + case updateReadStories(userId: Int64, maxId: Int32) case updateRecentEmojiStatuses case updateRecentReactions case updateRecentStickers @@ -1803,16 +1803,12 @@ public extension Api { serializeInt32(pts, buffer: buffer, boxed: false) serializeInt32(ptsCount, buffer: buffer, boxed: false) break - case .updateReadStories(let userId, let id): + case .updateReadStories(let userId, let maxId): if boxed { - buffer.appendInt32(-1653870963) + buffer.appendInt32(-21679014) } serializeInt64(userId, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(id.count)) - for item in id { - serializeInt64(item, buffer: buffer, boxed: false) - } + serializeInt32(maxId, buffer: buffer, boxed: false) break case .updateRecentEmojiStatuses: if boxed { @@ -2150,8 +2146,8 @@ public extension Api { return ("updateReadHistoryOutbox", [("peer", peer as Any), ("maxId", maxId as Any), ("pts", pts as Any), ("ptsCount", ptsCount as Any)]) case .updateReadMessagesContents(let messages, let pts, let ptsCount): return ("updateReadMessagesContents", [("messages", messages as Any), ("pts", pts as Any), ("ptsCount", ptsCount as Any)]) - case .updateReadStories(let userId, let id): - return ("updateReadStories", [("userId", userId as Any), ("id", id as Any)]) + case .updateReadStories(let userId, let maxId): + return ("updateReadStories", [("userId", userId as Any), ("maxId", maxId as Any)]) case .updateRecentEmojiStatuses: return ("updateRecentEmojiStatuses", []) case .updateRecentReactions: @@ -3874,14 +3870,12 @@ public extension Api { public static func parse_updateReadStories(_ reader: BufferReader) -> Update? { var _1: Int64? _1 = reader.readInt64() - var _2: [Int64]? - if let _ = reader.readInt32() { - _2 = Api.parseVector(reader, elementSignature: 570911930, elementType: Int64.self) - } + var _2: Int32? + _2 = reader.readInt32() let _c1 = _1 != nil let _c2 = _2 != nil if _c1 && _c2 { - return Api.Update.updateReadStories(userId: _1!, id: _2!) + return Api.Update.updateReadStories(userId: _1!, maxId: _2!) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api22.swift b/submodules/TelegramApi/Sources/Api22.swift index 5f42bc1a0d..41f70426fa 100644 --- a/submodules/TelegramApi/Sources/Api22.swift +++ b/submodules/TelegramApi/Sources/Api22.swift @@ -889,7 +889,7 @@ public extension Api { public extension Api { enum UserStories: TypeConstructorDescription { case userStories(userId: Int64, stories: [Api.StoryItem]) - case userStoriesShort(userId: Int64, stories: [Api.StoryItem], totalCount: Int32) + case userStoriesSlice(count: Int32, userId: Int64, stories: [Api.StoryItem]) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -904,17 +904,17 @@ public extension Api { item.serialize(buffer, true) } break - case .userStoriesShort(let userId, let stories, let totalCount): + case .userStoriesSlice(let count, let userId, let stories): if boxed { - buffer.appendInt32(-47503192) + buffer.appendInt32(827991632) } + serializeInt32(count, buffer: buffer, boxed: false) serializeInt64(userId, buffer: buffer, boxed: false) buffer.appendInt32(481674261) buffer.appendInt32(Int32(stories.count)) for item in stories { item.serialize(buffer, true) } - serializeInt32(totalCount, buffer: buffer, boxed: false) break } } @@ -923,8 +923,8 @@ public extension Api { switch self { case .userStories(let userId, let stories): return ("userStories", [("userId", userId as Any), ("stories", stories as Any)]) - case .userStoriesShort(let userId, let stories, let totalCount): - return ("userStoriesShort", [("userId", userId as Any), ("stories", stories as Any), ("totalCount", totalCount as Any)]) + case .userStoriesSlice(let count, let userId, let stories): + return ("userStoriesSlice", [("count", count as Any), ("userId", userId as Any), ("stories", stories as Any)]) } } @@ -944,20 +944,20 @@ public extension Api { return nil } } - public static func parse_userStoriesShort(_ reader: BufferReader) -> UserStories? { - var _1: Int64? - _1 = reader.readInt64() - var _2: [Api.StoryItem]? + public static func parse_userStoriesSlice(_ reader: BufferReader) -> UserStories? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int64? + _2 = reader.readInt64() + var _3: [Api.StoryItem]? if let _ = reader.readInt32() { - _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.StoryItem.self) + _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.StoryItem.self) } - var _3: Int32? - _3 = reader.readInt32() let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil if _c1 && _c2 && _c3 { - return Api.UserStories.userStoriesShort(userId: _1!, stories: _2!, totalCount: _3!) + return Api.UserStories.userStoriesSlice(count: _1!, userId: _2!, stories: _3!) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api29.swift b/submodules/TelegramApi/Sources/Api29.swift index 945e8af007..dcf6449cb9 100644 --- a/submodules/TelegramApi/Sources/Api29.swift +++ b/submodules/TelegramApi/Sources/Api29.swift @@ -418,6 +418,62 @@ public extension Api.stories { } } +public extension Api.stories { + enum Stories: TypeConstructorDescription { + case stories(count: Int32, stories: [Api.StoryItem], users: [Api.User]) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .stories(let count, let stories, let users): + if boxed { + buffer.appendInt32(1340440049) + } + serializeInt32(count, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(stories.count)) + for item in stories { + item.serialize(buffer, true) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(users.count)) + for item in users { + item.serialize(buffer, true) + } + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .stories(let count, let stories, let users): + return ("stories", [("count", count as Any), ("stories", stories as Any), ("users", users as Any)]) + } + } + + public static func parse_stories(_ reader: BufferReader) -> Stories? { + var _1: Int32? + _1 = reader.readInt32() + var _2: [Api.StoryItem]? + if let _ = reader.readInt32() { + _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.StoryItem.self) + } + var _3: [Api.User]? + if let _ = reader.readInt32() { + _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.stories.Stories.stories(count: _1!, stories: _2!, users: _3!) + } + else { + return nil + } + } + + } +} public extension Api.stories { enum StoryViewsList: TypeConstructorDescription { case storyViewsList(count: Int32, views: [Api.StoryView], users: [Api.User]) diff --git a/submodules/TelegramApi/Sources/Api30.swift b/submodules/TelegramApi/Sources/Api30.swift index 18f3ead9bb..17d3839480 100644 --- a/submodules/TelegramApi/Sources/Api30.swift +++ b/submodules/TelegramApi/Sources/Api30.swift @@ -8438,25 +8438,29 @@ public extension Api.functions.stickers { } } public extension Api.functions.stories { - static func deleteStory(id: Int64) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + static func deleteStories(id: [Int32]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { let buffer = Buffer() - buffer.appendInt32(2130720150) - serializeInt64(id, buffer: buffer, boxed: false) - return (FunctionDescription(name: "stories.deleteStory", parameters: [("id", String(describing: id))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + buffer.appendInt32(-1244331561) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(id.count)) + for item in id { + serializeInt32(item, buffer: buffer, boxed: false) + } + return (FunctionDescription(name: "stories.deleteStories", parameters: [("id", String(describing: id))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> [Int32]? in let reader = BufferReader(buffer) - var result: Api.Bool? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Bool + var result: [Int32]? + if let _ = reader.readInt32() { + result = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) } return result }) } } public extension Api.functions.stories { - static func editStoryPrivacy(id: Int64, privacyRules: [Api.InputPrivacyRule]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + static func editStoryPrivacy(id: Int32, privacyRules: [Api.InputPrivacyRule]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(82204943) - serializeInt64(id, buffer: buffer, boxed: false) + buffer.appendInt32(2023233653) + serializeInt32(id, buffer: buffer, boxed: false) buffer.appendInt32(481674261) buffer.appendInt32(Int32(privacyRules.count)) for item in privacyRules { @@ -8488,12 +8492,28 @@ public extension Api.functions.stories { } } public extension Api.functions.stories { - static func getStoryViews(id: Int64, offsetDate: Int32, offsetId: Int64, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + static func getExpiredStories(offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-1233598578) - serializeInt64(id, buffer: buffer, boxed: false) + buffer.appendInt32(150442738) + serializeInt32(offsetId, buffer: buffer, boxed: false) + serializeInt32(limit, buffer: buffer, boxed: false) + return (FunctionDescription(name: "stories.getExpiredStories", parameters: [("offsetId", String(describing: offsetId)), ("limit", String(describing: limit))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.stories.Stories? in + let reader = BufferReader(buffer) + var result: Api.stories.Stories? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.stories.Stories + } + return result + }) + } +} +public extension Api.functions.stories { + static func getStoryViews(id: Int32, offsetDate: Int32, offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-2075944968) + serializeInt32(id, buffer: buffer, boxed: false) serializeInt32(offsetDate, buffer: buffer, boxed: false) - serializeInt64(offsetId, buffer: buffer, boxed: false) + serializeInt32(offsetId, buffer: buffer, boxed: false) serializeInt32(limit, buffer: buffer, boxed: false) return (FunctionDescription(name: "stories.getStoryViews", parameters: [("id", String(describing: id)), ("offsetDate", String(describing: offsetDate)), ("offsetId", String(describing: offsetId)), ("limit", String(describing: limit))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.stories.StoryViewsList? in let reader = BufferReader(buffer) @@ -8506,35 +8526,34 @@ public extension Api.functions.stories { } } public extension Api.functions.stories { - static func getUserStories(userId: Api.InputUser) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + static func getUserStories(flags: Int32, userId: Api.InputUser, offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-103893274) + buffer.appendInt32(-918096960) + serializeInt32(flags, buffer: buffer, boxed: false) userId.serialize(buffer, true) - return (FunctionDescription(name: "stories.getUserStories", parameters: [("userId", String(describing: userId))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + serializeInt32(offsetId, buffer: buffer, boxed: false) + serializeInt32(limit, buffer: buffer, boxed: false) + return (FunctionDescription(name: "stories.getUserStories", parameters: [("flags", String(describing: flags)), ("userId", String(describing: userId)), ("offsetId", String(describing: offsetId)), ("limit", String(describing: limit))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.stories.Stories? in let reader = BufferReader(buffer) - var result: Api.Updates? + var result: Api.stories.Stories? if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Updates + result = Api.parse(reader, signature: signature) as? Api.stories.Stories } return result }) } } public extension Api.functions.stories { - static func readStories(userId: Api.InputUser, id: [Int64]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + static func readStories(userId: Api.InputUser, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { let buffer = Buffer() - buffer.appendInt32(1026304810) + buffer.appendInt32(-305852325) userId.serialize(buffer, true) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(id.count)) - for item in id { - serializeInt64(item, buffer: buffer, boxed: false) - } - return (FunctionDescription(name: "stories.readStories", parameters: [("userId", String(describing: userId)), ("id", String(describing: id))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + serializeInt32(maxId, buffer: buffer, boxed: false) + return (FunctionDescription(name: "stories.readStories", parameters: [("userId", String(describing: userId)), ("maxId", String(describing: maxId))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> [Int32]? in let reader = BufferReader(buffer) - var result: Api.Bool? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Bool + var result: [Int32]? + if let _ = reader.readInt32() { + result = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) } return result }) @@ -8567,6 +8586,26 @@ public extension Api.functions.stories { }) } } +public extension Api.functions.stories { + static func togglePinned(id: [Int32], pinned: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { + let buffer = Buffer() + buffer.appendInt32(1365256516) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(id.count)) + for item in id { + serializeInt32(item, buffer: buffer, boxed: false) + } + pinned.serialize(buffer, true) + return (FunctionDescription(name: "stories.togglePinned", parameters: [("id", String(describing: id)), ("pinned", String(describing: pinned))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> [Int32]? in + let reader = BufferReader(buffer) + var result: [Int32]? + if let _ = reader.readInt32() { + result = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) + } + return result + }) + } +} public extension Api.functions.updates { static func getChannelDifference(flags: Int32, channel: Api.InputChannel, filter: Api.ChannelMessagesFilter, pts: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() diff --git a/submodules/TelegramCore/Sources/Account/AccountIntermediateState.swift b/submodules/TelegramCore/Sources/Account/AccountIntermediateState.swift index 4b2a200418..9736c49c52 100644 --- a/submodules/TelegramCore/Sources/Account/AccountIntermediateState.swift +++ b/submodules/TelegramCore/Sources/Account/AccountIntermediateState.swift @@ -121,7 +121,7 @@ enum AccountStateMutationOperation { case UpdateExtendedMedia(MessageId, Api.MessageExtendedMedia) case ResetForumTopic(topicId: MessageId, data: StoreMessageHistoryThreadData, pts: Int32) case UpdateStories(Api.UserStories) - case UpdateReadStories(peerId: PeerId, ids: [Int64]) + case UpdateReadStories(peerId: PeerId, maxId: Int32) } struct HoleFromPreviousState { @@ -615,8 +615,8 @@ struct AccountMutableState { self.addOperation(.UpdateStories(stories)) } - mutating func readStories(peerId: PeerId, ids: [Int64]) { - self.addOperation(.UpdateReadStories(peerId: peerId, ids: ids)) + mutating func readStories(peerId: PeerId, maxId: Int32) { + self.addOperation(.UpdateReadStories(peerId: peerId, maxId: maxId)) } mutating func addOperation(_ operation: AccountStateMutationOperation) { diff --git a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift index 1f1c05d624..2e2dbfe767 100644 --- a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift @@ -1631,7 +1631,7 @@ private func finalStateWithUpdatesAndServerTime(accountPeerId: PeerId, postbox: case let .updateStories(stories): updatedState.updateStories(stories: stories) case let .updateReadStories(userId, id): - updatedState.readStories(peerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(userId)), ids: id) + updatedState.readStories(peerId: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(userId)), maxId: id) default: break } @@ -4330,13 +4330,14 @@ func replayFinalState( } case let .UpdateStories(updateStories): switch updateStories { - case .userStories(let userId, let stories), .userStoriesShort(let userId, let stories, _): + case .userStories(let userId, let stories), .userStoriesSlice(_, let userId, let stories): let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(userId)) for storyItem in stories { switch storyItem { case let .storyItemDeleted(id): storyUpdates.append(InternalStoryUpdate.deleted(id)) case let .storyItem(flags, id, date, _, _, media, privacy, recentViewers, viewCount): + let _ = flags let (parsedMedia, _, _, _) = textMediaAndExpirationTimerFromApiMedia(media, peerId) if let parsedMedia = parsedMedia { var seenPeers: [EnginePeer] = [] @@ -4383,7 +4384,6 @@ func replayFinalState( id: id, timestamp: date, media: EngineMedia(parsedMedia), - isSeen: (flags & (1 << 4)) == 0, seenCount: viewCount.flatMap(Int.init) ?? 0, seenPeers: seenPeers, privacy: parsedPrivacy @@ -4392,9 +4392,8 @@ func replayFinalState( } } } - case let .UpdateReadStories(peerId, ids): - let _ = peerId - storyUpdates.append(InternalStoryUpdate.read(ids)) + case let .UpdateReadStories(peerId, maxId): + storyUpdates.append(InternalStoryUpdate.read(peerId: peerId, maxId: maxId)) } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift index 7cf8c8e654..efab4609b5 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/Stories.swift @@ -112,7 +112,7 @@ func _internal_uploadStory(account: Account, media: EngineStoryInputMedia, priva for update in updates.allUpdates { if case let .updateStories(stories) = update { switch stories { - case .userStories(let userId, let apiStories), .userStoriesShort(let userId, let apiStories, _): + case .userStories(let userId, let apiStories), .userStoriesSlice(_, let userId, let apiStories): if PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(userId)) == account.peerId, apiStories.count == 1 { switch apiStories[0] { case let .storyItem(_, _, _, _, _, media, _, _, _): @@ -230,7 +230,7 @@ func _internal_uploadStory(account: Account, media: EngineStoryInputMedia, priva for update in updates.allUpdates { if case let .updateStories(stories) = update { switch stories { - case .userStories(let userId, let apiStories), .userStoriesShort(let userId, let apiStories, _): + case .userStories(let userId, let apiStories), .userStoriesSlice(_, let userId, let apiStories): if PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(userId)) == account.peerId, apiStories.count == 1 { switch apiStories[0] { case let .storyItem(_, _, _, _, _, media, _, _, _): @@ -263,17 +263,17 @@ func _internal_uploadStory(account: Account, media: EngineStoryInputMedia, priva } } -func _internal_deleteStory(account: Account, id: Int64) -> Signal { - return account.network.request(Api.functions.stories.deleteStory(id: id)) - |> `catch` { _ -> Signal in - return .single(.boolFalse) +func _internal_deleteStory(account: Account, id: Int32) -> Signal { + return account.network.request(Api.functions.stories.deleteStories(id: [id])) + |> `catch` { _ -> Signal<[Int32], NoError> in + return .single([]) } |> mapToSignal { _ -> Signal in return .complete() } } -func _internal_markStoryAsSeen(account: Account, peerId: PeerId, id: Int64) -> Signal { +func _internal_markStoryAsSeen(account: Account, peerId: PeerId, id: Int32) -> Signal { return account.postbox.transaction { transaction -> Api.InputUser? in return transaction.getPeer(peerId).flatMap(apiInputUser) } @@ -282,11 +282,11 @@ func _internal_markStoryAsSeen(account: Account, peerId: PeerId, id: Int64) -> S return .complete() } - account.stateManager.injectStoryUpdates(updates: [.read([id])]) + account.stateManager.injectStoryUpdates(updates: [.read(peerId: peerId, maxId: id)]) - return account.network.request(Api.functions.stories.readStories(userId: inputUser, id: [id])) - |> `catch` { _ -> Signal in - return .single(.boolFalse) + return account.network.request(Api.functions.stories.readStories(userId: inputUser, maxId: id)) + |> `catch` { _ -> Signal<[Int32], NoError> in + return .single([]) } |> ignoreValues } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift index 8ac8c25fe3..442f0014cd 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift @@ -4,9 +4,9 @@ import TelegramApi import SwiftSignalKit enum InternalStoryUpdate { - case deleted(Int64) + case deleted(Int32) case added(peerId: PeerId, item: StoryListContext.Item) - case read([Int64]) + case read(peerId: PeerId, maxId: Int32) } public final class StoryListContext { @@ -16,19 +16,17 @@ public final class StoryListContext { } public final class Item: Equatable { - public let id: Int64 + public let id: Int32 public let timestamp: Int32 public let media: EngineMedia - public let isSeen: Bool public let seenCount: Int public let seenPeers: [EnginePeer] public let privacy: EngineStoryPrivacy? - public init(id: Int64, timestamp: Int32, media: EngineMedia, isSeen: Bool, seenCount: Int, seenPeers: [EnginePeer], privacy: EngineStoryPrivacy?) { + public init(id: Int32, timestamp: Int32, media: EngineMedia, seenCount: Int, seenPeers: [EnginePeer], privacy: EngineStoryPrivacy?) { self.id = id self.timestamp = timestamp self.media = media - self.isSeen = isSeen self.seenCount = seenCount self.seenPeers = seenPeers self.privacy = privacy @@ -44,9 +42,6 @@ public final class StoryListContext { if lhs.media != rhs.media { return false } - if lhs.isSeen != rhs.isSeen { - return false - } if lhs.seenCount != rhs.seenCount { return false } @@ -63,12 +58,14 @@ public final class StoryListContext { public final class PeerItemSet: Equatable { public let peerId: EnginePeer.Id public let peer: EnginePeer? + public var maxReadId: Int32 public fileprivate(set) var items: [Item] public fileprivate(set) var totalCount: Int? - public init(peerId: EnginePeer.Id, peer: EnginePeer?, items: [Item], totalCount: Int?) { + public init(peerId: EnginePeer.Id, peer: EnginePeer?, maxReadId: Int32, items: [Item], totalCount: Int?) { self.peerId = peerId self.peer = peer + self.maxReadId = maxReadId self.items = items self.totalCount = totalCount } @@ -80,6 +77,9 @@ public final class StoryListContext { if lhs.peer != rhs.peer { return false } + if lhs.maxReadId != rhs.maxReadId { + return false + } if lhs.items != rhs.items { return false } @@ -165,7 +165,7 @@ public final class StoryListContext { return } self.stateValue = State(itemSets: [ - PeerItemSet(peerId: peer.id, peer: EnginePeer(peer), items: [], totalCount: 0) + PeerItemSet(peerId: peer.id, peer: EnginePeer(peer), maxReadId: 0, items: [], totalCount: 0) ], uploadProgress: nil, loadMoreToken: LoadMoreToken(value: nil)) }) @@ -215,6 +215,7 @@ public final class StoryListContext { itemSets[i] = PeerItemSet( peerId: itemSets[i].peerId, peer: itemSets[i].peer, + maxReadId: itemSets[i].maxReadId, items: items, totalCount: items.count ) @@ -236,7 +237,6 @@ public final class StoryListContext { id: item.id, timestamp: item.timestamp, media: item.media, - isSeen: false, seenCount: item.seenCount, seenPeers: item.seenPeers, privacy: item.privacy @@ -254,6 +254,7 @@ public final class StoryListContext { itemSets[i] = PeerItemSet( peerId: itemSets[i].peerId, peer: itemSets[i].peer, + maxReadId: itemSets[i].maxReadId, items: items, totalCount: items.count ) @@ -263,32 +264,22 @@ public final class StoryListContext { itemSets.insert(PeerItemSet( peerId: peerId, peer: EnginePeer(peer), + maxReadId: 0, items: [item], totalCount: 1 ), at: 0) } - case let .read(ids): - for id in ids { - for i in 0 ..< itemSets.count { - if let index = itemSets[i].items.firstIndex(where: { $0.id == id }) { - var items = itemSets[i].items - let item = items[index] - items[index] = Item( - id: item.id, - timestamp: item.timestamp, - media: item.media, - isSeen: true, - seenCount: item.seenCount, - seenPeers: item.seenPeers, - privacy: item.privacy - ) - itemSets[i] = PeerItemSet( - peerId: itemSets[i].peerId, - peer: itemSets[i].peer, - items: items, - totalCount: items.count - ) - } + case let .read(peerId, maxId): + for i in 0 ..< itemSets.count { + if itemSets[i].peerId == peerId { + let items = itemSets[i].items + itemSets[i] = PeerItemSet( + peerId: itemSets[i].peerId, + peer: itemSets[i].peer, + maxReadId: max(itemSets[i].maxReadId, maxId), + items: items, + totalCount: items.count + ) } } } @@ -311,7 +302,7 @@ public final class StoryListContext { if !itemSets.contains(where: { $0.peerId == self.account.peerId }) { if let peer = peers[self.account.peerId] { - itemSets.insert(PeerItemSet(peerId: peer.id, peer: EnginePeer(peer), items: [], totalCount: 0), at: 0) + itemSets.insert(PeerItemSet(peerId: peer.id, peer: EnginePeer(peer), maxReadId: 0, items: [], totalCount: 0), at: 0) } } @@ -345,95 +336,104 @@ public final class StoryListContext { guard let inputPeer = inputPeer else { return .single(nil) } - return account.network.request(Api.functions.stories.getUserStories(userId: inputPeer)) + return account.network.request(Api.functions.stories.getUserStories(flags: 0, userId: inputPeer, offsetId: 0, limit: 100)) |> map(Optional.init) - |> `catch` { _ -> Signal in + |> `catch` { _ -> Signal in return .single(nil) } - |> mapToSignal { updates -> Signal in - guard let updates = updates else { + |> mapToSignal { stories -> Signal in + guard let stories = stories else { return .single(nil) } return account.postbox.transaction { transaction -> PeerItemSet? in - for update in updates.allUpdates { - if case let .updateStories(stories) = update { - switch stories { - case .userStories(_, let apiStories), .userStoriesShort(_, let apiStories, _): - var parsedItemSets: [PeerItemSet] = [] - - let peerId = id - - for apiStory in apiStories { - switch apiStory { - case let .storyItem(flags, id, date, _, _, media, privacy, recentViewers, viewCount): - let (parsedMedia, _, _, _) = textMediaAndExpirationTimerFromApiMedia(media, peerId) - if let parsedMedia = parsedMedia { - var seenPeers: [EnginePeer] = [] - if let recentViewers = recentViewers { - for id in recentViewers { - if let peer = transaction.getPeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id))) { - seenPeers.append(EnginePeer(peer)) - } - } - } - - var parsedPrivacy: EngineStoryPrivacy? - if let privacy = privacy { - var base: EngineStoryPrivacy.Base = .everyone - var additionalPeerIds: [EnginePeer.Id] = [] - for rule in privacy { - switch rule { - case .privacyValueAllowAll: - base = .everyone - case .privacyValueAllowContacts: - base = .contacts - case .privacyValueAllowCloseFriends: - base = .closeFriends - case let .privacyValueAllowUsers(users): - for id in users { - additionalPeerIds.append(EnginePeer.Id(namespace: Namespaces.Peer.CloudUser, id: EnginePeer.Id.Id._internalFromInt64Value(id))) - } - case let .privacyValueAllowChatParticipants(chats): - for id in chats { - if let peer = transaction.getPeer(EnginePeer.Id(namespace: Namespaces.Peer.CloudGroup, id: EnginePeer.Id.Id._internalFromInt64Value(id))) { - additionalPeerIds.append(peer.id) - } else if let peer = transaction.getPeer(EnginePeer.Id(namespace: Namespaces.Peer.CloudChannel, id: EnginePeer.Id.Id._internalFromInt64Value(id))) { - additionalPeerIds.append(peer.id) - } - } - default: - break - } - } - parsedPrivacy = EngineStoryPrivacy(base: base, additionallyIncludePeers: additionalPeerIds) - } - - let item = StoryListContext.Item( - id: id, - timestamp: date, - media: EngineMedia(parsedMedia), - isSeen: (flags & (1 << 4)) == 0, - seenCount: viewCount.flatMap(Int.init) ?? 0, - seenPeers: seenPeers, - privacy: parsedPrivacy - ) - if !parsedItemSets.isEmpty && parsedItemSets[parsedItemSets.count - 1].peerId == peerId { - parsedItemSets[parsedItemSets.count - 1].items.append(item) - parsedItemSets[parsedItemSets.count - 1].totalCount = parsedItemSets[parsedItemSets.count - 1].items.count - } else { - parsedItemSets.append(StoryListContext.PeerItemSet(peerId: peerId, peer: transaction.getPeer(peerId).flatMap(EnginePeer.init), items: [item], totalCount: 1)) + switch stories { + case let .stories(_, apiStories, users): + var parsedItemSets: [PeerItemSet] = [] + + var peers: [Peer] = [] + var peerPresences: [PeerId: Api.User] = [:] + + for user in users { + let telegramUser = TelegramUser(user: user) + peers.append(telegramUser) + peerPresences[telegramUser.id] = user + } + + updatePeers(transaction: transaction, peers: peers, update: { _, updated -> Peer in + return updated + }) + updatePeerPresences(transaction: transaction, accountPeerId: account.peerId, peerPresences: peerPresences) + + let peerId = id + + for apiStory in apiStories { + switch apiStory { + case let .storyItem(flags, id, date, _, _, media, privacy, recentViewers, viewCount): + let _ = flags + let (parsedMedia, _, _, _) = textMediaAndExpirationTimerFromApiMedia(media, peerId) + if let parsedMedia = parsedMedia { + var seenPeers: [EnginePeer] = [] + if let recentViewers = recentViewers { + for id in recentViewers { + if let peer = transaction.getPeer(PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id))) { + seenPeers.append(EnginePeer(peer)) } } - case .storyItemDeleted: - break + } + + var parsedPrivacy: EngineStoryPrivacy? + if let privacy = privacy { + var base: EngineStoryPrivacy.Base = .everyone + var additionalPeerIds: [EnginePeer.Id] = [] + for rule in privacy { + switch rule { + case .privacyValueAllowAll: + base = .everyone + case .privacyValueAllowContacts: + base = .contacts + case .privacyValueAllowCloseFriends: + base = .closeFriends + case let .privacyValueAllowUsers(users): + for id in users { + additionalPeerIds.append(EnginePeer.Id(namespace: Namespaces.Peer.CloudUser, id: EnginePeer.Id.Id._internalFromInt64Value(id))) + } + case let .privacyValueAllowChatParticipants(chats): + for id in chats { + if let peer = transaction.getPeer(EnginePeer.Id(namespace: Namespaces.Peer.CloudGroup, id: EnginePeer.Id.Id._internalFromInt64Value(id))) { + additionalPeerIds.append(peer.id) + } else if let peer = transaction.getPeer(EnginePeer.Id(namespace: Namespaces.Peer.CloudChannel, id: EnginePeer.Id.Id._internalFromInt64Value(id))) { + additionalPeerIds.append(peer.id) + } + } + default: + break + } + } + parsedPrivacy = EngineStoryPrivacy(base: base, additionallyIncludePeers: additionalPeerIds) + } + + let item = StoryListContext.Item( + id: id, + timestamp: date, + media: EngineMedia(parsedMedia), + seenCount: viewCount.flatMap(Int.init) ?? 0, + seenPeers: seenPeers, + privacy: parsedPrivacy + ) + if !parsedItemSets.isEmpty && parsedItemSets[parsedItemSets.count - 1].peerId == peerId { + parsedItemSets[parsedItemSets.count - 1].items.append(item) + parsedItemSets[parsedItemSets.count - 1].totalCount = parsedItemSets[parsedItemSets.count - 1].items.count + } else { + parsedItemSets.append(StoryListContext.PeerItemSet(peerId: peerId, peer: transaction.getPeer(peerId).flatMap(EnginePeer.init), maxReadId: 0, items: [item], totalCount: 1)) } } - - return parsedItemSets.first + case .storyItemDeleted: + break } } + + return parsedItemSets.first } - return nil } } } @@ -522,7 +522,7 @@ public final class StoryListContext { case let .userStories(userId, stories): apiUserId = userId apiStories = stories - case let .userStoriesShort(userId, stories, totalCount): + case let .userStoriesSlice(totalCount, userId, stories): apiUserId = userId apiStories = stories apiTotalCount = totalCount @@ -532,6 +532,7 @@ public final class StoryListContext { for apiStory in apiStories { switch apiStory { case let .storyItem(flags, id, date, _, _, media, privacy, recentViewers, viewCount): + let _ = flags let (parsedMedia, _, _, _) = textMediaAndExpirationTimerFromApiMedia(media, peerId) if let parsedMedia = parsedMedia { var seenPeers: [EnginePeer] = [] @@ -578,7 +579,6 @@ public final class StoryListContext { id: id, timestamp: date, media: EngineMedia(parsedMedia), - isSeen: (flags & (1 << 4)) == 0, seenCount: viewCount.flatMap(Int.init) ?? 0, seenPeers: seenPeers, privacy: parsedPrivacy @@ -586,7 +586,13 @@ public final class StoryListContext { if !parsedItemSets.isEmpty && parsedItemSets[parsedItemSets.count - 1].peerId == peerId { parsedItemSets[parsedItemSets.count - 1].items.append(item) } else { - parsedItemSets.append(StoryListContext.PeerItemSet(peerId: peerId, peer: transaction.getPeer(peerId).flatMap(EnginePeer.init), items: [item], totalCount: apiTotalCount.flatMap(Int.init))) + parsedItemSets.append(StoryListContext.PeerItemSet( + peerId: peerId, + peer: transaction.getPeer(peerId).flatMap(EnginePeer.init), + maxReadId: 0, + items: [item], + totalCount: apiTotalCount.flatMap(Int.init) + )) } } case .storyItemDeleted: @@ -597,7 +603,7 @@ public final class StoryListContext { if !parsedItemSets.contains(where: { $0.peerId == account.peerId }) { if let peer = transaction.getPeer(account.peerId) { - parsedItemSets.insert(PeerItemSet(peerId: peer.id, peer: EnginePeer(peer), items: [], totalCount: 0), at: 0) + parsedItemSets.insert(PeerItemSet(peerId: peer.id, peer: EnginePeer(peer), maxReadId: 0, items: [], totalCount: 0), at: 0) } } @@ -633,6 +639,7 @@ public final class StoryListContext { itemSets[index] = PeerItemSet( peerId: itemSet.peerId, peer: itemSet.peer, + maxReadId: itemSet.maxReadId, items: items, totalCount: items.count ) @@ -666,7 +673,7 @@ public final class StoryListContext { })) } - func delete(id: Int64) { + func delete(id: Int32) { let _ = _internal_deleteStory(account: self.account, id: id).start() var itemSets: [PeerItemSet] = self.stateValue.itemSets @@ -680,6 +687,7 @@ public final class StoryListContext { itemSets[i] = PeerItemSet( peerId: itemSets[i].peerId, peer: itemSets[i].peer, + maxReadId: itemSets[i].maxReadId, items: items, totalCount: items.count ) @@ -707,7 +715,7 @@ public final class StoryListContext { }) } - public func delete(id: Int64) { + public func delete(id: Int32) { self.impl.with { impl in impl.delete(id: id) } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift index d7f233feb1..0dc07ecd63 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/TelegramEngineMessages.swift @@ -581,11 +581,11 @@ public extension TelegramEngine { return _internal_uploadStory(account: self.account, media: media, privacy: privacy) } - public func deleteStory(id: Int64) -> Signal { + public func deleteStory(id: Int32) -> Signal { return _internal_deleteStory(account: self.account, id: id) } - public func markStoryAsSeen(peerId: EnginePeer.Id, id: Int64) -> Signal { + public func markStoryAsSeen(peerId: EnginePeer.Id, id: Int32) -> Signal { return _internal_markStoryAsSeen(account: self.account, peerId: peerId, id: id) } } diff --git a/submodules/TelegramUI/Components/Stories/StoryContentComponent/Sources/StoryChatContent.swift b/submodules/TelegramUI/Components/Stories/StoryContentComponent/Sources/StoryChatContent.swift index dd5cadf49f..596e8ff7d0 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContentComponent/Sources/StoryChatContent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContentComponent/Sources/StoryChatContent.swift @@ -59,7 +59,7 @@ public enum StoryChatContent { if let focusItem, items.contains(where: { ($0.id.base as? Int64) == focusItem }) { sliceFocusedItemId = AnyHashable(focusItem) } else { - if let id = itemSet.items.first(where: { !$0.isSeen })?.id { + if let id = itemSet.items.first(where: { $0.id > itemSet.maxReadId })?.id { sliceFocusedItemId = AnyHashable(id) } } diff --git a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift index 210f279d0b..feaa47c9fd 100644 --- a/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryPeerListComponent/Sources/StoryPeerListComponent.swift @@ -293,7 +293,7 @@ public final class StoryPeerListComponent: Component { } for item in itemSet.items { - if !item.isSeen { + if item.id > itemSet.maxReadId { hasUnseen = true } } @@ -422,7 +422,7 @@ public final class StoryPeerListComponent: Component { if i == 0 { self.sortedItemSets.append(itemSet) } else { - self.sortedItemSets.append(StoryListContext.PeerItemSet(peerId: EnginePeer.Id(namespace: itemSet.peerId.namespace, id: EnginePeer.Id.Id._internalFromInt64Value(itemSet.peerId.id._internalGetInt64Value() + Int64(i))), peer: itemSet.peer, items: itemSet.items, totalCount: itemSet.totalCount)) + self.sortedItemSets.append(StoryListContext.PeerItemSet(peerId: EnginePeer.Id(namespace: itemSet.peerId.namespace, id: EnginePeer.Id.Id._internalFromInt64Value(itemSet.peerId.id._internalGetInt64Value() + Int64(i))), peer: itemSet.peer, maxReadId: itemSet.maxReadId, items: itemSet.items, totalCount: itemSet.totalCount)) } } }