no message

This commit is contained in:
overtake 2017-06-13 21:47:29 +03:00
parent e9093ccf99
commit acaf6f359d
5 changed files with 71 additions and 17 deletions

View File

@ -69,7 +69,10 @@ public struct AdminLogEventsFlags : OptionSet {
public static let editMessages = AdminLogEventsFlags(rawValue: 1 << 12) public static let editMessages = AdminLogEventsFlags(rawValue: 1 << 12)
public static let deleteMessages = AdminLogEventsFlags(rawValue: 1 << 13) 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] 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<AdminLogEventsResult, ChannelAdminLogEventError> { public func channelAdminLogEvents(_ account:Account, peerId:PeerId, maxId:AdminLogEventId, minId:AdminLogEventId, limit:Int32 = 100, query:String? = nil, filter:AdminLogEventsFlags? = nil, admins:[PeerId]? = nil) -> Signal<AdminLogEventsResult, ChannelAdminLogEventError> {
return account.postbox.modify { modifier -> (Peer?, [Peer]?) in return account.postbox.modify { modifier -> (Peer?, [Peer]?) in
return (modifier.getPeer(peerId), admins?.flatMap {modifier.getPeer($0)}) 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 { if let _ = inputAdmins {
flags += Int32(1 << 1) 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 { switch result {
case let .adminLogResults(apiEvents, apiChats, apiUsers): case let .adminLogResults(apiEvents, apiChats, apiUsers):

View File

@ -31,7 +31,7 @@ public func channelAdmins(account: Account, peerId: PeerId) -> Signal<[RenderedC
for participant in CachedChannelParticipants(apiParticipants: participants).participants { for participant in CachedChannelParticipants(apiParticipants: participants).participants {
if let peer = peers[participant.peerId] { 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]))
} }
} }

View File

@ -42,7 +42,7 @@ private func fetchChannelBlacklist(account: Account, peerId: PeerId, filter: Cha
for participant in CachedChannelParticipants(apiParticipants: participants).participants { for participant in CachedChannelParticipants(apiParticipants: participants).participants {
if let peer = peers[participant.peerId] { 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 } |> 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<ChannelBlacklist, NoError> {
return combineLatest(fetchChannelBlacklist(account: account, peerId: peerId, filter: .restricted), fetchChannelBlacklist(account: account, peerId: peerId, filter: .banned)) return combineLatest(fetchChannelBlacklist(account: account, peerId: peerId, filter: .restricted), fetchChannelBlacklist(account: account, peerId: peerId, filter: .banned))
|> map { restricted, banned -> [RenderedChannelParticipant] in |> map { restricted, banned in
var result: [RenderedChannelParticipant] = [] var r: [RenderedChannelParticipant] = []
var b: [RenderedChannelParticipant] = []
var peerIds = Set<PeerId>() var peerIds = Set<PeerId>()
for participant in restricted { for participant in restricted {
if !peerIds.contains(participant.peer.id) { if !peerIds.contains(participant.peer.id) {
peerIds.insert(participant.peer.id) peerIds.insert(participant.peer.id)
result.append(participant) r.append(participant)
} }
} }
for participant in banned { for participant in banned {
if !peerIds.contains(participant.peer.id) { if !peerIds.contains(participant.peer.id) {
peerIds.insert(participant.peer.id) peerIds.insert(participant.peer.id)
result.append(participant) b.append(participant)
} }
} }
return result return ChannelBlacklist(banned: b, restricted: r)
} }
} }

View File

@ -42,7 +42,7 @@ public func channelMembers(account: Account, peerId: PeerId, filter: ChannelMemb
for participant in CachedChannelParticipants(apiParticipants: participants).participants { for participant in CachedChannelParticipants(apiParticipants: participants).participants {
if let peer = peers[participant.peerId] { 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]))
} }
} }

View File

@ -12,23 +12,24 @@ import Foundation
public struct RenderedChannelParticipant: Equatable { public struct RenderedChannelParticipant: Equatable {
public let participant: ChannelParticipant public let participant: ChannelParticipant
public let peer: Peer public let peer: Peer
public let status: PeerPresence? public let presence: PeerPresence?
public init(participant: ChannelParticipant, peer: Peer, status: PeerPresence? = nil) { public init(participant: ChannelParticipant, peer: Peer, presence: PeerPresence? = nil) {
self.participant = participant self.participant = participant
self.peer = peer self.peer = peer
self.status = status self.presence = presence
} }
public static func ==(lhs: RenderedChannelParticipant, rhs: RenderedChannelParticipant) -> Bool { 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) { if !lhsStatus.isEqual(to: rhsStatus) {
return false return false
} }
} else if (lhs.status != nil) != (rhs.status != nil) { } else if (lhs.presence != nil) != (rhs.presence != nil) {
return false return false
} }
return lhs.participant == rhs.participant && lhs.peer.isEqual(rhs.peer) return lhs.participant == rhs.participant && lhs.peer.isEqual(rhs.peer)
} }
} }
func updateChannelParticipantsSummary(account: Account, peerId: PeerId) -> Signal<Void, NoError> { func updateChannelParticipantsSummary(account: Account, peerId: PeerId) -> Signal<Void, NoError> {