no message

This commit is contained in:
overtake
2017-06-14 21:16:53 +03:00
parent 11eba885a4
commit 96daa84432
5 changed files with 48 additions and 29 deletions

View File

@@ -40,9 +40,33 @@ public struct ChannelParticipantAdminInfo: Coding, Equatable {
}
}
public struct ChannelParticipantBannedInfo: Coding, Equatable {
public let rights: TelegramChannelBannedRights
public let restrictedBy: PeerId
public init(rights: TelegramChannelBannedRights, restrictedBy: PeerId) {
self.rights = rights
self.restrictedBy = restrictedBy
}
public init(decoder: Decoder) {
self.rights = decoder.decodeObjectForKey("r", decoder: { TelegramChannelBannedRights(decoder: $0) }) as! TelegramChannelBannedRights
self.restrictedBy = PeerId(decoder.decodeInt64ForKey("p", orElse: 0))
}
public func encode(_ encoder: Encoder) {
encoder.encodeObject(self.rights, forKey: "r")
encoder.encodeInt64(self.restrictedBy.toInt64(), forKey: "p")
}
public static func ==(lhs: ChannelParticipantBannedInfo, rhs: ChannelParticipantBannedInfo) -> Bool {
return lhs.rights == rhs.rights && lhs.restrictedBy == rhs.restrictedBy
}
}
public enum ChannelParticipant: Coding, Equatable {
case creator(id: PeerId)
case member(id: PeerId, invitedAt: Int32, adminInfo: ChannelParticipantAdminInfo?, banInfo: TelegramChannelBannedRights?)
case member(id: PeerId, invitedAt: Int32, adminInfo: ChannelParticipantAdminInfo?, banInfo: ChannelParticipantBannedInfo?)
public var peerId: PeerId {
switch self {
@@ -85,7 +109,7 @@ public enum ChannelParticipant: Coding, Equatable {
public init(decoder: Decoder) {
switch decoder.decodeInt32ForKey("r", orElse: 0) {
case ChannelParticipantValue.member.rawValue:
self = .member(id: PeerId(decoder.decodeInt64ForKey("i", orElse: 0)), invitedAt: decoder.decodeInt32ForKey("t", orElse: 0), adminInfo: decoder.decodeObjectForKey("ai", decoder: { ChannelParticipantAdminInfo(decoder: $0) }) as? ChannelParticipantAdminInfo, banInfo: decoder.decodeObjectForKey("bi", decoder: { TelegramChannelBannedRights(decoder: $0) }) as? TelegramChannelBannedRights)
self = .member(id: PeerId(decoder.decodeInt64ForKey("i", orElse: 0)), invitedAt: decoder.decodeInt32ForKey("t", orElse: 0), adminInfo: decoder.decodeObjectForKey("ai", decoder: { ChannelParticipantAdminInfo(decoder: $0) }) as? ChannelParticipantAdminInfo, banInfo: decoder.decodeObjectForKey("bi", decoder: { ChannelParticipantBannedInfo(decoder: $0) }) as? ChannelParticipantBannedInfo)
case ChannelParticipantValue.creator.rawValue:
self = .creator(id: PeerId(decoder.decodeInt64ForKey("i", orElse: 0)))
default:
@@ -144,10 +168,12 @@ extension ChannelParticipant {
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: nil)
case let .channelParticipantCreator(userId):
self = .creator(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId))
case let .channelParticipantKicked(userId, _, date):
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: TelegramChannelBannedRights(flags: [.banReadMessages], untilDate: Int32.max))
case let .channelParticipantBanned(userId, _, date, bannedRights):
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: TelegramChannelBannedRights(apiBannedRights: bannedRights))
case let .channelParticipantKicked(userId, restrictedBy, date):
let banInfo = ChannelParticipantBannedInfo(rights: TelegramChannelBannedRights(flags: [.banReadMessages], untilDate: Int32.max), restrictedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: restrictedBy))
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: banInfo)
case let .channelParticipantBanned(userId, restrictedBy, date, bannedRights):
let banInfo = ChannelParticipantBannedInfo(rights: TelegramChannelBannedRights(apiBannedRights: bannedRights), restrictedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: restrictedBy))
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: banInfo)
case let .channelParticipantAdmin(flags, userId, _, promotedBy, date, adminRights):
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChannelAdminRights(apiAdminRights: adminRights), promotedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: promotedBy), canBeEditedByAccountPeer: (flags & (1 << 0)) != 0), banInfo: nil)
case let .channelParticipantSelf(userId, _, date):

View File

