Update Ghostgram features

This commit is contained in:
ichmagmaus 812
2026-03-07 18:15:32 +01:00
parent 1a3303b059
commit 24a7ec39d9
902 changed files with 148295 additions and 62348 deletions
@@ -1,3 +1,4 @@
import SGSimpleSettings
import Foundation
import TelegramPresentationData
import AccountContext
@@ -136,6 +137,10 @@ extension ChatControllerImpl {
var voiceMessagesAvailable: Bool = true
var requestsState: PeerInvitationImportersState?
var dismissedInvitationRequests: [Int64]?
// MARK: Swiftgram
var predictedChatLanguage: String?
var customEmojiAvailable: Bool = false
var threadData: ChatPresentationInterfaceState.ThreadData?
var forumTopicData: ChatPresentationInterfaceState.ThreadData?
@@ -163,6 +168,9 @@ extension ChatControllerImpl {
private var premiumGiftSuggestionDisposable: Disposable?
private var translationStateDisposable: Disposable?
// MARK: Swiftgram
private var chatLanguagePredictionDisposable: Disposable?
private let isPeerInfoReady = ValuePromise<Bool>(false, ignoreRepeated: true)
private let isChatLocationInfoReady = ValuePromise<Bool>(false, ignoreRepeated: true)
private let isCachedDataReady = ValuePromise<Bool>(false, ignoreRepeated: true)
@@ -893,8 +901,7 @@ extension ChatControllerImpl {
peerVerification = cachedChannelData.verification
}
}
// GHOSTGRAM: Bypass copy protection if enabled in Misc settings
copyProtectionEnabled = MiscSettingsManager.shared.shouldBypassCopyProtection ? false : peer.isCopyProtectionEnabled
copyProtectionEnabled = peer.isCopyProtectionEnabled
if let cachedGroupData = peerView.cachedData as? CachedGroupData {
if !cachedGroupData.botInfos.isEmpty {
hasBots = true
@@ -983,7 +990,9 @@ extension ChatControllerImpl {
}
var adMessage = adMessage
if let peer = peerView.peers[peerView.peerId] as? TelegramUser, peer.botInfo != nil {
if MiscSettingsManager.shared.shouldBlockAds {
adMessage = nil
} else if let peer = peerView.peers[peerView.peerId] as? TelegramUser, peer.botInfo != nil {
} else {
adMessage = nil
}
@@ -1028,7 +1037,7 @@ extension ChatControllerImpl {
} else {
isRegularChat = true
}
if strongSelf.nextChannelToReadDisposable == nil, let peerId = chatLocation.peerId, let customChatNavigationStack {
if strongSelf.nextChannelToReadDisposable == nil, let peerId = chatLocation.peerId, let customChatNavigationStack, !SGSimpleSettings.shared.disableScrollToNextChannel {
if let index = customChatNavigationStack.firstIndex(of: peerId), index != customChatNavigationStack.count - 1 {
let nextPeerId = customChatNavigationStack[index + 1]
strongSelf.nextChannelToReadDisposable = (combineLatest(queue: .mainQueue(),
@@ -1072,7 +1081,7 @@ extension ChatControllerImpl {
}
})
}
} else if isRegularChat, strongSelf.nextChannelToReadDisposable == nil {
} else if isRegularChat, strongSelf.nextChannelToReadDisposable == nil, !SGSimpleSettings.shared.disableScrollToNextChannel {
//TODO:loc optimize
let accountPeerId = context.account.peerId
strongSelf.nextChannelToReadDisposable = (combineLatest(queue: .mainQueue(),
@@ -1372,8 +1381,7 @@ extension ChatControllerImpl {
var alwaysShowGiftButton = false
var disallowedGifts: TelegramDisallowedGifts?
if let peer = peerView.peers[peerView.peerId] {
// GHOSTGRAM: Bypass copy protection if enabled in Misc settings
copyProtectionEnabled = MiscSettingsManager.shared.shouldBypassCopyProtection ? false : peer.isCopyProtectionEnabled
copyProtectionEnabled = peer.isCopyProtectionEnabled
if let cachedData = peerView.cachedData as? CachedUserData {
contactStatus = ChatContactStatus(canAddContact: !peerView.peerIsContact, peerStatusSettings: cachedData.peerStatusSettings, invitedBy: nil, managingBot: managingBot)
if case let .known(value) = cachedData.businessIntro {
@@ -1701,7 +1709,7 @@ extension ChatControllerImpl {
strongSelf.state.alwaysShowGiftButton = alwaysShowGiftButton
strongSelf.state.disallowedGifts = disallowedGifts
if let replyThreadId, let channel = renderedPeer?.peer as? TelegramChannel, channel.isForumOrMonoForum, strongSelf.nextChannelToReadDisposable == nil {
if let replyThreadId, let channel = renderedPeer?.peer as? TelegramChannel, channel.isForumOrMonoForum, strongSelf.nextChannelToReadDisposable == nil, !SGSimpleSettings.shared.disableScrollToNextTopic {
strongSelf.nextChannelToReadDisposable = (combineLatest(queue: .mainQueue(),
context.engine.peers.getNextUnreadForumTopic(peerId: channel.id, topicId: Int32(clamping: replyThreadId)),
ApplicationSpecificNotice.getNextChatSuggestionTip(accountManager: context.sharedContext.accountManager)
@@ -2112,7 +2120,8 @@ extension ChatControllerImpl {
if counterAndTimestamp.0 >= 3 {
maybeSuggestPremium = true
}
if (isPremium || maybeSuggestPremium || hasAutoTranslate) && !isHidden {
let sgTranslationAvailable = SGSimpleSettings.shared.translationBackendEnum != .default
if (isPremium || maybeSuggestPremium || hasAutoTranslate || sgTranslationAvailable) && !isHidden {
return chatTranslationState(context: context, peerId: peerId, threadId: chatLocation.threadId)
|> map { translationState -> ChatPresentationTranslationState? in
if let translationState, !translationState.fromLang.isEmpty && (translationState.fromLang != baseLanguageCode || translationState.isEnabled) {
@@ -2137,6 +2146,27 @@ extension ChatControllerImpl {
strongSelf.onUpdated?(previousState)
})
// MARK: Swiftgram
self.chatLanguagePredictionDisposable = (
chatTranslationState(context: context, peerId: peerId, threadId: chatLocation.threadId)
|> map { translationState -> ChatPresentationTranslationState? in
if let translationState, !translationState.fromLang.isEmpty {
return ChatPresentationTranslationState(isEnabled: translationState.isEnabled, fromLang: translationState.fromLang, toLang: translationState.toLang ?? baseLanguageCode)
} else {
return nil
}
}
|> distinctUntilChanged
|> deliverOnMainQueue).startStrict(next: { [weak self] translationState in
if let strongSelf = self, let translationState = translationState, strongSelf.state.predictedChatLanguage == nil {
let previousState = strongSelf.state
strongSelf.state.predictedChatLanguage = translationState.fromLang
strongSelf.onUpdated?(previousState)
}
})
}
let premiumGiftOptions: Signal<[CachedPremiumGiftOption], NoError> = .single([])
@@ -2400,6 +2430,8 @@ extension ChatControllerImpl {
self.cachedDataDisposable?.dispose()
self.premiumGiftSuggestionDisposable?.dispose()
self.translationStateDisposable?.dispose()
// MARK: Swiftgram
self.chatLanguagePredictionDisposable?.dispose()
self.inviteRequestsDisposable?.dispose()
}
}