Swiftgram/submodules/TelegramCore/TelegramCore/CachedGroupParticipants.swift
2019-06-16 02:08:39 +01:00

138 lines
5.3 KiB
Swift

import Foundation
#if os(macOS)
import PostboxMac
#else
import Postbox
#endif
import TelegramApi
public enum GroupParticipant: PostboxCoding, Equatable {
case member(id: PeerId, invitedBy: PeerId, invitedAt: Int32)
case creator(id: PeerId)
case admin(id: PeerId, invitedBy: PeerId, invitedAt: Int32)
public var peerId: PeerId {
switch self {
case let .member(id, _, _):
return id
case let .creator(id):
return id
case let .admin(id, _, _):
return id
}
}
public init(decoder: PostboxDecoder) {
switch decoder.decodeInt32ForKey("v", orElse: 0) {
case 0:
self = .member(id: PeerId(decoder.decodeInt64ForKey("i", orElse: 0)), invitedBy: PeerId(decoder.decodeInt64ForKey("b", orElse: 0)), invitedAt: decoder.decodeInt32ForKey("t", orElse: 0))
case 1:
self = .creator(id: PeerId(decoder.decodeInt64ForKey("i", orElse: 0)))
case 2:
self = .admin(id: PeerId(decoder.decodeInt64ForKey("i", orElse: 0)), invitedBy: PeerId(decoder.decodeInt64ForKey("b", orElse: 0)), invitedAt: decoder.decodeInt32ForKey("t", orElse: 0))
default:
self = .member(id: PeerId(decoder.decodeInt64ForKey("i", orElse: 0)), invitedBy: PeerId(decoder.decodeInt64ForKey("b", orElse: 0)), invitedAt: decoder.decodeInt32ForKey("t", orElse: 0))
}
}
public func encode(_ encoder: PostboxEncoder) {
switch self {
case let .member(id, invitedBy, invitedAt):
encoder.encodeInt32(0, forKey: "v")
encoder.encodeInt64(id.toInt64(), forKey: "i")
encoder.encodeInt64(invitedBy.toInt64(), forKey: "b")
encoder.encodeInt32(invitedAt, forKey: "t")
case let .creator(id):
encoder.encodeInt32(1, forKey: "v")
encoder.encodeInt64(id.toInt64(), forKey: "i")
case let .admin(id, invitedBy, invitedAt):
encoder.encodeInt32(2, forKey: "v")
encoder.encodeInt64(id.toInt64(), forKey: "i")
encoder.encodeInt64(invitedBy.toInt64(), forKey: "b")
encoder.encodeInt32(invitedAt, forKey: "t")
}
}
public static func ==(lhs: GroupParticipant, rhs: GroupParticipant) -> Bool {
switch lhs {
case let .admin(lhsId, lhIinvitedBy, lhsInvitedAt):
if case .admin(lhsId, lhIinvitedBy, lhsInvitedAt) = rhs {
return true
} else {
return false
}
case let .creator(lhsId):
if case .creator(lhsId) = rhs {
return true
} else {
return false
}
case let .member(lhsId, lhIinvitedBy, lhsInvitedAt):
if case .member(lhsId, lhIinvitedBy, lhsInvitedAt) = rhs {
return true
} else {
return false
}
}
}
public var invitedBy: PeerId {
switch self {
case let .admin(_, invitedBy, _):
return invitedBy
case let .member(_, invitedBy, _):
return invitedBy
case let .creator(id):
return id
}
}
}
public final class CachedGroupParticipants: PostboxCoding, Equatable {
public let participants: [GroupParticipant]
let version: Int32
init(participants: [GroupParticipant], version: Int32) {
self.participants = participants
self.version = version
}
public init(decoder: PostboxDecoder) {
self.participants = decoder.decodeObjectArrayWithDecoderForKey("p")
self.version = decoder.decodeInt32ForKey("v", orElse: 0)
}
public func encode(_ encoder: PostboxEncoder) {
encoder.encodeObjectArray(self.participants, forKey: "p")
encoder.encodeInt32(self.version, forKey: "v")
}
public static func ==(lhs: CachedGroupParticipants, rhs: CachedGroupParticipants) -> Bool {
return lhs.version == rhs.version && lhs.participants == rhs.participants
}
}
extension GroupParticipant {
init(apiParticipant: Api.ChatParticipant) {
switch apiParticipant {
case let .chatParticipantCreator(userId):
self = .creator(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId))
case let .chatParticipantAdmin(userId, inviterId, date):
self = .admin(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: inviterId), invitedAt: date)
case let .chatParticipant(userId, inviterId, date):
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: inviterId), invitedAt: date)
}
}
}
extension CachedGroupParticipants {
convenience init?(apiParticipants: Api.ChatParticipants) {
switch apiParticipants {
case let .chatParticipants(_, participants, version):
self.init(participants: participants.map { GroupParticipant(apiParticipant: $0) }, version: version)
case .chatParticipantsForbidden:
return nil
}
}
}