@@ -20,18 +20,18 @@ public func channelAdmins(account: Account, peerId: PeerId) -> Signal<[RenderedC
var items: [RenderedChannelParticipant] = []
var peers: [PeerId: Peer] = [:]
var status:[PeerId: PeerPresence] = [:]
var presences:[PeerId: PeerPresence] = [:]
for user in users {
let peer = TelegramUser(user: user)
peers[peer.id] = peer
if let presence = TelegramUserPresence(apiUser: user) {
status[peer.id] = presence
presences[peer.id] = presence
}
}
for participant in CachedChannelParticipants(apiParticipants: participants).participants {
if let peer = peers[participant.peerId] {
items.append(RenderedChannelParticipant(participant: participant, peer: peer, peers: peers, presence: status[peer.id]))
items.append(RenderedChannelParticipant(participant: participant, peer: peer, peers: peers, presences: presences))
}
}

View File

@@ -31,18 +31,18 @@ private func fetchChannelBlacklist(account: Account, peerId: PeerId, filter: Cha
switch result {
case let .channelParticipants(_, participants, users):
var peers: [PeerId: Peer] = [:]
var status:[PeerId: PeerPresence] = [:]
var presences:[PeerId: PeerPresence] = [:]
for user in users {
let peer = TelegramUser(user: user)
peers[peer.id] = peer
if let presence = TelegramUserPresence(apiUser: user) {
status[peer.id] = presence
presences[peer.id] = presence
}
}
for participant in CachedChannelParticipants(apiParticipants: participants).participants {
if let peer = peers[participant.peerId] {
items.append(RenderedChannelParticipant(participant: participant, peer: peer, peers: peers, presence: status[peer.id]))
items.append(RenderedChannelParticipant(participant: participant, peer: peer, peers: peers, presences: presences))
}
}
@@ -90,10 +90,10 @@ public struct ChannelBlacklist {
var updatedBanned = updated.banned
if case .member(_, _, _, let maybeBanInfo) = participant.participant, let banInfo = maybeBanInfo {
if banInfo.flags.contains(.banReadMessages) {
if banInfo.rights.flags.contains(.banReadMessages) {
updatedBanned.insert(participant, at: 0)
} else {
if !banInfo.flags.isEmpty {
if !banInfo.rights.flags.isEmpty {
updatedRestricted.insert(participant, at: 0)
}
}
@@ -147,9 +147,9 @@ public func updateChannelMemberBannedRights(account: Account, peerId: PeerId, me
break
case let .member(_, _, _, banInfo):
if let banInfo = banInfo {
if banInfo.flags.contains(.banReadMessages) {
if banInfo.rights.flags.contains(.banReadMessages) {
wasKicked = true
} else if !banInfo.flags.isEmpty {
} else if !banInfo.rights.flags.isEmpty {
wasBanned = true
}
}

View File

@@ -31,18 +31,18 @@ public func channelMembers(account: Account, peerId: PeerId, filter: ChannelMemb
switch result {
case let .channelParticipants(_, participants, users):
var peers: [PeerId: Peer] = [:]
var status:[PeerId: PeerPresence] = [:]
var presences:[PeerId: PeerPresence] = [:]
for user in users {
let peer = TelegramUser(user: user)
peers[peer.id] = peer
if let presence = TelegramUserPresence(apiUser: user) {
status[peer.id] = presence
presences[peer.id] = presence
}
}
for participant in CachedChannelParticipants(apiParticipants: participants).participants {
if let peer = peers[participant.peerId] {
items.append(RenderedChannelParticipant(participant: participant, peer: peer, peers: peers, presence: status[peer.id]))
items.append(RenderedChannelParticipant(participant: participant, peer: peer, peers: peers, presences: presences))
}
}

View File

@@ -13,22 +13,15 @@ public struct RenderedChannelParticipant: Equatable {
public let participant: ChannelParticipant
public let peer: Peer
public let peers: [PeerId: Peer]
public let presence:PeerPresence?
public init(participant: ChannelParticipant, peer: Peer, peers: [PeerId: Peer] = [:], presence: PeerPresence? = nil) {
public let presences:[PeerId: PeerPresence]
public init(participant: ChannelParticipant, peer: Peer, peers: [PeerId: Peer] = [:], presences:[PeerId : PeerPresence] = [:]) {
self.participant = participant
self.peer = peer
self.peers = peers
self.presence = presence
self.presences = presences
}
public static func ==(lhs: RenderedChannelParticipant, rhs: RenderedChannelParticipant) -> Bool {
if let lhsPresence = lhs.presence, let rhsPresence = rhs.presence {
if !lhsPresence.isEqual(to: rhsPresence) {
return false
}
} else if(lhs.presence != nil) != (rhs.presence != nil) {
return false
}
return lhs.participant == rhs.participant && lhs.peer.isEqual(rhs.peer)
}
}