Swiftgram/TelegramCore/TelegramChannel.swift
2016-09-05 23:20:51 +03:00

270 lines
8.5 KiB
Swift

import Foundation
#if os(macOS)
import PostboxMac
#else
import Postbox
#endif
public enum TelegramChannelParticipationStatus {
case member
case left
case kicked
fileprivate var rawValue: Int32 {
switch self {
case .member:
return 0
case .left:
return 1
case .kicked:
return 2
}
}
fileprivate init(rawValue: Int32) {
switch rawValue {
case 0:
self = .member
case 1:
self = .left
case 2:
self = .kicked
default:
self = .left
}
}
}
public enum TelegramChannelRole {
case member
case creator
case editor
case moderator
fileprivate var rawValue: Int32 {
switch self {
case .member:
return 0
case .creator:
return 1
case .editor:
return 2
case .moderator:
return 3
}
}
fileprivate init(rawValue: Int32) {
switch rawValue {
case 0:
self = .member
case 1:
self = .creator
case 2:
self = .editor
case 3:
self = .moderator
default:
self = .member
}
}
}
public struct TelegramChannelBroadcastFlags: OptionSet {
public var rawValue: Int32
public init() {
self.rawValue = 0
}
public init(rawValue: Int32) {
self.rawValue = rawValue
}
public static let messagesShouldHaveSignatures = TelegramChannelBroadcastFlags(rawValue: 1 << 0)
}
public struct TelegramChannelBroadcastInfo: Equatable {
public let flags: TelegramChannelBroadcastFlags
public static func ==(lhs: TelegramChannelBroadcastInfo, rhs: TelegramChannelBroadcastInfo) -> Bool {
return lhs.flags == rhs.flags
}
}
public struct TelegramChannelGroupFlags: OptionSet {
public var rawValue: Int32
public init() {
self.rawValue = 0
}
public init(rawValue: Int32) {
self.rawValue = rawValue
}
public static let everyMemberCanInviteMembers = TelegramChannelGroupFlags(rawValue: 1 << 0)
}
public struct TelegramChannelGroupInfo: Equatable {
public let flags: TelegramChannelGroupFlags
public static func ==(lhs: TelegramChannelGroupInfo, rhs: TelegramChannelGroupInfo) -> Bool {
return lhs.flags == rhs.flags
}
}
public enum TelegramChannelInfo: Equatable {
case broadcast(TelegramChannelBroadcastInfo)
case group(TelegramChannelGroupInfo)
public static func ==(lhs: TelegramChannelInfo, rhs: TelegramChannelInfo) -> Bool {
switch lhs {
case let .broadcast(lhsInfo):
switch rhs {
case .broadcast(lhsInfo):
return true
default:
return false
}
case let .group(lhsInfo):
switch rhs {
case .group(lhsInfo):
return true
default:
return false
}
}
}
fileprivate func encode(encoder: Encoder) {
switch self {
case let .broadcast(info):
encoder.encodeInt32(0, forKey: "i.t")
encoder.encodeInt32(info.flags.rawValue, forKey: "i.f")
case let .group(info):
encoder.encodeInt32(1, forKey: "i.t")
encoder.encodeInt32(info.flags.rawValue, forKey: "i.f")
}
}
fileprivate static func decode(decoder: Decoder) -> TelegramChannelInfo {
let type: Int32 = decoder.decodeInt32ForKey("i.t")
if type == 0 {
return .broadcast(TelegramChannelBroadcastInfo(flags: TelegramChannelBroadcastFlags(rawValue: decoder.decodeInt32ForKey("i.f"))))
} else {
return .group(TelegramChannelGroupInfo(flags: TelegramChannelGroupFlags(rawValue: decoder.decodeInt32ForKey("i.f"))))
}
}
}
public struct TelegramChannelFlags: OptionSet {
public var rawValue: Int32
public init() {
self.rawValue = 0
}
public init(rawValue: Int32) {
self.rawValue = rawValue
}
public static let verified = TelegramChannelFlags(rawValue: 1 << 0)
}
public final class TelegramChannel: Peer {
public let id: PeerId
public let accessHash: Int64?
public let title: String
public let username: String?
public let photo: [TelegramMediaImageRepresentation]
public let creationDate: Int32
public let version: Int32
public let participationStatus: TelegramChannelParticipationStatus
public let role: TelegramChannelRole
public let info: TelegramChannelInfo
public let flags: TelegramChannelFlags
public let restrictionInfo: PeerAccessRestrictionInfo?
public var indexName: PeerIndexNameRepresentation {
return .title(self.title)
}
public init(id: PeerId, accessHash: Int64?, title: String, username: String?, photo: [TelegramMediaImageRepresentation], creationDate: Int32, version: Int32, participationStatus: TelegramChannelParticipationStatus, role: TelegramChannelRole, info: TelegramChannelInfo, flags: TelegramChannelFlags, restrictionInfo: PeerAccessRestrictionInfo?) {
self.id = id
self.accessHash = accessHash
self.title = title
self.username = username
self.photo = photo
self.creationDate = creationDate
self.version = version
self.participationStatus = participationStatus
self.role = role
self.info = info
self.flags = flags
self.restrictionInfo = restrictionInfo
}
public init(decoder: Decoder) {
self.id = PeerId(decoder.decodeInt64ForKey("i"))
self.accessHash = decoder.decodeInt64ForKey("ah")
self.title = decoder.decodeStringForKey("t")
self.username = decoder.decodeStringForKey("un")
self.photo = decoder.decodeObjectArrayForKey("ph")
self.creationDate = decoder.decodeInt32ForKey("d")
self.version = decoder.decodeInt32ForKey("v")
self.participationStatus = TelegramChannelParticipationStatus(rawValue: decoder.decodeInt32ForKey("ps"))
self.role = TelegramChannelRole(rawValue: decoder.decodeInt32ForKey("ro"))
self.info = TelegramChannelInfo.decode(decoder: decoder)
self.flags = TelegramChannelFlags(rawValue: decoder.decodeInt32ForKey("fl"))
self.restrictionInfo = decoder.decodeObjectForKey("ri") as? PeerAccessRestrictionInfo
}
public func encode(_ encoder: Encoder) {
encoder.encodeInt64(self.id.toInt64(), forKey: "i")
if let accessHash = self.accessHash {
encoder.encodeInt64(accessHash, forKey: "ah")
} else {
encoder.encodeNil(forKey: "ah")
}
encoder.encodeString(self.title, forKey: "t")
if let username = self.username {
encoder.encodeString(username, forKey: "un")
} else {
encoder.encodeNil(forKey: "un")
}
encoder.encodeObjectArray(self.photo, forKey: "ph")
encoder.encodeInt32(self.creationDate, forKey: "d")
encoder.encodeInt32(self.version, forKey: "v")
encoder.encodeInt32(self.participationStatus.rawValue, forKey: "ps")
encoder.encodeInt32(self.role.rawValue, forKey: "ro")
self.info.encode(encoder: encoder)
encoder.encodeInt32(self.flags.rawValue, forKey: "fl")
if let restrictionInfo = self.restrictionInfo {
encoder.encodeObject(restrictionInfo, forKey: "ri")
} else {
encoder.encodeNil(forKey: "ri")
}
}
public func isEqual(_ other: Peer) -> Bool {
guard let other = other as? TelegramChannel else {
return false
}
if self.id != other.id || self.accessHash != other.accessHash || self.title != other.title || self.username != other.username || self.photo != other.photo {
return false
}
if self.creationDate != other.creationDate || self.version != other.version || self.participationStatus != other.participationStatus {
return false
}
if self.role != other.role || self.info != other.info || self.flags != other.flags || self.restrictionInfo != other.restrictionInfo {
return false
}
return true
}
}