mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
64 lines
2.1 KiB
Swift
64 lines
2.1 KiB
Swift
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, .hidden:
|
|
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()
|
|
}
|
|
}
|
|
}
|