Swiftgram/submodules/SyncCore/Sources/TelegramUserPresence.swift
2019-10-21 16:58:00 +04:00

117 lines
3.6 KiB
Swift

import Postbox
public enum UserPresenceStatus: Comparable, PostboxCoding {
case none
case present(until: Int32)
case recently
case lastWeek
case lastMonth
public static func <(lhs: UserPresenceStatus, rhs: UserPresenceStatus) -> Bool {
switch lhs {
case .none:
switch rhs {
case .none:
return false
case .lastMonth, .lastWeek, .recently, .present:
return true
}
case let .present(until):
switch rhs {
case .none:
return false
case let .present(rhsUntil):
return until < rhsUntil
case .lastWeek, .lastMonth, .recently:
return false
}
case .recently:
switch rhs {
case .none, .lastWeek, .lastMonth, .recently:
return false
case .present:
return true
}
case .lastWeek:
switch rhs {
case .none, .lastMonth, .lastWeek:
return false
case .present, .recently:
return true
}
case .lastMonth:
switch rhs {
case .none, .lastMonth:
return false
case .present, .recently, lastWeek:
return true
}
}
}
public init(decoder: PostboxDecoder) {
switch decoder.decodeInt32ForKey("v", orElse: 0) {
case 0:
self = .none
case 1:
self = .present(until: decoder.decodeInt32ForKey("t", orElse: 0))
case 2:
self = .recently
case 3:
self = .lastWeek
case 4:
self = .lastMonth
default:
self = .none
}
}
public func encode(_ encoder: PostboxEncoder) {
switch self {
case .none:
encoder.encodeInt32(0, forKey: "v")
case let .present(timestamp):
encoder.encodeInt32(1, forKey: "v")
encoder.encodeInt32(timestamp, forKey: "t")
case .recently:
encoder.encodeInt32(2, forKey: "v")
case .lastWeek:
encoder.encodeInt32(3, forKey: "v")
case .lastMonth:
encoder.encodeInt32(4, forKey: "v")
}
}
}
public final class TelegramUserPresence: PeerPresence, Equatable {
public let status: UserPresenceStatus
public let lastActivity: Int32
public init(status: UserPresenceStatus, lastActivity: Int32) {
self.status = status
self.lastActivity = lastActivity
}
public init(decoder: PostboxDecoder) {
self.status = UserPresenceStatus(decoder: decoder)
self.lastActivity = decoder.decodeInt32ForKey("la", orElse: 0)
}
public func encode(_ encoder: PostboxEncoder) {
self.status.encode(encoder)
encoder.encodeInt32(self.lastActivity, forKey: "la")
}
public static func ==(lhs: TelegramUserPresence, rhs: TelegramUserPresence) -> Bool {
return lhs.status == rhs.status && lhs.lastActivity == rhs.lastActivity
}
public func isEqual(to: PeerPresence) -> Bool {
if let to = to as? TelegramUserPresence {
return self == to
} else {
return false
}
}
}