From f681453bd0bd3a4e6ea7de5454f9b426db804463 Mon Sep 17 00:00:00 2001 From: Isaac <> Date: Sat, 17 May 2025 00:34:35 +0800 Subject: [PATCH] Update API --- .../Sources/AttachmentPanel.swift | 10 +------- .../Sources/ShareController.swift | 25 +++---------------- .../Sources/ShareControllerNode.swift | 6 +---- submodules/TelegramApi/Sources/Api38.swift | 7 +++--- .../TelegramCore/Sources/ForumChannels.swift | 4 +-- .../PendingMessages/EnqueueMessage.swift | 6 +---- .../Sources/State/PaidMessages.swift | 9 ++++++- .../TelegramEngine/Data/PeersData.swift | 16 ++---------- .../Peers/ChannelCreation.swift | 2 +- .../Peers/TelegramEnginePeers.swift | 4 +-- .../Sources/PeerInfoScreen.swift | 6 ++--- .../PostSuggestionsSettingsScreen.swift | 16 +++++++++--- .../Chat/ChatControllerLoadDisplayNode.swift | 12 ++------- 13 files changed, 43 insertions(+), 80 deletions(-) diff --git a/submodules/AttachmentUI/Sources/AttachmentPanel.swift b/submodules/AttachmentUI/Sources/AttachmentPanel.swift index 7aae802834..757e2ed170 100644 --- a/submodules/AttachmentUI/Sources/AttachmentPanel.swift +++ b/submodules/AttachmentUI/Sources/AttachmentPanel.swift @@ -1297,15 +1297,7 @@ final class AttachmentPanel: ASDisplayNode, ASScrollViewDelegate { if let data = view.cachedData as? CachedUserData { return data.sendPaidMessageStars } else if let channel = peerViewMainPeer(view) as? TelegramChannel { - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId { - if let mainChannel = view.peers[linkedMonoforumId] as? TelegramChannel { - return mainChannel.sendPaidMessageStars - } else { - return nil - } - } else { - return channel.sendPaidMessageStars - } + return channel.sendPaidMessageStars } else { return nil } diff --git a/submodules/ShareController/Sources/ShareController.swift b/submodules/ShareController/Sources/ShareController.swift index d1d020024d..228a9fd417 100644 --- a/submodules/ShareController/Sources/ShareController.swift +++ b/submodules/ShareController/Sources/ShareController.swift @@ -1266,13 +1266,7 @@ public final class ShareController: ViewController { requiresStars[peerId] = cachedData.sendPaidMessageStars } } else if let channel = peer as? TelegramChannel { - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId { - if let mainChannel = view.peers[linkedMonoforumId] as? TelegramChannel { - requiresStars[peerId] = mainChannel.sendPaidMessageStars - } - } else { - requiresStars[peerId] = channel.sendPaidMessageStars - } + requiresStars[peerId] = channel.sendPaidMessageStars } } } @@ -1926,13 +1920,7 @@ public final class ShareController: ViewController { requiresStars[peerId] = cachedData.sendPaidMessageStars } } else if let channel = peer as? TelegramChannel { - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId { - if let mainChannel = view.peers[linkedMonoforumId] as? TelegramChannel { - requiresStars[peerId] = mainChannel.sendPaidMessageStars - } - } else { - requiresStars[peerId] = channel.sendPaidMessageStars - } + requiresStars[peerId] = channel.sendPaidMessageStars } } } @@ -2530,9 +2518,6 @@ public final class ShareController: ViewController { possiblePremiumRequiredPeers.insert(user.id) } else if let channel = peer as? TelegramChannel, let _ = channel.sendPaidMessageStars { possiblePremiumRequiredPeers.insert(channel.id) - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId, let mainChannel = entryData.renderedPeer.peers[linkedMonoforumId] as? TelegramChannel, mainChannel.sendPaidMessageStars != nil { - possiblePremiumRequiredPeers.insert(channel.id) - } } } default: @@ -2565,11 +2550,7 @@ public final class ShareController: ViewController { requiresPremiumForMessaging[id] = data.flags.contains(.premiumRequired) requiresStars[id] = data.sendPaidMessageStars?.value } else if let view = views.views[.basicPeer(id)] as? PeerView, let channel = peerViewMainPeer(view) as? TelegramChannel { - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId, let mainChannel = view.peers[linkedMonoforumId] as? TelegramChannel { - requiresStars[id] = mainChannel.sendPaidMessageStars?.value - } else { - requiresStars[id] = channel.sendPaidMessageStars?.value - } + requiresStars[id] = channel.sendPaidMessageStars?.value } else { requiresPremiumForMessaging[id] = false } diff --git a/submodules/ShareController/Sources/ShareControllerNode.swift b/submodules/ShareController/Sources/ShareControllerNode.swift index 6c453f4459..9a65643f33 100644 --- a/submodules/ShareController/Sources/ShareControllerNode.swift +++ b/submodules/ShareController/Sources/ShareControllerNode.swift @@ -1291,11 +1291,7 @@ final class ShareControllerNode: ViewControllerTracingNode, ASScrollViewDelegate requiresStars[peerId] = cachedData.sendPaidMessageStars?.value } } else if let channel = peer as? TelegramChannel { - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId, let mainChannel = view.peers[linkedMonoforumId] as? TelegramChannel { - requiresStars[peerId] = mainChannel.sendPaidMessageStars?.value - } else { - requiresStars[peerId] = channel.sendPaidMessageStars?.value - } + requiresStars[peerId] = channel.sendPaidMessageStars?.value } } } diff --git a/submodules/TelegramApi/Sources/Api38.swift b/submodules/TelegramApi/Sources/Api38.swift index 490b54cdbd..0a949138d9 100644 --- a/submodules/TelegramApi/Sources/Api38.swift +++ b/submodules/TelegramApi/Sources/Api38.swift @@ -3607,12 +3607,13 @@ public extension Api.functions.channels { } } public extension Api.functions.channels { - static func toggleForum(channel: Api.InputChannel, enabled: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + static func toggleForum(channel: Api.InputChannel, enabled: Api.Bool, tabs: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-1540781271) + buffer.appendInt32(1073174324) channel.serialize(buffer, true) enabled.serialize(buffer, true) - return (FunctionDescription(name: "channels.toggleForum", parameters: [("channel", String(describing: channel)), ("enabled", String(describing: enabled))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in + tabs.serialize(buffer, true) + return (FunctionDescription(name: "channels.toggleForum", parameters: [("channel", String(describing: channel)), ("enabled", String(describing: enabled)), ("tabs", String(describing: tabs))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Updates? in let reader = BufferReader(buffer) var result: Api.Updates? if let signature = reader.readInt32() { diff --git a/submodules/TelegramCore/Sources/ForumChannels.swift b/submodules/TelegramCore/Sources/ForumChannels.swift index b880eddbb4..a4e8f5dfa4 100644 --- a/submodules/TelegramCore/Sources/ForumChannels.swift +++ b/submodules/TelegramCore/Sources/ForumChannels.swift @@ -507,7 +507,7 @@ func _internal_setForumChannelPinnedTopics(account: Account, id: EnginePeer.Id, } } -func _internal_setChannelForumMode(postbox: Postbox, network: Network, stateManager: AccountStateManager, peerId: PeerId, isForum: Bool) -> Signal { +func _internal_setChannelForumMode(postbox: Postbox, network: Network, stateManager: AccountStateManager, peerId: PeerId, isForum: Bool, displayForumAsTabs: Bool) -> Signal { return postbox.transaction { transaction -> Api.InputChannel? in return transaction.getPeer(peerId).flatMap(apiInputChannel) } @@ -515,7 +515,7 @@ func _internal_setChannelForumMode(postbox: Postbox, network: Network, stateMana guard let inputChannel = inputChannel else { return .complete() } - return network.request(Api.functions.channels.toggleForum(channel: inputChannel, enabled: isForum ? .boolTrue : .boolFalse)) + return network.request(Api.functions.channels.toggleForum(channel: inputChannel, enabled: isForum ? .boolTrue : .boolFalse, tabs: displayForumAsTabs ? .boolTrue : .boolFalse)) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil) diff --git a/submodules/TelegramCore/Sources/PendingMessages/EnqueueMessage.swift b/submodules/TelegramCore/Sources/PendingMessages/EnqueueMessage.swift index 8d8ea821a6..360e066bee 100644 --- a/submodules/TelegramCore/Sources/PendingMessages/EnqueueMessage.swift +++ b/submodules/TelegramCore/Sources/PendingMessages/EnqueueMessage.swift @@ -413,11 +413,7 @@ public func resendMessages(account: Account, messageIds: [MessageId]) -> Signal< } else if let channel = peer as? TelegramChannel { if channel.flags.contains(.isCreator) || channel.adminRights != nil { } else { - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId, let mainChannel = transaction.getPeer(linkedMonoforumId) as? TelegramChannel { - sendPaidMessageStars = mainChannel.sendPaidMessageStars - } else { - sendPaidMessageStars = channel.sendPaidMessageStars - } + sendPaidMessageStars = channel.sendPaidMessageStars } } diff --git a/submodules/TelegramCore/Sources/State/PaidMessages.swift b/submodules/TelegramCore/Sources/State/PaidMessages.swift index 804f2b2676..d72997b581 100644 --- a/submodules/TelegramCore/Sources/State/PaidMessages.swift +++ b/submodules/TelegramCore/Sources/State/PaidMessages.swift @@ -83,10 +83,17 @@ func _internal_updateChannelPaidMessagesStars(account: Account, peerId: PeerId, } let channel = channel .withUpdatedInfo(.broadcast(TelegramChannelBroadcastInfo(flags: infoFlags))) - .withUpdatedSendPaidMessageStars(stars) transaction.updatePeersInternal([channel], update: { _, channel in return channel }) + + if let linkedMonoforumId = channel.linkedMonoforumId, let monoforumChannel = transaction.getPeer(linkedMonoforumId) as? TelegramChannel { + let monoforumChannel = monoforumChannel + .withUpdatedSendPaidMessageStars(stars) + transaction.updatePeersInternal([monoforumChannel], update: { _, channel in + return monoforumChannel + }) + } } return account.network.request(Api.functions.channels.updatePaidMessagesPrice(flags: flags, channel: inputChannel, sendPaidMessagesStars: stars?.value ?? 0)) diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Data/PeersData.swift b/submodules/TelegramCore/Sources/TelegramEngine/Data/PeersData.swift index a3659f143d..3999c200e2 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Data/PeersData.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Data/PeersData.swift @@ -385,11 +385,7 @@ public extension TelegramEngine.EngineData.Item { if let cachedPeerData = view.cachedData as? CachedUserData { return cachedPeerData.sendPaidMessageStars } else if let channel = peerViewMainPeer(view) as? TelegramChannel { - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId, let mainChannel = view.peers[linkedMonoforumId] as? TelegramChannel { - return mainChannel.sendPaidMessageStars - } else { - return channel.sendPaidMessageStars - } + return channel.sendPaidMessageStars } else { return nil } @@ -417,15 +413,7 @@ public extension TelegramEngine.EngineData.Item { preconditionFailure() } if let channel = peerViewMainPeer(view) as? TelegramChannel { - if case let .broadcast(info) = channel.info { - if info.flags.contains(.hasMonoforum) { - return channel.sendPaidMessageStars ?? StarsAmount(value: 0, nanos: 0) - } else { - return nil - } - } else { - return nil - } + return channel.sendPaidMessageStars } else { return nil } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChannelCreation.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChannelCreation.swift index d74f0fe857..10c5a4a261 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChannelCreation.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChannelCreation.swift @@ -76,7 +76,7 @@ private func createChannel(postbox: Postbox, network: Network, stateManager: Acc |> timeout(5.0, queue: Queue.concurrentDefaultQueue(), alternate: .fail(.generic)) |> mapToSignal { peerId -> Signal in if title.contains("*forum") { - return _internal_setChannelForumMode(postbox: postbox, network: network, stateManager: stateManager, peerId: peerId, isForum: true) + return _internal_setChannelForumMode(postbox: postbox, network: network, stateManager: stateManager, peerId: peerId, isForum: true, displayForumAsTabs: true) |> castError(CreateChannelError.self) |> map { _ -> PeerId in } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift index 43473b51cb..4719a84401 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift @@ -1233,8 +1233,8 @@ public extension TelegramEngine { |> ignoreValues } - public func setChannelForumMode(id: EnginePeer.Id, isForum: Bool) -> Signal { - return _internal_setChannelForumMode(postbox: self.account.postbox, network: self.account.network, stateManager: self.account.stateManager, peerId: id, isForum: isForum) + public func setChannelForumMode(id: EnginePeer.Id, isForum: Bool, displayForumAsTabs: Bool) -> Signal { + return _internal_setChannelForumMode(postbox: self.account.postbox, network: self.account.network, stateManager: self.account.stateManager, peerId: id, isForum: isForum, displayForumAsTabs: displayForumAsTabs) } public func createForumChannelTopic(id: EnginePeer.Id, title: String, iconColor: Int32, iconFileId: Int64?) -> Signal { diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift index 8839ab0939..1d103b0656 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift @@ -9243,7 +9243,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro if isEnabled { let context = self.context let signal: Signal = self.context.engine.peers.convertGroupToSupergroup(peerId: self.peerId, additionalProcessing: { upgradedPeerId -> Signal in - return context.engine.peers.setChannelForumMode(id: upgradedPeerId, isForum: isEnabled) + return context.engine.peers.setChannelForumMode(id: upgradedPeerId, isForum: isEnabled, displayForumAsTabs: false) }) |> map(Optional.init) |> `catch` { [weak self] error -> Signal in @@ -9273,7 +9273,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro return } - let _ = (self.context.engine.peers.setChannelForumMode(id: resultPeerId, isForum: isEnabled) + let _ = (self.context.engine.peers.setChannelForumMode(id: resultPeerId, isForum: isEnabled, displayForumAsTabs: false) |> deliverOnMainQueue).startStandalone(completed: { [weak self] in guard let self, let controller = self.controller else { return @@ -9286,7 +9286,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro }) } } else { - let _ = self.context.engine.peers.setChannelForumMode(id: self.peerId, isForum: isEnabled).startStandalone() + let _ = self.context.engine.peers.setChannelForumMode(id: self.peerId, isForum: isEnabled, displayForumAsTabs: false).startStandalone() } } diff --git a/submodules/TelegramUI/Components/PeerInfo/PostSuggestionsSettingsScreen/Sources/PostSuggestionsSettingsScreen.swift b/submodules/TelegramUI/Components/PeerInfo/PostSuggestionsSettingsScreen/Sources/PostSuggestionsSettingsScreen.swift index 231ca9a123..7e783c1a31 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PostSuggestionsSettingsScreen/Sources/PostSuggestionsSettingsScreen.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PostSuggestionsSettingsScreen/Sources/PostSuggestionsSettingsScreen.swift @@ -501,11 +501,21 @@ public final class PostSuggestionsSettingsScreen: ViewControllerComponentContain let configuration = StarsSubscriptionConfiguration.with(appConfiguration: context.currentAppConfiguration.with({ $0 })) - let (peer, initialPrice) = await context.engine.data.get( - TelegramEngine.EngineData.Item.Peer.Peer(id: peerId), - TelegramEngine.EngineData.Item.Peer.SendMessageToChannelPrice(id: peerId) + let peer = await context.engine.data.get( + TelegramEngine.EngineData.Item.Peer.Peer(id: peerId) ).get() + let initialPrice: StarsAmount? + if case let .channel(channel) = peer, case let .broadcast(info) = channel.info, info.flags.contains(.hasMonoforum), let linkedMonoforumId = channel.linkedMonoforumId { + initialPrice = await context.engine.data.get( + TelegramEngine.EngineData.Item.Peer.SendMessageToChannelPrice(id: linkedMonoforumId) + ).get() ?? StarsAmount(value: 20, nanos: 0) + } else { + initialPrice = await context.engine.data.get( + TelegramEngine.EngineData.Item.Peer.SendMessageToChannelPrice(id: peerId) + ).get() + } + super.init(context: context, component: PostSuggestionsSettingsScreenComponent( context: context, usdWithdrawRate: configuration.usdWithdrawRate, diff --git a/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift b/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift index e00b67bb78..6d5bdbbedc 100644 --- a/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift +++ b/submodules/TelegramUI/Sources/Chat/ChatControllerLoadDisplayNode.swift @@ -725,11 +725,7 @@ extension ChatControllerImpl { if let channel = peerView.peers[peerView.peerId] as? TelegramChannel { if channel.flags.contains(.isCreator) || channel.adminRights != nil { } else { - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId, let mainChannel = peerView.peers[linkedMonoforumId] as? TelegramChannel { - sendPaidMessageStars = mainChannel.sendPaidMessageStars - } else { - sendPaidMessageStars = channel.sendPaidMessageStars - } + sendPaidMessageStars = channel.sendPaidMessageStars } } } @@ -1364,11 +1360,7 @@ extension ChatControllerImpl { if let channel = peerView.peers[peerView.peerId] as? TelegramChannel { if channel.flags.contains(.isCreator) || channel.adminRights != nil { } else { - if channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId, let mainChannel = peerView.peers[linkedMonoforumId] as? TelegramChannel { - sendPaidMessageStars = mainChannel.sendPaidMessageStars - } else { - sendPaidMessageStars = channel.sendPaidMessageStars - } + sendPaidMessageStars = channel.sendPaidMessageStars } } }