Fix ad peer preloading

This commit is contained in:
Ilya Laktyushin 2024-04-22 23:51:54 +04:00
parent f199fe9641
commit 2ed2284542
2 changed files with 37 additions and 8 deletions

View File

@ -34,6 +34,7 @@ import ChatMessageBubbleItemNode
import ChatMessageTransitionNode
import ChatControllerInteraction
import DustEffect
import UrlHandling
struct ChatTopVisibleMessageRange: Equatable {
var lowerBound: MessageIndex
@ -674,7 +675,7 @@ public final class ChatHistoryListNodeImpl: ListView, ChatHistoryNode, ChatHisto
let adMessagesContext: AdMessagesHistoryContext?
private var adMessagesDisposable: Disposable?
private var preloadAdPeerId: PeerId?
private var preloadAdPeerName: String?
private let preloadAdPeerDisposable = MetaDisposable()
private var didSetupRecommendedChannelsPreload = false
private let preloadRecommendedChannelsDisposable = MetaDisposable()
@ -1117,16 +1118,23 @@ public final class ChatHistoryListNodeImpl: ListView, ChatHistoryNode, ChatHisto
self.allAdMessages = (messages.first, [], 0)
} else {
var adPeerId: PeerId?
adPeerId = messages.first?.author?.id
var adPeerName: String?
if let adAttribute = messages.first?.adAttribute, let parsedUrl = parseAdUrl(sharedContext: self.context.sharedContext, url: adAttribute.url), case let .peer(reference, _) = parsedUrl, case let .name(peerName) = reference {
adPeerName = peerName
}
if self.preloadAdPeerId != adPeerId {
self.preloadAdPeerId = adPeerId
if let adPeerId = adPeerId {
if self.preloadAdPeerName != adPeerName {
self.preloadAdPeerName = adPeerName
if let adPeerName {
let context = self.context
let combinedDisposable = DisposableSet()
self.preloadAdPeerDisposable.set(combinedDisposable)
combinedDisposable.add(self.context.account.viewTracker.polledChannel(peerId: adPeerId).startStrict())
combinedDisposable.add(self.context.account.addAdditionalPreloadHistoryPeerId(peerId: adPeerId))
combinedDisposable.add(context.engine.peers.resolvePeerByName(name: adPeerName).startStrict(next: { result in
if case let .result(maybePeer) = result, let peer = maybePeer {
combinedDisposable.add(context.account.viewTracker.polledChannel(peerId: peer.id).startStrict())
combinedDisposable.add(context.account.addAdditionalPreloadHistoryPeerId(peerId: peer.id))
}
}))
} else {
self.preloadAdPeerDisposable.set(nil)
}

View File

@ -1117,6 +1117,27 @@ public func parseWallpaperUrl(sharedContext: SharedAccountContext, url: String)
return nil
}
public func parseAdUrl(sharedContext: SharedAccountContext, url: String) -> ParsedInternalUrl? {
let schemes = ["http://", "https://", ""]
for basePath in baseTelegramMePaths {
for scheme in schemes {
let basePrefix = scheme + basePath + "/"
if url.lowercased().hasPrefix(basePrefix) {
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: String(url[basePrefix.endIndex...])), case .peer = internalUrl {
return internalUrl
}
}
}
}
if let parsedUrl = URL(string: url), parsedUrl.scheme == "tg", let host = parsedUrl.host, let query = parsedUrl.query {
if let internalUrl = parseInternalUrl(sharedContext: sharedContext, query: host + "?" + query), case .peer = internalUrl {
return internalUrl
}
}
return nil
}
private struct UrlHandlingConfiguration {
static var defaultValue: UrlHandlingConfiguration {
return UrlHandlingConfiguration(domains: [], urlAuthDomains: [])