2021-08-01 18:12:53 +02:00

217 lines
5.6 KiB
Swift

import Postbox
public enum EnginePeer: Equatable {
public typealias Id = PeerId
public struct Presence: Equatable {
public enum Status: Equatable {
case present(until: Int32)
case recently
case lastWeek
case lastMonth
case longTimeAgo
}
public var status: Status
public var lastActivity: Int32
public init(status: Status, lastActivity: Int32) {
self.status = status
self.lastActivity = lastActivity
}
}
case user(TelegramUser)
case legacyGroup(TelegramGroup)
case channel(TelegramChannel)
case secretChat(TelegramSecretChat)
public static func ==(lhs: EnginePeer, rhs: EnginePeer) -> Bool {
switch lhs {
case let .user(user):
if case .user(user) = rhs {
return true
} else {
return false
}
case let .legacyGroup(legacyGroup):
if case .legacyGroup(legacyGroup) = rhs {
return true
} else {
return false
}
case let .channel(channel):
if case .channel(channel) = rhs {
return true
} else {
return false
}
case let .secretChat(secretChat):
if case .secretChat(secretChat) = rhs {
return true
} else {
return false
}
}
}
}
public extension EnginePeer.Presence {
init(_ presence: PeerPresence) {
if let presence = presence as? TelegramUserPresence {
let mappedStatus: Status
switch presence.status {
case .none:
mappedStatus = .longTimeAgo
case let .present(until):
mappedStatus = .present(until: until)
case .recently:
mappedStatus = .recently
case .lastWeek:
mappedStatus = .lastWeek
case .lastMonth:
mappedStatus = .lastMonth
}
self.init(status: mappedStatus, lastActivity: presence.lastActivity)
} else {
preconditionFailure()
}
}
}
public extension EnginePeer {
var id: Id {
return self._asPeer().id
}
var addressName: String? {
return self._asPeer().addressName
}
var indexName: PeerIndexNameRepresentation {
return self._asPeer().indexName
}
var debugDisplayTitle: String {
return self._asPeer().debugDisplayTitle
}
func restrictionText(platform: String, contentSettings: ContentSettings) -> String? {
return self._asPeer().restrictionText(platform: platform, contentSettings: contentSettings)
}
var displayLetters: [String] {
return self._asPeer().displayLetters
}
var profileImageRepresentations: [TelegramMediaImageRepresentation] {
return self._asPeer().profileImageRepresentations
}
var smallProfileImage: TelegramMediaImageRepresentation? {
return self._asPeer().smallProfileImage
}
var largeProfileImage: TelegramMediaImageRepresentation? {
return self._asPeer().largeProfileImage
}
var isDeleted: Bool {
return self._asPeer().isDeleted
}
var isScam: Bool {
return self._asPeer().isScam
}
var isFake: Bool {
return self._asPeer().isFake
}
var isVerified: Bool {
return self._asPeer().isVerified
}
}
public extension EnginePeer {
init(_ peer: Peer) {
switch peer {
case let user as TelegramUser:
self = .user(user)
case let group as TelegramGroup:
self = .legacyGroup(group)
case let channel as TelegramChannel:
self = .channel(channel)
case let secretChat as TelegramSecretChat:
self = .secretChat(secretChat)
default:
preconditionFailure("Unknown peer type")
}
}
func _asPeer() -> Peer {
switch self {
case let .user(user):
return user
case let .legacyGroup(legacyGroup):
return legacyGroup
case let .channel(channel):
return channel
case let .secretChat(secretChat):
return secretChat
}
}
}
public final class EngineRenderedPeer {
public let peerId: EnginePeer.Id
public let peers: [EnginePeer.Id: EnginePeer]
public init(peerId: EnginePeer.Id, peers: [EnginePeer.Id: EnginePeer]) {
self.peerId = peerId
self.peers = peers
}
public init(peer: EnginePeer) {
self.peerId = peer.id
self.peers = [peer.id: peer]
}
public static func ==(lhs: EngineRenderedPeer, rhs: EngineRenderedPeer) -> Bool {
if lhs.peerId != rhs.peerId {
return false
}
if lhs.peers != rhs.peers {
return false
}
return true
}
public var peer: EnginePeer? {
return self.peers[self.peerId]
}
public var chatMainPeer: EnginePeer? {
if let peer = self.peers[self.peerId] {
if case let .secretChat(secretChat) = peer {
return self.peers[secretChat.regularPeerId]
} else {
return peer
}
} else {
return nil
}
}
}
public extension EngineRenderedPeer {
convenience init(_ renderedPeer: RenderedPeer) {
var mappedPeers: [EnginePeer.Id: EnginePeer] = [:]
for (id, peer) in renderedPeer.peers {
mappedPeers[id] = EnginePeer(peer)
}
self.init(peerId: renderedPeer.peerId, peers: mappedPeers)
}
}