Merge commit '7621e2f8dec938cf48181c8b10afc9b01f444e68' into beta

This commit is contained in:
Ilya Laktyushin
2025-12-06 02:17:48 +04:00
commit 8344b97e03
28070 changed files with 7995182 additions and 0 deletions
@@ -0,0 +1,19 @@
load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library")
swift_library(
name = "PeerPresenceStatusManager",
module_name = "PeerPresenceStatusManager",
srcs = glob([
"Sources/**/*.swift",
]),
copts = [
"-warnings-as-errors",
],
deps = [
"//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit",
"//submodules/TelegramCore:TelegramCore",
],
visibility = [
"//visibility:public",
],
)
@@ -0,0 +1,63 @@
import Foundation
import SwiftSignalKit
import TelegramCore
private func suggestedUserPresenceStringRefreshTimeout(_ presence: EnginePeer.Presence, relativeTo timestamp: Int32, isOnline: Bool?) -> Double {
switch presence.status {
case let .present(statusTimestamp):
if statusTimestamp >= timestamp {
return Double(statusTimestamp - timestamp)
} else {
if let isOnline = isOnline, isOnline {
return 1.0
} else {
let difference = timestamp - statusTimestamp
if difference < 30 {
return Double((30 - difference) + 1)
} else if difference < 60 * 60 {
return Double((difference % 60) + 1)
} else {
return Double.infinity
}
}
}
case .recently:
let activeUntil = presence.lastActivity + 30
if activeUntil >= timestamp {
return Double(activeUntil - timestamp + 1)
} else {
return Double.infinity
}
case .longTimeAgo, .lastWeek, .lastMonth:
return Double.infinity
}
}
public final class PeerPresenceStatusManager {
private let update: () -> Void
private var timer: SwiftSignalKit.Timer?
public init(update: @escaping () -> Void) {
self.update = update
}
deinit {
self.timer?.invalidate()
}
public func reset(presence: EnginePeer.Presence, isOnline: Bool? = nil) {
self.timer?.invalidate()
self.timer = nil
let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970
let timeout = suggestedUserPresenceStringRefreshTimeout(presence, relativeTo: Int32(timestamp), isOnline: isOnline)
if timeout.isFinite {
self.timer = SwiftSignalKit.Timer(timeout: timeout, repeat: false, completion: { [weak self] in
if let strongSelf = self {
strongSelf.update()
}
}, queue: Queue.mainQueue())
self.timer?.start()
}
}
}