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

207 lines
8.4 KiB
Swift

import Postbox
public enum TelegramGroupRole: Equatable, PostboxCoding {
case creator(rank: String?)
case admin(TelegramChatAdminRights, rank: String?)
case member
public init(decoder: PostboxDecoder) {
switch decoder.decodeInt32ForKey("_v", orElse: 0) {
case 0:
self = .creator(rank: decoder.decodeOptionalStringForKey("rank"))
case 1:
self = .admin(decoder.decodeObjectForKey("r", decoder: { TelegramChatAdminRights(decoder: $0) }) as! TelegramChatAdminRights, rank: decoder.decodeOptionalStringForKey("rank"))
case 2:
self = .member
default:
assertionFailure()
self = .member
}
}
public func encode(_ encoder: PostboxEncoder) {
switch self {
case let .creator(rank):
encoder.encodeInt32(0, forKey: "_v")
if let rank = rank {
encoder.encodeString(rank, forKey: "rank")
} else {
encoder.encodeNil(forKey: "rank")
}
case let .admin(rights, rank):
encoder.encodeInt32(1, forKey: "_v")
encoder.encodeObject(rights, forKey: "r")
if let rank = rank {
encoder.encodeString(rank, forKey: "rank")
} else {
encoder.encodeNil(forKey: "rank")
}
case .member:
encoder.encodeInt32(2, forKey: "_v")
}
}
}
public enum TelegramGroupMembership: Int32 {
case Member
case Left
case Removed
}
public struct TelegramGroupFlags: OptionSet {
public var rawValue: Int32
public init() {
self.rawValue = 0
}
public init(rawValue: Int32) {
self.rawValue = rawValue
}
public static let deactivated = TelegramGroupFlags(rawValue: 1 << 1)
}
public struct TelegramGroupToChannelMigrationReference: Equatable {
public let peerId: PeerId
public let accessHash: Int64
public init(peerId: PeerId, accessHash: Int64) {
self.peerId = peerId
self.accessHash = accessHash
}
}
public final class TelegramGroup: Peer {
public let id: PeerId
public let title: String
public let photo: [TelegramMediaImageRepresentation]
public let participantCount: Int
public let role: TelegramGroupRole
public let membership: TelegramGroupMembership
public let flags: TelegramGroupFlags
public let defaultBannedRights: TelegramChatBannedRights?
public let migrationReference: TelegramGroupToChannelMigrationReference?
public let creationDate: Int32
public let version: Int
public var indexName: PeerIndexNameRepresentation {
return .title(title: self.title, addressName: nil)
}
public let associatedPeerId: PeerId? = nil
public let notificationSettingsPeerId: PeerId? = nil
public init(id: PeerId, title: String, photo: [TelegramMediaImageRepresentation], participantCount: Int, role: TelegramGroupRole, membership: TelegramGroupMembership, flags: TelegramGroupFlags, defaultBannedRights: TelegramChatBannedRights?, migrationReference: TelegramGroupToChannelMigrationReference?, creationDate: Int32, version: Int) {
self.id = id
self.title = title
self.photo = photo
self.participantCount = participantCount
self.role = role
self.membership = membership
self.flags = flags
self.defaultBannedRights = defaultBannedRights
self.migrationReference = migrationReference
self.creationDate = creationDate
self.version = version
}
public init(decoder: PostboxDecoder) {
self.id = PeerId(decoder.decodeInt64ForKey("i", orElse: 0))
self.title = decoder.decodeStringForKey("t", orElse: "")
self.photo = decoder.decodeObjectArrayForKey("ph")
self.participantCount = Int(decoder.decodeInt32ForKey("pc", orElse: 0))
if let role = decoder.decodeObjectForKey("rv", decoder: { TelegramGroupRole(decoder: $0) }) as? TelegramGroupRole {
self.role = role
} else if let roleValue = decoder.decodeOptionalInt32ForKey("r"), roleValue == 0 {
self.role = .creator(rank: nil)
} else {
self.role = .member
}
self.membership = TelegramGroupMembership(rawValue: decoder.decodeInt32ForKey("m", orElse: 0))!
self.flags = TelegramGroupFlags(rawValue: decoder.decodeInt32ForKey("f", orElse: 0))
self.defaultBannedRights = decoder.decodeObjectForKey("dbr", decoder: { TelegramChatBannedRights(decoder: $0) }) as? TelegramChatBannedRights
let migrationPeerId: Int64? = decoder.decodeOptionalInt64ForKey("mr.i")
let migrationAccessHash: Int64? = decoder.decodeOptionalInt64ForKey("mr.a")
if let migrationPeerId = migrationPeerId, let migrationAccessHash = migrationAccessHash {
self.migrationReference = TelegramGroupToChannelMigrationReference(peerId: PeerId(migrationPeerId), accessHash: migrationAccessHash)
} else {
self.migrationReference = nil
}
self.creationDate = decoder.decodeInt32ForKey("d", orElse: 0)
self.version = Int(decoder.decodeInt32ForKey("v", orElse: 0))
}
public func encode(_ encoder: PostboxEncoder) {
encoder.encodeInt64(self.id.toInt64(), forKey: "i")
encoder.encodeString(self.title, forKey: "t")
encoder.encodeObjectArray(self.photo, forKey: "ph")
encoder.encodeInt32(Int32(self.participantCount), forKey: "pc")
encoder.encodeObject(self.role, forKey: "rv")
encoder.encodeInt32(self.membership.rawValue, forKey: "m")
if let defaultBannedRights = self.defaultBannedRights {
encoder.encodeObject(defaultBannedRights, forKey: "dbr")
} else {
encoder.encodeNil(forKey: "dbr")
}
if let migrationReference = self.migrationReference {
encoder.encodeInt64(migrationReference.peerId.toInt64(), forKey: "mr.i")
encoder.encodeInt64(migrationReference.accessHash, forKey: "mr.a")
} else {
encoder.encodeNil(forKey: "mr.i")
encoder.encodeNil(forKey: "mr.a")
}
encoder.encodeInt32(self.creationDate, forKey: "d")
encoder.encodeInt32(Int32(self.version), forKey: "v")
}
public func isEqual(_ other: Peer) -> Bool {
if let other = other as? TelegramGroup {
if self.id != other.id {
return false
}
if self.title != other.title {
return false
}
if self.photo != other.photo {
return false
}
if self.membership != other.membership {
return false
}
if self.version != other.version {
return false
}
if self.participantCount != other.participantCount {
return false
}
if self.role != other.role {
return false
}
if self.defaultBannedRights != other.defaultBannedRights {
return false
}
if self.migrationReference != other.migrationReference {
return false
}
if self.creationDate != other.creationDate {
return false
}
if self.flags != other.flags {
return false
}
return true
} else {
return false
}
}
public func updateFlags(flags: TelegramGroupFlags, version: Int) -> TelegramGroup {
return TelegramGroup(id: self.id, title: self.title, photo: self.photo, participantCount: self.participantCount, role: self.role, membership: self.membership, flags: flags, defaultBannedRights: self.defaultBannedRights, migrationReference: self.migrationReference, creationDate: self.creationDate, version: version)
}
public func updateDefaultBannedRights(_ defaultBannedRights: TelegramChatBannedRights?, version: Int) -> TelegramGroup {
return TelegramGroup(id: self.id, title: self.title, photo: self.photo, participantCount: self.participantCount, role: self.role, membership: self.membership, flags: self.flags, defaultBannedRights: defaultBannedRights, migrationReference: self.migrationReference, creationDate: self.creationDate, version: version)
}
}