From acaf6f359d320ee2dba66bfe054890f98220fe6f Mon Sep 17 00:00:00 2001 From: overtake Date: Tue, 13 Jun 2017 21:47:29 +0300 Subject: [PATCH] no message --- TelegramCore/ChannelAdminEventLogs.swift | 9 ++-- TelegramCore/ChannelAdmins.swift | 2 +- TelegramCore/ChannelBlacklist.swift | 64 +++++++++++++++++++++--- TelegramCore/ChannelMembers.swift | 2 +- TelegramCore/ChannelParticipants.swift | 11 ++-- 5 files changed, 71 insertions(+), 17 deletions(-) diff --git a/TelegramCore/ChannelAdminEventLogs.swift b/TelegramCore/ChannelAdminEventLogs.swift index 9db681ea89..1c943eeb80 100644 --- a/TelegramCore/ChannelAdminEventLogs.swift +++ b/TelegramCore/ChannelAdminEventLogs.swift @@ -69,7 +69,10 @@ public struct AdminLogEventsFlags : OptionSet { public static let editMessages = AdminLogEventsFlags(rawValue: 1 << 12) public static let deleteMessages = AdminLogEventsFlags(rawValue: 1 << 13) - public static var all:AdminLogEventsFlags { + public static var all:[AdminLogEventsFlags] { + return [.join, .leave, .invite, .ban, .unban, .kick, .unkick, .promote, .demote, .info, .settings, .pinnedMessages, .editMessages, .deleteMessages] + } + public static var flags:AdminLogEventsFlags { return [.join, .leave, .invite, .ban, .unban, .kick, .unkick, .promote, .demote, .info, .settings, .pinnedMessages, .editMessages, .deleteMessages] } } @@ -83,7 +86,7 @@ private func boolFromApiValue(_ value: Api.Bool) -> Bool { } } -public func channelAdminLogEvents(_ account:Account, peerId:PeerId, maxId:AdminLogEventId, minId:AdminLogEventId, limit:Int32 = 100, query:String = "", filter:AdminLogEventsFlags? = nil, admins:[PeerId]? = nil) -> Signal { +public func channelAdminLogEvents(_ account:Account, peerId:PeerId, maxId:AdminLogEventId, minId:AdminLogEventId, limit:Int32 = 100, query:String? = nil, filter:AdminLogEventsFlags? = nil, admins:[PeerId]? = nil) -> Signal { return account.postbox.modify { modifier -> (Peer?, [Peer]?) in return (modifier.getPeer(peerId), admins?.flatMap {modifier.getPeer($0)}) @@ -101,7 +104,7 @@ public func channelAdminLogEvents(_ account:Account, peerId:PeerId, maxId:AdminL if let _ = inputAdmins { flags += Int32(1 << 1) } - return account.network.request(Api.functions.channels.getAdminLog(flags: flags, channel: inputChannel, q: query, eventsFilter: eventsFilter, admins: inputAdmins, maxId: maxId, minId: minId, limit: limit)) |> map { result in + return account.network.request(Api.functions.channels.getAdminLog(flags: flags, channel: inputChannel, q: query ?? "", eventsFilter: eventsFilter, admins: inputAdmins, maxId: maxId, minId: minId, limit: limit)) |> map { result in switch result { case let .adminLogResults(apiEvents, apiChats, apiUsers): diff --git a/TelegramCore/ChannelAdmins.swift b/TelegramCore/ChannelAdmins.swift index 5331d00f84..fbc0cadee1 100644 --- a/TelegramCore/ChannelAdmins.swift +++ b/TelegramCore/ChannelAdmins.swift @@ -31,7 +31,7 @@ public func channelAdmins(account: Account, peerId: PeerId) -> Signal<[RenderedC for participant in CachedChannelParticipants(apiParticipants: participants).participants { if let peer = peers[participant.peerId] { - items.append(RenderedChannelParticipant(participant: participant, peer: peer, status: status[peer.id])) + items.append(RenderedChannelParticipant(participant: participant, peer: peer, presence: status[peer.id])) } } diff --git a/TelegramCore/ChannelBlacklist.swift b/TelegramCore/ChannelBlacklist.swift index 81123f751d..a263a29843 100644 --- a/TelegramCore/ChannelBlacklist.swift +++ b/TelegramCore/ChannelBlacklist.swift @@ -42,7 +42,7 @@ private func fetchChannelBlacklist(account: Account, peerId: PeerId, filter: Cha for participant in CachedChannelParticipants(apiParticipants: participants).participants { if let peer = peers[participant.peerId] { - items.append(RenderedChannelParticipant(participant: participant, peer: peer, status: status[peer.id])) + items.append(RenderedChannelParticipant(participant: participant, peer: peer, presence: status[peer.id])) } } @@ -55,24 +55,74 @@ private func fetchChannelBlacklist(account: Account, peerId: PeerId, filter: Cha } |> switchToLatest } -public func channelBlacklistParticipants(account: Account, peerId: PeerId) -> Signal<[RenderedChannelParticipant], NoError> { +public struct ChannelBlacklist { + public let banned:[RenderedChannelParticipant] + public let restricted:[RenderedChannelParticipant] + public init(banned:[RenderedChannelParticipant], restricted: [RenderedChannelParticipant]) { + self.banned = banned + self.restricted = restricted + } + public var isEmpty: Bool { + return banned.isEmpty && restricted.isEmpty + } + public func withRemovedPeerId(_ memberId:PeerId) -> ChannelBlacklist { + var updatedRestricted = restricted + var updatedBanned = banned + + for i in 0 ..< updatedBanned.count { + if updatedBanned[i].peer.id == memberId { + updatedBanned.remove(at: i) + break + } + } + for i in 0 ..< updatedRestricted.count { + if updatedRestricted[i].peer.id == memberId { + updatedRestricted.remove(at: i) + break + } + } + return ChannelBlacklist(banned: updatedBanned, restricted: updatedRestricted) + } + + public func withRemovedParticipant(_ participant:RenderedChannelParticipant) -> ChannelBlacklist { + let updated = self.withRemovedPeerId(participant.participant.peerId) + var updatedRestricted = updated.restricted + var updatedBanned = updated.banned + + if case .member(_, _, _, let maybeBanInfo) = participant.participant, let banInfo = maybeBanInfo { + if banInfo.flags.contains(.banReadMessages) { + updatedBanned.insert(participant, at: 0) + } else { + if !banInfo.flags.isEmpty { + updatedRestricted.insert(participant, at: 0) + } + } + } + + + return ChannelBlacklist(banned: updatedBanned, restricted: updatedRestricted) + } +} + +public func channelBlacklistParticipants(account: Account, peerId: PeerId) -> Signal { return combineLatest(fetchChannelBlacklist(account: account, peerId: peerId, filter: .restricted), fetchChannelBlacklist(account: account, peerId: peerId, filter: .banned)) - |> map { restricted, banned -> [RenderedChannelParticipant] in - var result: [RenderedChannelParticipant] = [] + |> map { restricted, banned in + var r: [RenderedChannelParticipant] = [] + var b: [RenderedChannelParticipant] = [] var peerIds = Set() for participant in restricted { if !peerIds.contains(participant.peer.id) { peerIds.insert(participant.peer.id) - result.append(participant) + r.append(participant) } } for participant in banned { if !peerIds.contains(participant.peer.id) { peerIds.insert(participant.peer.id) - result.append(participant) + b.append(participant) } } - return result + return ChannelBlacklist(banned: b, restricted: r) } } diff --git a/TelegramCore/ChannelMembers.swift b/TelegramCore/ChannelMembers.swift index 95df854c6a..bf4bdd33a5 100644 --- a/TelegramCore/ChannelMembers.swift +++ b/TelegramCore/ChannelMembers.swift @@ -42,7 +42,7 @@ public func channelMembers(account: Account, peerId: PeerId, filter: ChannelMemb for participant in CachedChannelParticipants(apiParticipants: participants).participants { if let peer = peers[participant.peerId] { - items.append(RenderedChannelParticipant(participant: participant, peer: peer, status: status[peer.id])) + items.append(RenderedChannelParticipant(participant: participant, peer: peer, presence: status[peer.id])) } } diff --git a/TelegramCore/ChannelParticipants.swift b/TelegramCore/ChannelParticipants.swift index 6375164b6a..1be9eb8143 100644 --- a/TelegramCore/ChannelParticipants.swift +++ b/TelegramCore/ChannelParticipants.swift @@ -12,23 +12,24 @@ import Foundation public struct RenderedChannelParticipant: Equatable { public let participant: ChannelParticipant public let peer: Peer - public let status: PeerPresence? - public init(participant: ChannelParticipant, peer: Peer, status: PeerPresence? = nil) { + public let presence: PeerPresence? + public init(participant: ChannelParticipant, peer: Peer, presence: PeerPresence? = nil) { self.participant = participant self.peer = peer - self.status = status + self.presence = presence } public static func ==(lhs: RenderedChannelParticipant, rhs: RenderedChannelParticipant) -> Bool { - if let lhsStatus = lhs.status, let rhsStatus = rhs.status { + if let lhsStatus = lhs.presence, let rhsStatus = rhs.presence { if !lhsStatus.isEqual(to: rhsStatus) { return false } - } else if (lhs.status != nil) != (rhs.status != nil) { + } else if (lhs.presence != nil) != (rhs.presence != nil) { return false } return lhs.participant == rhs.participant && lhs.peer.isEqual(rhs.peer) } + } func updateChannelParticipantsSummary(account: Account, peerId: PeerId) -> Signal {