From 9e5ed6677850665dbcec632c613daa57a15f1248 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 1 Nov 2021 01:45:48 +0400 Subject: [PATCH] Various Fixes --- Telegram/Telegram-iOS/Resources/Requests.tgs | Bin 12545 -> 14465 bytes .../Sources/JoinLinkPreviewController.swift | 4 +- .../JoinLinkPreviewControllerNode.swift | 2 +- .../LocalizationListControllerNode.swift | 37 ++++++++- .../LocalizationListItem.swift | 23 +++++- .../SyncCore/SyncCore_CachedChannelData.swift | 70 +++++++++++------- .../Peers/UpdateCachedPeerData.swift | 7 +- .../Animations/anim_inviterequest.json | 1 + .../TelegramUI/Sources/ChatController.swift | 4 +- .../Sources/ChatHistoryListNode.swift | 7 +- .../Sources/UndoOverlayController.swift | 1 + .../Sources/UndoOverlayControllerNode.swift | 13 +++- 12 files changed, 127 insertions(+), 42 deletions(-) create mode 100644 submodules/TelegramUI/Resources/Animations/anim_inviterequest.json diff --git a/Telegram/Telegram-iOS/Resources/Requests.tgs b/Telegram/Telegram-iOS/Resources/Requests.tgs index e6988086789cb5b09deb80a63a8f7831a4c2b9d0..dd00e386d0a7b27163c71ee99bbbef06112d85e7 100644 GIT binary patch literal 14465 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 deliverOnMainQueue).start(next: { [weak self] peerId in if let strongSelf = self { if strongSelf.isRequest { - strongSelf.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .info(text: strongSelf.isGroup ? strongSelf.presentationData.strings.MemberRequests_RequestToJoinSentDescriptionGroup : strongSelf.presentationData.strings.MemberRequests_RequestToJoinSentDescriptionChannel ), elevatedLayout: true, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root)) + strongSelf.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .inviteRequestSent(title: strongSelf.presentationData.strings.MemberRequests_RequestToJoinSent, text: strongSelf.isGroup ? strongSelf.presentationData.strings.MemberRequests_RequestToJoinSentDescriptionGroup : strongSelf.presentationData.strings.MemberRequests_RequestToJoinSentDescriptionChannel ), elevatedLayout: true, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root)) } else { if let peerId = peerId { strongSelf.navigateToPeer(peerId, nil) @@ -171,7 +171,7 @@ public final class JoinLinkPreviewController: ViewController { strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Conversation_UsersTooMuchError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) case .requestSent: if strongSelf.isRequest { - strongSelf.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .info(text: strongSelf.isGroup ? strongSelf.presentationData.strings.MemberRequests_RequestToJoinSentDescriptionGroup : strongSelf.presentationData.strings.MemberRequests_RequestToJoinSentDescriptionChannel ), elevatedLayout: true, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root)) + strongSelf.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .inviteRequestSent(title: strongSelf.presentationData.strings.MemberRequests_RequestToJoinSent, text: strongSelf.isGroup ? strongSelf.presentationData.strings.MemberRequests_RequestToJoinSentDescriptionGroup : strongSelf.presentationData.strings.MemberRequests_RequestToJoinSentDescriptionChannel ), elevatedLayout: true, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root)) } case .flood: strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.TwoStepAuth_FloodError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) diff --git a/submodules/JoinLinkPreviewUI/Sources/JoinLinkPreviewControllerNode.swift b/submodules/JoinLinkPreviewUI/Sources/JoinLinkPreviewControllerNode.swift index bbfa4a2b9c..bb935c0295 100644 --- a/submodules/JoinLinkPreviewUI/Sources/JoinLinkPreviewControllerNode.swift +++ b/submodules/JoinLinkPreviewUI/Sources/JoinLinkPreviewControllerNode.swift @@ -175,7 +175,7 @@ final class JoinLinkPreviewControllerNode: ViewControllerTracingNode, UIScrollVi self.contentContainerNode.insertSubnode(contentNode, at: 0) contentNode.alpha = 1.0 - let animation = contentNode.layer.makeAnimation(from: 0.0 as NSNumber, to: 1.0 as NSNumber, keyPath: "opacity", timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, duration: 0.35) + let animation = contentNode.layer.makeAnimation(from: 0.0 as NSNumber, to: 1.0 as NSNumber, keyPath: "opacity", timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue, duration: 0.25) animation.fillMode = .both if !fastOut { animation.beginTime = CACurrentMediaTime() + 0.1 diff --git a/submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift b/submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift index 334e236664..92f4263eae 100644 --- a/submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift +++ b/submodules/SettingsUI/Sources/Language Selection/LocalizationListControllerNode.swift @@ -285,6 +285,8 @@ final class LocalizationListControllerNode: ViewControllerTracingNode { private var containerLayout: (ContainerViewLayout, CGFloat)? let listNode: ListView + private let leftOverlayNode: ASDisplayNode + private let rightOverlayNode: ASDisplayNode private var queuedTransitions: [LanguageListNodeTransition] = [] private var searchDisplayController: SearchDisplayController? @@ -316,6 +318,10 @@ final class LocalizationListControllerNode: ViewControllerTracingNode { self.listNode.accessibilityPageScrolledString = { row, count in return presentationData.strings.VoiceOver_ScrollStatus(row, count).string } + self.leftOverlayNode = ASDisplayNode() + self.leftOverlayNode.backgroundColor = self.presentationData.theme.list.blocksBackgroundColor + self.rightOverlayNode = ASDisplayNode() + self.rightOverlayNode.backgroundColor = self.presentationData.theme.list.blocksBackgroundColor super.init() @@ -418,6 +424,14 @@ final class LocalizationListControllerNode: ViewControllerTracingNode { strongSelf.enqueueTransition(transition) }) self.updatedDisposable = context.engine.localization.synchronizedLocalizationListState().start() + + self.listNode.itemNodeHitTest = { [weak self] point in + if let strongSelf = self { + return point.x > strongSelf.leftOverlayNode.frame.maxX && point.x < strongSelf.rightOverlayNode.frame.minX + } else { + return true + } + } } deinit { @@ -432,6 +446,8 @@ final class LocalizationListControllerNode: ViewControllerTracingNode { self.backgroundColor = presentationData.theme.list.blocksBackgroundColor self.listNode.keepTopItemOverscrollBackground = ListViewKeepTopItemOverscrollBackground(color: presentationData.theme.chatList.backgroundColor, direction: true) self.searchDisplayController?.updatePresentationData(presentationData) + self.leftOverlayNode.backgroundColor = presentationData.theme.list.blocksBackgroundColor + self.rightOverlayNode.backgroundColor = presentationData.theme.list.blocksBackgroundColor } func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { @@ -440,8 +456,25 @@ final class LocalizationListControllerNode: ViewControllerTracingNode { var listInsets = layout.insets(options: [.input]) listInsets.top += navigationBarHeight - listInsets.left += layout.safeInsets.left - listInsets.right += layout.safeInsets.right + if layout.size.width >= 375.0 { + let inset = max(16.0, floor((layout.size.width - 674.0) / 2.0)) + listInsets.left += inset + listInsets.right += inset + } else { + listInsets.left += layout.safeInsets.left + listInsets.right += layout.safeInsets.right + } + + self.leftOverlayNode.frame = CGRect(x: 0.0, y: 0.0, width: listInsets.left, height: layout.size.height) + self.rightOverlayNode.frame = CGRect(x: layout.size.width - listInsets.right, y: 0.0, width: listInsets.right, height: layout.size.height) + + if self.leftOverlayNode.supernode == nil { + self.insertSubnode(self.leftOverlayNode, aboveSubnode: self.listNode) + } + if self.rightOverlayNode.supernode == nil { + self.insertSubnode(self.rightOverlayNode, aboveSubnode: self.listNode) + } + if let searchDisplayController = self.searchDisplayController { searchDisplayController.containerLayoutUpdated(layout, navigationBarHeight: navigationBarHeight, transition: transition) } diff --git a/submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift b/submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift index d9a6e078f3..8739c2307c 100644 --- a/submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift +++ b/submodules/SettingsUI/Sources/Language Selection/LocalizationListItem.swift @@ -52,7 +52,7 @@ class LocalizationListItem: ListViewItem, ItemListItem { async { let node = LocalizationListItemNode() var neighbors = itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem) - if previousItem == nil || previousItem is ChatListSearchItem || self.alwaysPlain { + if previousItem == nil && self.alwaysPlain { neighbors.top = .sameSection(alwaysPlain: false) } let (layout, apply) = node.asyncLayout()(self, params, neighbors) @@ -75,7 +75,7 @@ class LocalizationListItem: ListViewItem, ItemListItem { async { var neighbors = itemListNeighbors(item: self, topItem: previousItem as? ItemListItem, bottomItem: nextItem as? ItemListItem) - if previousItem == nil || previousItem is ChatListSearchItem || self.alwaysPlain { + if previousItem == nil && self.alwaysPlain { neighbors.top = .sameSection(alwaysPlain: false) } let (layout, apply) = makeLayout(self, params, neighbors) @@ -102,6 +102,7 @@ class LocalizationListItemNode: ItemListRevealOptionsItemNode { private let topStripeNode: ASDisplayNode private let bottomStripeNode: ASDisplayNode private let highlightedBackgroundNode: ASDisplayNode + private let maskNode: ASImageNode private let iconNode: ASImageNode private let activityNode: ActivityIndicator @@ -140,6 +141,9 @@ class LocalizationListItemNode: ItemListRevealOptionsItemNode { self.bottomStripeNode = ASDisplayNode() self.bottomStripeNode.isLayerBacked = true + self.maskNode = ASImageNode() + self.maskNode.isUserInteractionEnabled = false + self.iconNode = ASImageNode() self.iconNode.isLayerBacked = true self.iconNode.displayWithoutProcessing = true @@ -277,11 +281,18 @@ class LocalizationListItemNode: ItemListRevealOptionsItemNode { if strongSelf.bottomStripeNode.supernode == nil { strongSelf.insertSubnode(strongSelf.bottomStripeNode, at: 2) } + if strongSelf.maskNode.supernode == nil { + strongSelf.insertSubnode(strongSelf.maskNode, at: 3) + } + let hasCorners = itemListHasRoundedBlockLayout(params) + var hasTopCorners = false + var hasBottomCorners = false switch neighbors.top { case .sameSection(false): strongSelf.topStripeNode.isHidden = true default: - strongSelf.topStripeNode.isHidden = false + hasTopCorners = true + strongSelf.topStripeNode.isHidden = hasCorners } let bottomStripeInset: CGFloat switch neighbors.bottom { @@ -289,8 +300,14 @@ class LocalizationListItemNode: ItemListRevealOptionsItemNode { bottomStripeInset = leftInset default: bottomStripeInset = 0.0 + hasBottomCorners = true + strongSelf.bottomStripeNode.isHidden = hasCorners } + + strongSelf.maskNode.image = hasCorners ? PresentationResourcesItemList.cornersImage(item.presentationData.theme, top: hasTopCorners, bottom: hasBottomCorners) : nil + strongSelf.backgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: contentSize.height + min(insets.top, separatorHeight) + min(insets.bottom, separatorHeight))) + strongSelf.maskNode.frame = strongSelf.backgroundNode.frame.insetBy(dx: params.leftInset, dy: 0.0) strongSelf.topStripeNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -min(insets.top, separatorHeight)), size: CGSize(width: params.width, height: separatorHeight)) strongSelf.bottomStripeNode.frame = CGRect(origin: CGPoint(x: bottomStripeInset, y: contentSize.height - separatorHeight), size: CGSize(width: params.width - bottomStripeInset, height: separatorHeight)) diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedChannelData.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedChannelData.swift index 777a6238a1..871c509051 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedChannelData.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedChannelData.swift @@ -220,6 +220,7 @@ public final class CachedChannelData: CachedPeerData { public let autoremoveTimeout: CachedPeerAutoremoveTimeout public let statsDatacenterId: Int32 public let invitedBy: PeerId? + public let invitedOn: Int32? public let photo: TelegramMediaImage? public let activeCall: ActiveCall? public let callJoinPeerId: PeerId? @@ -255,6 +256,7 @@ public final class CachedChannelData: CachedPeerData { self.autoremoveTimeout = .unknown self.statsDatacenterId = 0 self.invitedBy = nil + self.invitedOn = nil self.photo = nil self.activeCall = nil self.callJoinPeerId = nil @@ -263,7 +265,7 @@ public final class CachedChannelData: CachedPeerData { self.inviteRequestsPending = nil } - public init(isNotAccessible: Bool, flags: CachedChannelFlags, about: String?, participantsSummary: CachedChannelParticipantsSummary, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, stickerPack: StickerPackCollectionInfo?, minAvailableMessageId: MessageId?, migrationReference: ChannelMigrationReference?, linkedDiscussionPeerId: LinkedDiscussionPeerId, peerGeoLocation: PeerGeoLocation?, slowModeTimeout: Int32?, slowModeValidUntilTimestamp: Int32?, hasScheduledMessages: Bool, statsDatacenterId: Int32, invitedBy: PeerId?, photo: TelegramMediaImage?, activeCall: ActiveCall?, callJoinPeerId: PeerId?, autoremoveTimeout: CachedPeerAutoremoveTimeout, pendingSuggestions: [String], themeEmoticon: String?, inviteRequestsPending: Int32?) { + public init(isNotAccessible: Bool, flags: CachedChannelFlags, about: String?, participantsSummary: CachedChannelParticipantsSummary, exportedInvitation: ExportedInvitation?, botInfos: [CachedPeerBotInfo], peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, stickerPack: StickerPackCollectionInfo?, minAvailableMessageId: MessageId?, migrationReference: ChannelMigrationReference?, linkedDiscussionPeerId: LinkedDiscussionPeerId, peerGeoLocation: PeerGeoLocation?, slowModeTimeout: Int32?, slowModeValidUntilTimestamp: Int32?, hasScheduledMessages: Bool, statsDatacenterId: Int32, invitedBy: PeerId?, invitedOn: Int32?, photo: TelegramMediaImage?, activeCall: ActiveCall?, callJoinPeerId: PeerId?, autoremoveTimeout: CachedPeerAutoremoveTimeout, pendingSuggestions: [String], themeEmoticon: String?, inviteRequestsPending: Int32?) { self.isNotAccessible = isNotAccessible self.flags = flags self.about = about @@ -282,6 +284,7 @@ public final class CachedChannelData: CachedPeerData { self.hasScheduledMessages = hasScheduledMessages self.statsDatacenterId = statsDatacenterId self.invitedBy = invitedBy + self.invitedOn = invitedOn self.photo = photo self.activeCall = activeCall self.callJoinPeerId = callJoinPeerId @@ -316,103 +319,107 @@ public final class CachedChannelData: CachedPeerData { } public func withUpdatedIsNotAccessible(_ isNotAccessible: Bool) -> CachedChannelData { - return CachedChannelData(isNotAccessible: isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedFlags(_ flags: CachedChannelFlags) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedAbout(_ about: String?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedParticipantsSummary(_ participantsSummary: CachedChannelParticipantsSummary) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedExportedInvitation(_ exportedInvitation: ExportedInvitation?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedBotInfos(_ botInfos: [CachedPeerBotInfo]) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedPeerStatusSettings(_ peerStatusSettings: PeerStatusSettings?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedStickerPack(_ stickerPack: StickerPackCollectionInfo?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedMinAvailableMessageId(_ minAvailableMessageId: MessageId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedMigrationReference(_ migrationReference: ChannelMigrationReference?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedLinkedDiscussionPeerId(_ linkedDiscussionPeerId: LinkedDiscussionPeerId) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedPeerGeoLocation(_ peerGeoLocation: PeerGeoLocation?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedSlowModeTimeout(_ slowModeTimeout: Int32?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedSlowModeValidUntilTimestamp(_ slowModeValidUntilTimestamp: Int32?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedHasScheduledMessages(_ hasScheduledMessages: Bool) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedStatsDatacenterId(_ statsDatacenterId: Int32) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedInvitedBy(_ invitedBy: PeerId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + } + + public func withUpdatedInvitedOn(_ invitedOn: Int32?) -> CachedChannelData { + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedPhoto(_ photo: TelegramMediaImage?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedActiveCall(_ activeCall: ActiveCall?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedCallJoinPeerId(_ callJoinPeerId: PeerId?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedAutoremoveTimeout(_ autoremoveTimeout: CachedPeerAutoremoveTimeout) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: autoremoveTimeout, pendingSuggestions: self.pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedPendingSuggestions(_ pendingSuggestions: [String]) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedThemeEmoticon(_ themeEmoticon: String?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: pendingSuggestions, themeEmoticon: themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: pendingSuggestions, themeEmoticon: themeEmoticon, inviteRequestsPending: self.inviteRequestsPending) } public func withUpdatedInviteRequestsPending(_ inviteRequestsPending: Int32?) -> CachedChannelData { - return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: inviteRequestsPending) + return CachedChannelData(isNotAccessible: self.isNotAccessible, flags: self.flags, about: self.about, participantsSummary: self.participantsSummary, exportedInvitation: self.exportedInvitation, botInfos: self.botInfos, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, stickerPack: self.stickerPack, minAvailableMessageId: self.minAvailableMessageId, migrationReference: self.migrationReference, linkedDiscussionPeerId: self.linkedDiscussionPeerId, peerGeoLocation: self.peerGeoLocation, slowModeTimeout: self.slowModeTimeout, slowModeValidUntilTimestamp: self.slowModeValidUntilTimestamp, hasScheduledMessages: self.hasScheduledMessages, statsDatacenterId: self.statsDatacenterId, invitedBy: self.invitedBy, invitedOn: self.invitedOn, photo: self.photo, activeCall: self.activeCall, callJoinPeerId: self.callJoinPeerId, autoremoveTimeout: self.autoremoveTimeout, pendingSuggestions: pendingSuggestions, themeEmoticon: self.themeEmoticon, inviteRequestsPending: inviteRequestsPending) } public init(decoder: PostboxDecoder) { @@ -486,6 +493,7 @@ public final class CachedChannelData: CachedPeerData { self.statsDatacenterId = decoder.decodeInt32ForKey("sdi", orElse: 0) self.invitedBy = decoder.decodeOptionalInt64ForKey("invBy").flatMap(PeerId.init) + self.invitedOn = decoder.decodeOptionalInt32ForKey("invOn") self.pendingSuggestions = decoder.decodeStringArrayForKey("sug") @@ -611,6 +619,12 @@ public final class CachedChannelData: CachedPeerData { encoder.encodeNil(forKey: "invBy") } + if let invitedOn = self.invitedOn { + encoder.encodeInt32(invitedOn, forKey: "invOn") + } else { + encoder.encodeNil(forKey: "invOn") + } + if let photo = self.photo { encoder.encodeObject(photo, forKey: "ph") } else { @@ -713,6 +727,10 @@ public final class CachedChannelData: CachedPeerData { return false } + if other.invitedOn != self.invitedOn { + return false + } + if other.photo != self.photo { return false } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift index 3d40f1d1b7..ecf3569431 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/UpdateCachedPeerData.swift @@ -485,12 +485,14 @@ func _internal_fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPee } var invitedBy: PeerId? + var invitedOn: Int32? if let participantResult = participantResult { switch participantResult { - case let.channelParticipant(participant, _, _): + case let .channelParticipant(participant, _, _): switch participant { - case let .channelParticipantSelf(_, _, inviterId, _): + case let .channelParticipantSelf(_, _, inviterId, invitedDate): invitedBy = PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(inviterId)) + invitedOn = invitedDate default: break } @@ -536,6 +538,7 @@ func _internal_fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPee .withUpdatedHasScheduledMessages(hasScheduledMessages) .withUpdatedStatsDatacenterId(statsDc ?? 0) .withUpdatedInvitedBy(invitedBy) + .withUpdatedInvitedOn(invitedOn) .withUpdatedPhoto(photo) .withUpdatedActiveCall(updatedActiveCall) .withUpdatedCallJoinPeerId(groupcallDefaultJoinAs?.peerId) diff --git a/submodules/TelegramUI/Resources/Animations/anim_inviterequest.json b/submodules/TelegramUI/Resources/Animations/anim_inviterequest.json new file mode 100644 index 0000000000..9c648db3fe --- /dev/null +++ b/submodules/TelegramUI/Resources/Animations/anim_inviterequest.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":66,"w":512,"h":512,"nm":"Timer 3","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL SCALE","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[0.966,0.966,1]},"o":{"x":[0.28,0.28,0.28],"y":[0,0,0]},"t":0,"s":[30,30,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0.394,0.394,0]},"t":9,"s":[95,95,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":41,"s":[105,105,100]},{"t":44,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"CLOCK","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":34,"s":[80,80,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":44,"s":[110,110,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":52,"s":[82,82,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":59,"s":[92,92,100]},{"t":65,"s":[90,90,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[11.211,0],[0,0],[0,0],[0,0],[0,0],[-9.796,7.035],[0,0],[0,0],[0,0]],"o":[[-21,0],[0,0],[-2.305,12.015],[0,0],[7.291,8.293],[15.745,-11.307],[0,0],[0,0],[-0.598,-11.062]],"v":[[-6,-122.848],[-27,-101.848],[-28.463,6.836],[-24.073,27.731],[41.295,111.116],[69.984,113.783],[73.601,84.305],[14.264,9.224],[14.969,-103]],"c":true}]},{"t":46,"s":[{"i":[[11.211,0],[0,0],[0,0],[0,0],[0,0],[-8.163,8.879],[0,0],[0,0],[0,0]],"o":[[-21,0],[0,0],[0.793,12.208],[0,0],[8.824,6.639],[13.119,-14.27],[0,0],[0,0],[-0.598,-11.062]],"v":[[-6,-122.848],[-27,-101.848],[-26.959,15.958],[-17.453,35.076],[61.581,101.988],[90.214,98.77],[87.766,69.173],[14.994,7.518],[14.969,-103]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-109.352,0],[0,-109.352],[109.352,0],[0,109.352]],"o":[[109.352,0],[0,109.352],[-109.352,0],[0,-109.352]],"v":[[0,-198],[198,0],[0,198],[-198,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined-Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":81,"st":3,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Circle","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":130,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-100.751,0],[0,-100.751],[100.751,0],[0,100.751]],"o":[[100.751,0],[0,100.751],[-100.751,0],[0,-100.751]],"v":[[0,-182.427],[182.426,0],[0,182.426],[-182.427,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":3,"s":[64]},{"t":46,"s":[0]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":0,"ix":1}},{"n":"o","nm":"offset","v":{"a":0,"k":-17,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":37,"st":3,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Circle Dashes","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":130,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-100.751,0],[0,-100.751],[100.751,0],[0,100.751]],"o":[[100.751,0],[0,100.751],[-100.751,0],[0,-100.751]],"v":[[0,-182.427],[182.426,0],[0,182.426],[-182.427,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":2,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":75,"ix":2}},{"n":"o","nm":"offset","v":{"a":0,"k":108,"ix":7}}],"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":37,"st":3,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Arrow 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":3,"s":[204]},{"t":46,"s":[0]}],"ix":10},"p":{"a":0,"k":[-5.75,12.531,0],"ix":2},"a":{"a":0,"k":[-6.389,13.924,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.126,-15.958],[0,0],[0,0],[-8.163,8.879],[0,0],[2.494,3.074]],"o":[[-0.833,11.803],[0,0],[8.824,6.639],[13.119,-14.27],[0,0],[-13.883,-15.574]],"v":[[-26.959,15.958],[-17.029,36.066],[61.581,101.988],[90.214,98.77],[87.766,69.173],[14.994,7.518]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.681,15.34],"ix":2},"a":{"a":0,"k":[-5.681,15.34],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined-Shape","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":37,"st":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Arrow 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":3,"s":[28]},{"t":46,"s":[0]}],"ix":10},"p":{"a":0,"k":[-5.75,12.5,0],"ix":2},"a":{"a":0,"k":[-6.389,13.889,0],"ix":1},"s":{"a":0,"k":[90,90,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.211,0],[0,0],[0,0],[-0.398,-7.127],[-0.792,23.558],[0,0]],"o":[[-21,0],[0,0],[0.086,2.004],[0.924,16.553],[0.302,-8.972],[-0.598,-11.062]],"v":[[-6,-122.848],[-27,-101.848],[-26.959,15.958],[-27.036,15.947],[14.959,7.553],[14.969,-103]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.681,15.34],"ix":2},"a":{"a":0,"k":[-5.681,15.34],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined-Shape","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":1,"op":37,"st":1,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index bba62cc65a..72986c4a17 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -5012,7 +5012,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self.chatDisplayNode.historyNode.scrolledToIndex = { [weak self] toIndex, initial in if let strongSelf = self, case let .message(index) = toIndex { if case let .message(messageSubject, _, _) = strongSelf.subject, initial, case let .id(messageId) = messageSubject, messageId != index.id { - strongSelf.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .info(text: strongSelf.presentationData.strings.Conversation_MessageDoesntExist), elevatedLayout: false, action: { _ in return true }), in: .current) + if messageId.peerId == index.id.peerId { + strongSelf.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .info(text: strongSelf.presentationData.strings.Conversation_MessageDoesntExist), elevatedLayout: false, action: { _ in return true }), in: .current) + } } else if let controllerInteraction = strongSelf.controllerInteraction { if let message = strongSelf.chatDisplayNode.historyNode.messageInCurrentHistoryView(index.id) { let highlightedState = ChatInterfaceHighlightedState(messageStableId: message.stableId) diff --git a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift index 79f70e97fd..687449a15c 100644 --- a/submodules/TelegramUI/Sources/ChatHistoryListNode.swift +++ b/submodules/TelegramUI/Sources/ChatHistoryListNode.swift @@ -795,10 +795,10 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { if indexKeys.count > 1, let first = indexKeys.first, let last = indexKeys.last { let emoji: String? let indexEmoji: String? - if sequence.contains(first) { + if sequence.contains(first.strippedEmoji) { emoji = last indexEmoji = first - } else if sequence.contains(last) { + } else if sequence.contains(last.strippedEmoji) { emoji = first indexEmoji = last } else { @@ -806,8 +806,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode { indexEmoji = nil } - if let emoji = emoji, let indexEmoji = indexEmoji?.first, let strIndex = sequence.firstIndex(of: indexEmoji) { - let emoji = emoji.strippedEmoji + if let emoji = emoji?.strippedEmoji, let indexEmoji = indexEmoji?.first, let strIndex = sequence.firstIndex(of: indexEmoji) { let index = sequence.distance(from: sequence.startIndex, to: strIndex) if animatedEmojiStickers[emoji] != nil { animatedEmojiStickers[emoji]![index] = item diff --git a/submodules/UndoUI/Sources/UndoOverlayController.swift b/submodules/UndoUI/Sources/UndoOverlayController.swift index 9f28553e3f..6b3a4b2abd 100644 --- a/submodules/UndoUI/Sources/UndoOverlayController.swift +++ b/submodules/UndoUI/Sources/UndoOverlayController.swift @@ -37,6 +37,7 @@ public enum UndoOverlayContent { case copy(text: String) case mediaSaved(text: String) case paymentSent(currencyValue: String, itemTitle: String) + case inviteRequestSent(title: String, text: String) } public enum UndoOverlayAction { diff --git a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift index 260b5edafc..c0b1ea47bb 100644 --- a/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift +++ b/submodules/UndoUI/Sources/UndoOverlayControllerNode.swift @@ -733,6 +733,17 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { displayUndo = false self.originalRemainingSeconds = 3 + case let .inviteRequestSent(title, text): + self.avatarNode = nil + self.iconNode = nil + self.iconCheckNode = nil + self.animationNode = AnimationNode(animation: "anim_inviterequest", colors: [:], scale: 1.0) + self.animatedStickerNode = nil + self.titleNode.attributedText = NSAttributedString(string: title, font: Font.semibold(14.0), textColor: .white) + self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(14.0), textColor: .white) + self.textNode.maximumNumberOfLines = 2 + displayUndo = false + self.originalRemainingSeconds = 5 } self.remainingSeconds = self.originalRemainingSeconds @@ -761,7 +772,7 @@ final class UndoOverlayControllerNode: ViewControllerTracingNode { switch content { case .removedChat: self.panelWrapperNode.addSubnode(self.timerTextNode) - case .archivedChat, .hidArchive, .revealedArchive, .autoDelete, .succeed, .emoji, .swipeToReply, .actionSucceeded, .stickersModified, .chatAddedToFolder, .chatRemovedFromFolder, .messagesUnpinned, .setProximityAlert, .invitedToVoiceChat, .linkCopied, .banned, .importedMessage, .audioRate, .forward, .gigagroupConversion, .linkRevoked, .voiceChatRecording, .voiceChatFlag, .voiceChatCanSpeak, .sticker, .copy, .mediaSaved, .paymentSent: + case .archivedChat, .hidArchive, .revealedArchive, .autoDelete, .succeed, .emoji, .swipeToReply, .actionSucceeded, .stickersModified, .chatAddedToFolder, .chatRemovedFromFolder, .messagesUnpinned, .setProximityAlert, .invitedToVoiceChat, .linkCopied, .banned, .importedMessage, .audioRate, .forward, .gigagroupConversion, .linkRevoked, .voiceChatRecording, .voiceChatFlag, .voiceChatCanSpeak, .sticker, .copy, .mediaSaved, .paymentSent, .inviteRequestSent: break case .dice: self.panelWrapperNode.clipsToBounds = true