mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-15 21:45:19 +00:00
Support admins with empty rights
This commit is contained in:
parent
8f2ed45b25
commit
7b1377f121
@ -6136,3 +6136,8 @@ Sorry for the inconvenience.";
|
||||
"Intents.ErrorLockedText" = "Open Telegram and enter passcode to edit widget.";
|
||||
|
||||
"Conversation.GigagroupDescription" = "Only admins can send messages in this group.";
|
||||
|
||||
"Channel.AdminLog.MessageAddedAdminName" = "promoted %1$@";
|
||||
"Channel.AdminLog.MessageAddedAdminNameUsername" = "promoted %1$@ (%2$@)";
|
||||
"Channel.AdminLog.MessageRemovedAdminName" = "demoted %1$@";
|
||||
"Channel.AdminLog.MessageRemovedAdminNameUsername" = "demoted %1$@ (%2$@)";
|
||||
|
@ -629,7 +629,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
||||
if channel.flags.contains(.isCreator) {
|
||||
accountUserRightsFlags = maskRightsFlags
|
||||
} else if let adminRights = channel.adminRights {
|
||||
accountUserRightsFlags = maskRightsFlags.intersection(adminRights.flags)
|
||||
accountUserRightsFlags = maskRightsFlags.intersection(adminRights.rights)
|
||||
} else {
|
||||
accountUserRightsFlags = []
|
||||
}
|
||||
@ -638,9 +638,9 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
||||
if let updatedFlags = state.updatedFlags {
|
||||
currentRightsFlags = updatedFlags
|
||||
} else if let initialParticipant = initialParticipant, case let .member(_, _, maybeAdminRights, _, _) = initialParticipant, let adminRights = maybeAdminRights {
|
||||
currentRightsFlags = adminRights.rights.flags
|
||||
currentRightsFlags = adminRights.rights.rights
|
||||
} else if let initialParticipant = initialParticipant, case let .creator(_, maybeAdminRights, _) = initialParticipant, let adminRights = maybeAdminRights {
|
||||
currentRightsFlags = adminRights.rights.flags
|
||||
currentRightsFlags = adminRights.rights.rights
|
||||
} else {
|
||||
currentRightsFlags = accountUserRightsFlags.subtracting(.canAddAdmins).subtracting(.canBeAnonymous)
|
||||
}
|
||||
@ -661,7 +661,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
||||
if channel.flags.contains(.isCreator) {
|
||||
accountUserRightsFlags = maskRightsFlags
|
||||
} else if let adminRights = channel.adminRights {
|
||||
accountUserRightsFlags = maskRightsFlags.intersection(adminRights.flags)
|
||||
accountUserRightsFlags = maskRightsFlags.intersection(adminRights.rights)
|
||||
} else {
|
||||
accountUserRightsFlags = []
|
||||
}
|
||||
@ -670,7 +670,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
||||
if let updatedFlags = state.updatedFlags {
|
||||
currentRightsFlags = updatedFlags
|
||||
} else if let initialParticipant = initialParticipant, case let .member(_, _, maybeAdminRights, _, _) = initialParticipant, let adminRights = maybeAdminRights {
|
||||
currentRightsFlags = adminRights.rights.flags
|
||||
currentRightsFlags = adminRights.rights.rights
|
||||
} else {
|
||||
currentRightsFlags = accountUserRightsFlags.subtracting(.canAddAdmins).subtracting(.canBeAnonymous)
|
||||
}
|
||||
@ -691,7 +691,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
||||
canTransfer = true
|
||||
}
|
||||
|
||||
if let initialParticipant = initialParticipant, case let .member(_, _, adminInfoValue, _, _) = initialParticipant, let adminInfo = adminInfoValue, !adminInfo.rights.flags.isEmpty && admin.id != accountPeerId {
|
||||
if let initialParticipant = initialParticipant, case let .member(_, _, adminInfoValue, _, _) = initialParticipant, let adminInfo = adminInfoValue, admin.id != accountPeerId {
|
||||
if channel.flags.contains(.isCreator) {
|
||||
canDismiss = true
|
||||
} else {
|
||||
@ -710,7 +710,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
||||
} else if let initialParticipant = initialParticipant, case let .member(_, _, maybeAdminInfo, _, _) = initialParticipant, let adminInfo = maybeAdminInfo {
|
||||
var index = 0
|
||||
for right in rightsOrder {
|
||||
entries.append(.rightItem(presentationData.theme, index, stringForRight(strings: presentationData.strings, right: right, isGroup: isGroup, defaultBannedRights: channel.defaultBannedRights), right, adminInfo.rights.flags, adminInfo.rights.flags.contains(right), false))
|
||||
entries.append(.rightItem(presentationData.theme, index, stringForRight(strings: presentationData.strings, right: right, isGroup: isGroup, defaultBannedRights: channel.defaultBannedRights), right, adminInfo.rights.rights, adminInfo.rights.rights.contains(right), false))
|
||||
index += 1
|
||||
}
|
||||
}
|
||||
@ -783,7 +783,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
||||
if let updatedFlags = state.updatedFlags {
|
||||
currentRightsFlags = updatedFlags
|
||||
} else if let initialParticipant = initialParticipant, case let .member(_, _, maybeAdminRights, _, _) = initialParticipant, let adminRights = maybeAdminRights {
|
||||
currentRightsFlags = adminRights.rights.flags.subtracting(.canAddAdmins).subtracting(.canBeAnonymous)
|
||||
currentRightsFlags = adminRights.rights.rights.subtracting(.canAddAdmins).subtracting(.canBeAnonymous)
|
||||
} else {
|
||||
currentRightsFlags = accountUserRightsFlags.subtracting(.canAddAdmins).subtracting(.canBeAnonymous)
|
||||
}
|
||||
@ -807,7 +807,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
||||
entries.append(.rankTitle(presentationData.theme, presentationData.strings.Group_EditAdmin_RankTitle.uppercased(), rankEnabled && state.focusedOnRank ? Int32(currentRank?.count ?? 0) : nil, rankMaxLength))
|
||||
entries.append(.rank(presentationData.theme, presentationData.strings, isCreator ? presentationData.strings.Group_EditAdmin_RankOwnerPlaceholder : presentationData.strings.Group_EditAdmin_RankAdminPlaceholder, currentRank ?? "", rankEnabled))
|
||||
|
||||
if let initialParticipant = initialParticipant, case let .member(participant) = initialParticipant, let adminInfo = participant.adminInfo, !adminInfo.rights.flags.isEmpty && admin.id != accountPeerId {
|
||||
if let initialParticipant = initialParticipant, case let .member(participant) = initialParticipant, let adminInfo = participant.adminInfo, admin.id != accountPeerId {
|
||||
entries.append(.dismiss(presentationData.theme, presentationData.strings.Channel_Moderator_AccessLevelRevoke))
|
||||
}
|
||||
}
|
||||
@ -816,7 +816,7 @@ private func channelAdminControllerEntries(presentationData: PresentationData, s
|
||||
return entries
|
||||
}
|
||||
|
||||
public func channelAdminController(context: AccountContext, peerId: PeerId, adminId: PeerId, initialParticipant: ChannelParticipant?, updated: @escaping (TelegramChatAdminRights) -> Void, upgradedToSupergroup: @escaping (PeerId, @escaping () -> Void) -> Void, transferedOwnership: @escaping (PeerId) -> Void) -> ViewController {
|
||||
public func channelAdminController(context: AccountContext, peerId: PeerId, adminId: PeerId, initialParticipant: ChannelParticipant?, updated: @escaping (TelegramChatAdminRights?) -> Void, upgradedToSupergroup: @escaping (PeerId, @escaping () -> Void) -> Void, transferedOwnership: @escaping (PeerId) -> Void) -> ViewController {
|
||||
let statePromise = ValuePromise(ChannelAdminControllerState(), ignoreRepeated: true)
|
||||
let stateValue = Atomic(value: ChannelAdminControllerState())
|
||||
let updateState: ((ChannelAdminControllerState) -> ChannelAdminControllerState) -> Void = { f in
|
||||
@ -924,14 +924,14 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
|
||||
updateRightsDisposable.set((removeGroupAdmin(account: context.account, peerId: peerId, adminId: adminId)
|
||||
|> deliverOnMainQueue).start(error: { _ in
|
||||
}, completed: {
|
||||
updated(TelegramChatAdminRights(flags: []))
|
||||
updated(nil)
|
||||
dismissImpl?()
|
||||
}))
|
||||
} else {
|
||||
updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: []), rank: nil) |> deliverOnMainQueue).start(error: { _ in
|
||||
updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: nil, rank: nil) |> deliverOnMainQueue).start(error: { _ in
|
||||
|
||||
}, completed: {
|
||||
updated(TelegramChatAdminRights(flags: []))
|
||||
updated(nil)
|
||||
dismissImpl?()
|
||||
}))
|
||||
}
|
||||
@ -1006,21 +1006,21 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
|
||||
switch initialParticipant {
|
||||
case let .creator(_, adminInfo, rank):
|
||||
currentRank = rank
|
||||
currentFlags = adminInfo?.rights.flags ?? maskRightsFlags.subtracting(.canBeAnonymous)
|
||||
currentFlags = adminInfo?.rights.rights ?? maskRightsFlags.subtracting(.canBeAnonymous)
|
||||
case let .member(_, _, adminInfo, _, rank):
|
||||
if updateFlags == nil {
|
||||
if adminInfo?.rights == nil {
|
||||
if channel.flags.contains(.isCreator) {
|
||||
updateFlags = maskRightsFlags.subtracting([.canAddAdmins, .canBeAnonymous])
|
||||
} else if let adminRights = channel.adminRights {
|
||||
updateFlags = maskRightsFlags.intersection(adminRights.flags).subtracting([.canAddAdmins, .canBeAnonymous])
|
||||
updateFlags = maskRightsFlags.intersection(adminRights.rights).subtracting([.canAddAdmins, .canBeAnonymous])
|
||||
} else {
|
||||
updateFlags = []
|
||||
}
|
||||
}
|
||||
}
|
||||
currentRank = rank
|
||||
currentFlags = adminInfo?.rights.flags
|
||||
currentFlags = adminInfo?.rights.rights
|
||||
}
|
||||
|
||||
let effectiveRank = updateRank ?? currentRank
|
||||
@ -1029,11 +1029,11 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
|
||||
return
|
||||
}
|
||||
|
||||
if let updateFlags = updateFlags {
|
||||
if updateFlags != currentFlags {
|
||||
updateState { current in
|
||||
return current.withUpdatedUpdating(true)
|
||||
}
|
||||
updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: updateFlags), rank: effectiveRank) |> deliverOnMainQueue).start(error: { error in
|
||||
updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(rights: updateFlags ?? []), rank: effectiveRank) |> deliverOnMainQueue).start(error: { error in
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
var text = presentationData.strings.Login_UnknownError
|
||||
switch error {
|
||||
@ -1061,17 +1061,17 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
|
||||
}
|
||||
presentControllerImpl?(textAlertController(context: context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil)
|
||||
}, completed: {
|
||||
updated(TelegramChatAdminRights(flags: updateFlags))
|
||||
updated(TelegramChatAdminRights(rights: updateFlags ?? []))
|
||||
dismissImpl?()
|
||||
}))
|
||||
} else if let updateRank = updateRank, let currentFlags = currentFlags {
|
||||
updateState { current in
|
||||
return current.withUpdatedUpdating(true)
|
||||
}
|
||||
updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: currentFlags), rank: updateRank) |> deliverOnMainQueue).start(error: { _ in
|
||||
updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(rights: currentFlags), rank: updateRank) |> deliverOnMainQueue).start(error: { _ in
|
||||
|
||||
}, completed: {
|
||||
updated(TelegramChatAdminRights(flags: currentFlags))
|
||||
updated(TelegramChatAdminRights(rights: currentFlags))
|
||||
dismissImpl?()
|
||||
}))
|
||||
} else {
|
||||
@ -1103,7 +1103,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
|
||||
if channel.flags.contains(.isCreator) {
|
||||
updateFlags = maskRightsFlags.subtracting(.canAddAdmins)
|
||||
} else if let adminRights = channel.adminRights {
|
||||
updateFlags = maskRightsFlags.intersection(adminRights.flags).subtracting(.canAddAdmins)
|
||||
updateFlags = maskRightsFlags.intersection(adminRights.rights).subtracting(.canAddAdmins)
|
||||
} else {
|
||||
updateFlags = []
|
||||
}
|
||||
@ -1113,7 +1113,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
|
||||
updateState { current in
|
||||
return current.withUpdatedUpdating(true)
|
||||
}
|
||||
updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: updateFlags), rank: updateRank) |> deliverOnMainQueue).start(error: { error in
|
||||
updateRightsDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(rights: updateFlags), rank: updateRank) |> deliverOnMainQueue).start(error: { error in
|
||||
if case let .addMemberError(error) = error, let admin = adminView.peers[adminView.peerId] {
|
||||
if case .restricted = error {
|
||||
var text = presentationData.strings.Privacy_GroupsAndChannels_InviteToChannelError(admin.compactDisplayTitle, admin.compactDisplayTitle).0
|
||||
@ -1136,7 +1136,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
|
||||
}
|
||||
dismissImpl?()
|
||||
}, completed: {
|
||||
updated(TelegramChatAdminRights(flags: updateFlags))
|
||||
updated(TelegramChatAdminRights(rights: updateFlags))
|
||||
dismissImpl?()
|
||||
}))
|
||||
}
|
||||
@ -1207,7 +1207,7 @@ public func channelAdminController(context: AccountContext, peerId: PeerId, admi
|
||||
guard let upgradedPeerId = upgradedPeerId else {
|
||||
return .fail(.conversionFailed)
|
||||
}
|
||||
return context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: upgradedPeerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: updateFlags), rank: updateRank)
|
||||
return context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: upgradedPeerId, memberId: adminId, adminRights: TelegramChatAdminRights(rights: updateFlags), rank: updateRank)
|
||||
|> mapError { error -> WrappedUpdateChannelAdminRightsError in
|
||||
return .direct(error)
|
||||
}
|
||||
|
@ -582,7 +582,7 @@ public func channelAdminsController(context: AccountContext, peerId initialPeerI
|
||||
}
|
||||
}))
|
||||
} else {
|
||||
removeAdminDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: TelegramChatAdminRights(flags: []), rank: nil)
|
||||
removeAdminDisposable.set((context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: adminId, adminRights: nil, rank: nil)
|
||||
|> deliverOnMainQueue).start(completed: {
|
||||
updateState {
|
||||
return $0.withUpdatedRemovingPeerId(nil)
|
||||
@ -701,7 +701,7 @@ public func channelAdminsController(context: AccountContext, peerId initialPeerI
|
||||
var peers: [PeerId: Peer] = [:]
|
||||
peers[creator.id] = creator
|
||||
peers[peer.id] = peer
|
||||
result.append(RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(flags: .groupSpecific), promotedBy: creator.id, canBeEditedByAccountPeer: creator.id == context.account.peerId), banInfo: nil, rank: nil), peer: peer, peers: peers))
|
||||
result.append(RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(rights: .groupSpecific), promotedBy: creator.id, canBeEditedByAccountPeer: creator.id == context.account.peerId), banInfo: nil, rank: nil), peer: peer, peers: peers))
|
||||
case .member:
|
||||
break
|
||||
}
|
||||
|
@ -529,7 +529,7 @@ private func channelInfoEntries(account: Account, presentationData: Presentation
|
||||
}
|
||||
}
|
||||
|
||||
if let _ = state.editingState, let adminRights = peer.adminRights, !adminRights.isEmpty {
|
||||
if let _ = state.editingState, let adminRights = peer.adminRights {
|
||||
let discussionGroupTitle: String?
|
||||
if let cachedData = view.cachedData as? CachedChannelData {
|
||||
if case let .known(maybeLinkedDiscussionPeerId) = cachedData.linkedDiscussionPeerId, let linkedDiscussionPeerId = maybeLinkedDiscussionPeerId, let peer = view.peers[linkedDiscussionPeerId] {
|
||||
@ -939,7 +939,7 @@ public func channelInfoController(context: AccountContext, peerId: PeerId) -> Vi
|
||||
if let peer = peer as? TelegramChannel {
|
||||
if peer.flags.contains(.isCreator) {
|
||||
canManageChannel = true
|
||||
} else if let adminRights = peer.adminRights, !adminRights.isEmpty {
|
||||
} else if let adminRights = peer.adminRights {
|
||||
canManageChannel = true
|
||||
}
|
||||
}
|
||||
@ -950,7 +950,7 @@ public func channelInfoController(context: AccountContext, peerId: PeerId) -> Vi
|
||||
canEditChannel = peer.hasPermission(.changeInfo)
|
||||
if canEditChannel {
|
||||
hasSomethingToEdit = true
|
||||
} else if let adminRights = peer.adminRights, !adminRights.isEmpty {
|
||||
} else if let adminRights = peer.adminRights {
|
||||
if let cachedData = view.cachedData as? CachedChannelData, case let .known(maybeLinkedDiscussionPeerId) = cachedData.linkedDiscussionPeerId, let _ = maybeLinkedDiscussionPeerId {
|
||||
hasSomethingToEdit = true
|
||||
}
|
||||
|
@ -408,7 +408,7 @@ public final class ChannelMembersSearchContainerNode: SearchDisplayControllerCon
|
||||
|
||||
if peerId.namespace == Namespaces.Peer.CloudChannel {
|
||||
if case .searchAdmins = mode {
|
||||
return context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: memberId, adminRights: TelegramChatAdminRights(flags: []), rank: nil)
|
||||
return context.peerChannelMemberCategoriesContextsManager.updateMemberAdminRights(account: context.account, peerId: peerId, memberId: memberId, adminRights: nil, rank: nil)
|
||||
|> `catch` { _ -> Signal<Void, NoError> in
|
||||
return .complete()
|
||||
}
|
||||
@ -941,7 +941,7 @@ public final class ChannelMembersSearchContainerNode: SearchDisplayControllerCon
|
||||
peers[creator.id] = creator
|
||||
}
|
||||
peers[peer.id] = peer
|
||||
renderedParticipant = RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(flags: .groupSpecific), promotedBy: creatorPeer?.id ?? context.account.peerId, canBeEditedByAccountPeer: creatorPeer?.id == context.account.peerId), banInfo: nil, rank: nil), peer: peer, peers: peers)
|
||||
renderedParticipant = RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(rights: .groupSpecific), promotedBy: creatorPeer?.id ?? context.account.peerId, canBeEditedByAccountPeer: creatorPeer?.id == context.account.peerId), banInfo: nil, rank: nil), peer: peer, peers: peers)
|
||||
case .member:
|
||||
var peers: [PeerId: Peer] = [:]
|
||||
peers[peer.id] = peer
|
||||
|
@ -268,13 +268,13 @@ class ChannelMembersSearchControllerNode: ASDisplayNode {
|
||||
if !(peer.addressName?.isEmpty ?? true) {
|
||||
canInviteByLink = true
|
||||
} else if let peer = peer as? TelegramChannel {
|
||||
if peer.flags.contains(.isCreator) || (peer.adminRights?.flags.contains(.canInviteUsers) == true) {
|
||||
if peer.flags.contains(.isCreator) || (peer.adminRights?.rights.contains(.canInviteUsers) == true) {
|
||||
canInviteByLink = true
|
||||
}
|
||||
} else if let peer = peer as? TelegramGroup {
|
||||
if case .creator = peer.role {
|
||||
canInviteByLink = true
|
||||
} else if case let .admin(rights, _) = peer.role, rights.flags.contains(.canInviteUsers) {
|
||||
} else if case let .admin(rights, _) = peer.role, rights.rights.contains(.canInviteUsers) {
|
||||
canInviteByLink = true
|
||||
}
|
||||
}
|
||||
@ -384,7 +384,7 @@ class ChannelMembersSearchControllerNode: ASDisplayNode {
|
||||
var peers: [PeerId: Peer] = [:]
|
||||
peers[creator.id] = creator
|
||||
peers[peer.id] = peer
|
||||
renderedParticipant = RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(flags: .groupSpecific), promotedBy: creator.id, canBeEditedByAccountPeer: creator.id == context.account.peerId), banInfo: nil, rank: nil), peer: peer, peers: peers, presences: peerView.peerPresences)
|
||||
renderedParticipant = RenderedChannelParticipant(participant: .member(id: peer.id, invitedAt: 0, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(rights: .groupSpecific), promotedBy: creator.id, canBeEditedByAccountPeer: creator.id == context.account.peerId), banInfo: nil, rank: nil), peer: peer, peers: peers, presences: peerView.peerPresences)
|
||||
case .member:
|
||||
var peers: [PeerId: Peer] = [:]
|
||||
peers[peer.id] = peer
|
||||
|
@ -382,12 +382,12 @@ func compactStringForGroupPermission(strings: PresentationStrings, right: Telegr
|
||||
}
|
||||
|
||||
public let allGroupPermissionList: [(TelegramChatBannedRightsFlags, TelegramChannelPermission)] = [
|
||||
(.banSendMessages, .sendMessages),
|
||||
(.banSendMedia, .sendMessages),
|
||||
(.banSendGifs, .sendMessages),
|
||||
(.banEmbedLinks, .sendMessages),
|
||||
(.banSendPolls, .sendMessages),
|
||||
(.banAddMembers, .inviteMembers),
|
||||
(.banSendMessages, .banMembers),
|
||||
(.banSendMedia, .banMembers),
|
||||
(.banSendGifs, .banMembers),
|
||||
(.banEmbedLinks, .banMembers),
|
||||
(.banSendPolls, .banMembers),
|
||||
(.banAddMembers, .banMembers),
|
||||
(.banPinMessages, .pinMessages),
|
||||
(.banChangeInfo, .changeInfo)
|
||||
]
|
||||
|
@ -65,25 +65,21 @@ public struct TelegramChatAdminRightsFlags: OptionSet {
|
||||
}
|
||||
|
||||
public struct TelegramChatAdminRights: PostboxCoding, Equatable {
|
||||
public let flags: TelegramChatAdminRightsFlags
|
||||
public let rights: TelegramChatAdminRightsFlags
|
||||
|
||||
public init(flags: TelegramChatAdminRightsFlags) {
|
||||
self.flags = flags
|
||||
public init(rights: TelegramChatAdminRightsFlags) {
|
||||
self.rights = rights
|
||||
}
|
||||
|
||||
public init(decoder: PostboxDecoder) {
|
||||
self.flags = TelegramChatAdminRightsFlags(rawValue: decoder.decodeInt32ForKey("f", orElse: 0))
|
||||
self.rights = TelegramChatAdminRightsFlags(rawValue: decoder.decodeInt32ForKey("f", orElse: 0))
|
||||
}
|
||||
|
||||
public func encode(_ encoder: PostboxEncoder) {
|
||||
encoder.encodeInt32(self.flags.rawValue, forKey: "f")
|
||||
encoder.encodeInt32(self.rights.rawValue, forKey: "f")
|
||||
}
|
||||
|
||||
public static func ==(lhs: TelegramChatAdminRights, rhs: TelegramChatAdminRights) -> Bool {
|
||||
return lhs.flags == rhs.flags
|
||||
}
|
||||
|
||||
public var isEmpty: Bool {
|
||||
return self.flags.isEmpty
|
||||
return lhs.rights == rhs.rights
|
||||
}
|
||||
}
|
||||
|
@ -266,7 +266,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
||||
dict[-1512627963] = { return Api.Update.parse_updateDialogFilterOrder($0) }
|
||||
dict[889491791] = { return Api.Update.parse_updateDialogFilters($0) }
|
||||
dict[643940105] = { return Api.Update.parse_updatePhoneCallSignalingData($0) }
|
||||
dict[1708307556] = { return Api.Update.parse_updateChannelParticipant($0) }
|
||||
dict[1854571743] = { return Api.Update.parse_updateChannelMessageForwards($0) }
|
||||
dict[482860628] = { return Api.Update.parse_updateReadChannelDiscussionInbox($0) }
|
||||
dict[1178116716] = { return Api.Update.parse_updateReadChannelDiscussionOutbox($0) }
|
||||
@ -278,6 +277,9 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
||||
dict[-219423922] = { return Api.Update.parse_updateGroupCallParticipants($0) }
|
||||
dict[-1537295973] = { return Api.Update.parse_updateGroupCall($0) }
|
||||
dict[-1147422299] = { return Api.Update.parse_updatePeerHistoryTTL($0) }
|
||||
dict[1620733652] = { return Api.Update.parse_updateChatParticipant($0) }
|
||||
dict[1708307556] = { return Api.Update.parse_updateChannelParticipant($0) }
|
||||
dict[820801212] = { return Api.Update.parse_updateBotStopped($0) }
|
||||
dict[136574537] = { return Api.messages.VotesList.parse_votesList($0) }
|
||||
dict[1558266229] = { return Api.PopularContact.parse_popularContact($0) }
|
||||
dict[-373643672] = { return Api.FolderPeer.parse_folderPeer($0) }
|
||||
|
@ -6861,7 +6861,6 @@ public extension Api {
|
||||
case updateDialogFilterOrder(order: [Int32])
|
||||
case updateDialogFilters
|
||||
case updatePhoneCallSignalingData(phoneCallId: Int64, data: Buffer)
|
||||
case updateChannelParticipant(flags: Int32, channelId: Int32, date: Int32, userId: Int32, prevParticipant: Api.ChannelParticipant?, newParticipant: Api.ChannelParticipant?, qts: Int32)
|
||||
case updateChannelMessageForwards(channelId: Int32, id: Int32, forwards: Int32)
|
||||
case updateReadChannelDiscussionInbox(flags: Int32, channelId: Int32, topMsgId: Int32, readMaxId: Int32, broadcastId: Int32?, broadcastPost: Int32?)
|
||||
case updateReadChannelDiscussionOutbox(channelId: Int32, topMsgId: Int32, readMaxId: Int32)
|
||||
@ -6873,6 +6872,9 @@ public extension Api {
|
||||
case updateGroupCallParticipants(call: Api.InputGroupCall, participants: [Api.GroupCallParticipant], version: Int32)
|
||||
case updateGroupCall(chatId: Int32, call: Api.GroupCall)
|
||||
case updatePeerHistoryTTL(flags: Int32, peer: Api.Peer, ttlPeriod: Int32?)
|
||||
case updateChatParticipant(flags: Int32, chatId: Int32, date: Int32, userId: Int32, prevParticipant: Api.ChatParticipant?, newParticipant: Api.ChatParticipant?, qts: Int32)
|
||||
case updateChannelParticipant(flags: Int32, channelId: Int32, date: Int32, userId: Int32, prevParticipant: Api.ChannelParticipant?, newParticipant: Api.ChannelParticipant?, qts: Int32)
|
||||
case updateBotStopped(userId: Int32, stopped: Api.Bool, qts: Int32)
|
||||
|
||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||
switch self {
|
||||
@ -7525,18 +7527,6 @@ public extension Api {
|
||||
serializeInt64(phoneCallId, buffer: buffer, boxed: false)
|
||||
serializeBytes(data, buffer: buffer, boxed: false)
|
||||
break
|
||||
case .updateChannelParticipant(let flags, let channelId, let date, let userId, let prevParticipant, let newParticipant, let qts):
|
||||
if boxed {
|
||||
buffer.appendInt32(1708307556)
|
||||
}
|
||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||
serializeInt32(channelId, buffer: buffer, boxed: false)
|
||||
serializeInt32(date, buffer: buffer, boxed: false)
|
||||
serializeInt32(userId, buffer: buffer, boxed: false)
|
||||
if Int(flags) & Int(1 << 0) != 0 {prevParticipant!.serialize(buffer, true)}
|
||||
if Int(flags) & Int(1 << 1) != 0 {newParticipant!.serialize(buffer, true)}
|
||||
serializeInt32(qts, buffer: buffer, boxed: false)
|
||||
break
|
||||
case .updateChannelMessageForwards(let channelId, let id, let forwards):
|
||||
if boxed {
|
||||
buffer.appendInt32(1854571743)
|
||||
@ -7642,6 +7632,38 @@ public extension Api {
|
||||
peer.serialize(buffer, true)
|
||||
if Int(flags) & Int(1 << 0) != 0 {serializeInt32(ttlPeriod!, buffer: buffer, boxed: false)}
|
||||
break
|
||||
case .updateChatParticipant(let flags, let chatId, let date, let userId, let prevParticipant, let newParticipant, let qts):
|
||||
if boxed {
|
||||
buffer.appendInt32(1620733652)
|
||||
}
|
||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||
serializeInt32(chatId, buffer: buffer, boxed: false)
|
||||
serializeInt32(date, buffer: buffer, boxed: false)
|
||||
serializeInt32(userId, buffer: buffer, boxed: false)
|
||||
if Int(flags) & Int(1 << 0) != 0 {prevParticipant!.serialize(buffer, true)}
|
||||
if Int(flags) & Int(1 << 1) != 0 {newParticipant!.serialize(buffer, true)}
|
||||
serializeInt32(qts, buffer: buffer, boxed: false)
|
||||
break
|
||||
case .updateChannelParticipant(let flags, let channelId, let date, let userId, let prevParticipant, let newParticipant, let qts):
|
||||
if boxed {
|
||||
buffer.appendInt32(1708307556)
|
||||
}
|
||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||
serializeInt32(channelId, buffer: buffer, boxed: false)
|
||||
serializeInt32(date, buffer: buffer, boxed: false)
|
||||
serializeInt32(userId, buffer: buffer, boxed: false)
|
||||
if Int(flags) & Int(1 << 0) != 0 {prevParticipant!.serialize(buffer, true)}
|
||||
if Int(flags) & Int(1 << 1) != 0 {newParticipant!.serialize(buffer, true)}
|
||||
serializeInt32(qts, buffer: buffer, boxed: false)
|
||||
break
|
||||
case .updateBotStopped(let userId, let stopped, let qts):
|
||||
if boxed {
|
||||
buffer.appendInt32(820801212)
|
||||
}
|
||||
serializeInt32(userId, buffer: buffer, boxed: false)
|
||||
stopped.serialize(buffer, true)
|
||||
serializeInt32(qts, buffer: buffer, boxed: false)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
@ -7801,8 +7823,6 @@ public extension Api {
|
||||
return ("updateDialogFilters", [])
|
||||
case .updatePhoneCallSignalingData(let phoneCallId, let data):
|
||||
return ("updatePhoneCallSignalingData", [("phoneCallId", phoneCallId), ("data", data)])
|
||||
case .updateChannelParticipant(let flags, let channelId, let date, let userId, let prevParticipant, let newParticipant, let qts):
|
||||
return ("updateChannelParticipant", [("flags", flags), ("channelId", channelId), ("date", date), ("userId", userId), ("prevParticipant", prevParticipant), ("newParticipant", newParticipant), ("qts", qts)])
|
||||
case .updateChannelMessageForwards(let channelId, let id, let forwards):
|
||||
return ("updateChannelMessageForwards", [("channelId", channelId), ("id", id), ("forwards", forwards)])
|
||||
case .updateReadChannelDiscussionInbox(let flags, let channelId, let topMsgId, let readMaxId, let broadcastId, let broadcastPost):
|
||||
@ -7825,6 +7845,12 @@ public extension Api {
|
||||
return ("updateGroupCall", [("chatId", chatId), ("call", call)])
|
||||
case .updatePeerHistoryTTL(let flags, let peer, let ttlPeriod):
|
||||
return ("updatePeerHistoryTTL", [("flags", flags), ("peer", peer), ("ttlPeriod", ttlPeriod)])
|
||||
case .updateChatParticipant(let flags, let chatId, let date, let userId, let prevParticipant, let newParticipant, let qts):
|
||||
return ("updateChatParticipant", [("flags", flags), ("chatId", chatId), ("date", date), ("userId", userId), ("prevParticipant", prevParticipant), ("newParticipant", newParticipant), ("qts", qts)])
|
||||
case .updateChannelParticipant(let flags, let channelId, let date, let userId, let prevParticipant, let newParticipant, let qts):
|
||||
return ("updateChannelParticipant", [("flags", flags), ("channelId", channelId), ("date", date), ("userId", userId), ("prevParticipant", prevParticipant), ("newParticipant", newParticipant), ("qts", qts)])
|
||||
case .updateBotStopped(let userId, let stopped, let qts):
|
||||
return ("updateBotStopped", [("userId", userId), ("stopped", stopped), ("qts", qts)])
|
||||
}
|
||||
}
|
||||
|
||||
@ -9114,39 +9140,6 @@ public extension Api {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
public static func parse_updateChannelParticipant(_ reader: BufferReader) -> Update? {
|
||||
var _1: Int32?
|
||||
_1 = reader.readInt32()
|
||||
var _2: Int32?
|
||||
_2 = reader.readInt32()
|
||||
var _3: Int32?
|
||||
_3 = reader.readInt32()
|
||||
var _4: Int32?
|
||||
_4 = reader.readInt32()
|
||||
var _5: Api.ChannelParticipant?
|
||||
if Int(_1!) & Int(1 << 0) != 0 {if let signature = reader.readInt32() {
|
||||
_5 = Api.parse(reader, signature: signature) as? Api.ChannelParticipant
|
||||
} }
|
||||
var _6: Api.ChannelParticipant?
|
||||
if Int(_1!) & Int(1 << 1) != 0 {if let signature = reader.readInt32() {
|
||||
_6 = Api.parse(reader, signature: signature) as? Api.ChannelParticipant
|
||||
} }
|
||||
var _7: Int32?
|
||||
_7 = reader.readInt32()
|
||||
let _c1 = _1 != nil
|
||||
let _c2 = _2 != nil
|
||||
let _c3 = _3 != nil
|
||||
let _c4 = _4 != nil
|
||||
let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil
|
||||
let _c6 = (Int(_1!) & Int(1 << 1) == 0) || _6 != nil
|
||||
let _c7 = _7 != nil
|
||||
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 {
|
||||
return Api.Update.updateChannelParticipant(flags: _1!, channelId: _2!, date: _3!, userId: _4!, prevParticipant: _5, newParticipant: _6, qts: _7!)
|
||||
}
|
||||
else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
public static func parse_updateChannelMessageForwards(_ reader: BufferReader) -> Update? {
|
||||
var _1: Int32?
|
||||
_1 = reader.readInt32()
|
||||
@ -9369,6 +9362,91 @@ public extension Api {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
public static func parse_updateChatParticipant(_ reader: BufferReader) -> Update? {
|
||||
var _1: Int32?
|
||||
_1 = reader.readInt32()
|
||||
var _2: Int32?
|
||||
_2 = reader.readInt32()
|
||||
var _3: Int32?
|
||||
_3 = reader.readInt32()
|
||||
var _4: Int32?
|
||||
_4 = reader.readInt32()
|
||||
var _5: Api.ChatParticipant?
|
||||
if Int(_1!) & Int(1 << 0) != 0 {if let signature = reader.readInt32() {
|
||||
_5 = Api.parse(reader, signature: signature) as? Api.ChatParticipant
|
||||
} }
|
||||
var _6: Api.ChatParticipant?
|
||||
if Int(_1!) & Int(1 << 1) != 0 {if let signature = reader.readInt32() {
|
||||
_6 = Api.parse(reader, signature: signature) as? Api.ChatParticipant
|
||||
} }
|
||||
var _7: Int32?
|
||||
_7 = reader.readInt32()
|
||||
let _c1 = _1 != nil
|
||||
let _c2 = _2 != nil
|
||||
let _c3 = _3 != nil
|
||||
let _c4 = _4 != nil
|
||||
let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil
|
||||
let _c6 = (Int(_1!) & Int(1 << 1) == 0) || _6 != nil
|
||||
let _c7 = _7 != nil
|
||||
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 {
|
||||
return Api.Update.updateChatParticipant(flags: _1!, chatId: _2!, date: _3!, userId: _4!, prevParticipant: _5, newParticipant: _6, qts: _7!)
|
||||
}
|
||||
else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
public static func parse_updateChannelParticipant(_ reader: BufferReader) -> Update? {
|
||||
var _1: Int32?
|
||||
_1 = reader.readInt32()
|
||||
var _2: Int32?
|
||||
_2 = reader.readInt32()
|
||||
var _3: Int32?
|
||||
_3 = reader.readInt32()
|
||||
var _4: Int32?
|
||||
_4 = reader.readInt32()
|
||||
var _5: Api.ChannelParticipant?
|
||||
if Int(_1!) & Int(1 << 0) != 0 {if let signature = reader.readInt32() {
|
||||
_5 = Api.parse(reader, signature: signature) as? Api.ChannelParticipant
|
||||
} }
|
||||
var _6: Api.ChannelParticipant?
|
||||
if Int(_1!) & Int(1 << 1) != 0 {if let signature = reader.readInt32() {
|
||||
_6 = Api.parse(reader, signature: signature) as? Api.ChannelParticipant
|
||||
} }
|
||||
var _7: Int32?
|
||||
_7 = reader.readInt32()
|
||||
let _c1 = _1 != nil
|
||||
let _c2 = _2 != nil
|
||||
let _c3 = _3 != nil
|
||||
let _c4 = _4 != nil
|
||||
let _c5 = (Int(_1!) & Int(1 << 0) == 0) || _5 != nil
|
||||
let _c6 = (Int(_1!) & Int(1 << 1) == 0) || _6 != nil
|
||||
let _c7 = _7 != nil
|
||||
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 {
|
||||
return Api.Update.updateChannelParticipant(flags: _1!, channelId: _2!, date: _3!, userId: _4!, prevParticipant: _5, newParticipant: _6, qts: _7!)
|
||||
}
|
||||
else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
public static func parse_updateBotStopped(_ reader: BufferReader) -> Update? {
|
||||
var _1: Int32?
|
||||
_1 = reader.readInt32()
|
||||
var _2: Api.Bool?
|
||||
if let signature = reader.readInt32() {
|
||||
_2 = Api.parse(reader, signature: signature) as? Api.Bool
|
||||
}
|
||||
var _3: Int32?
|
||||
_3 = reader.readInt32()
|
||||
let _c1 = _1 != nil
|
||||
let _c2 = _2 != nil
|
||||
let _c3 = _3 != nil
|
||||
if _c1 && _c2 && _c3 {
|
||||
return Api.Update.updateBotStopped(userId: _1!, stopped: _2!, qts: _3!)
|
||||
}
|
||||
else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public enum PopularContact: TypeConstructorDescription {
|
||||
|
@ -4553,13 +4553,12 @@ public extension Api {
|
||||
})
|
||||
}
|
||||
|
||||
public static func deleteHistory(flags: Int32, channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
|
||||
public static func deleteHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
|
||||
let buffer = Buffer()
|
||||
buffer.appendInt32(-1113317569)
|
||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||
buffer.appendInt32(-1355375294)
|
||||
channel.serialize(buffer, true)
|
||||
serializeInt32(maxId, buffer: buffer, boxed: false)
|
||||
return (FunctionDescription(name: "channels.deleteHistory", parameters: [("flags", flags), ("channel", channel), ("maxId", maxId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
|
||||
return (FunctionDescription(name: "channels.deleteHistory", parameters: [("channel", channel), ("maxId", maxId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
|
||||
let reader = BufferReader(buffer)
|
||||
var result: Api.Bool?
|
||||
if let signature = reader.readInt32() {
|
||||
|
@ -46,7 +46,7 @@ func parseTelegramGroupOrChannel(chat: Api.Chat) -> Peer? {
|
||||
if (flags & (1 << 0)) != 0 {
|
||||
role = .creator(rank: nil)
|
||||
} else if let adminRights = adminRights {
|
||||
role = .admin(TelegramChatAdminRights(apiAdminRights: adminRights), rank: nil)
|
||||
role = .admin(TelegramChatAdminRights(apiAdminRights: adminRights) ?? TelegramChatAdminRights(rights: []), rank: nil)
|
||||
}
|
||||
if (flags & (1 << 5)) != 0 {
|
||||
groupFlags.insert(.deactivated)
|
||||
|
@ -201,13 +201,13 @@ extension ChannelParticipant {
|
||||
case let .channelParticipant(userId, date):
|
||||
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: nil, rank: nil)
|
||||
case let .channelParticipantCreator(_, userId, adminRights, rank):
|
||||
self = .creator(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(apiAdminRights: adminRights), promotedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), canBeEditedByAccountPeer: true), rank: rank)
|
||||
self = .creator(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(apiAdminRights: adminRights) ?? TelegramChatAdminRights(rights: []), promotedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), canBeEditedByAccountPeer: true), rank: rank)
|
||||
case let .channelParticipantBanned(flags, userId, restrictedBy, date, bannedRights):
|
||||
let hasLeft = (flags & (1 << 0)) != 0
|
||||
let banInfo = ChannelParticipantBannedInfo(rights: TelegramChatBannedRights(apiBannedRights: bannedRights), restrictedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: restrictedBy), timestamp: date, isMember: !hasLeft)
|
||||
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: banInfo, rank: nil)
|
||||
case let .channelParticipantAdmin(flags, userId, _, promotedBy, date, adminRights, rank: rank):
|
||||
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(apiAdminRights: adminRights), promotedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: promotedBy), canBeEditedByAccountPeer: (flags & (1 << 0)) != 0), banInfo: nil, rank: rank)
|
||||
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(apiAdminRights: adminRights) ?? TelegramChatAdminRights(rights: []), promotedBy: PeerId(namespace: Namespaces.Peer.CloudUser, id: promotedBy), canBeEditedByAccountPeer: (flags & (1 << 0)) != 0), banInfo: nil, rank: rank)
|
||||
case let .channelParticipantSelf(userId, _, date):
|
||||
self = .member(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: userId), invitedAt: date, adminInfo: nil, banInfo: nil, rank: nil)
|
||||
case let .channelParticipantLeft(userId):
|
||||
|
@ -257,8 +257,14 @@ public func updateDefaultChannelMemberBannedRights(account: Account, peerId: Pee
|
||||
return .complete()
|
||||
}
|
||||
return account.network.request(Api.functions.messages.editChatDefaultBannedRights(peer: inputPeer, bannedRights: rights.apiBannedRights))
|
||||
|> retryRequest
|
||||
|> map(Optional.init)
|
||||
|> `catch` { _ -> Signal<Api.Updates?, NoError> in
|
||||
return .single(nil)
|
||||
}
|
||||
|> mapToSignal { result -> Signal<Never, NoError> in
|
||||
guard let result = result else {
|
||||
return .complete()
|
||||
}
|
||||
account.stateManager.addUpdates(result)
|
||||
return account.postbox.transaction { transaction -> Void in
|
||||
guard let peer = transaction.getPeer(peerId) else {
|
||||
|
@ -93,7 +93,7 @@ public func updateChannelOwnership(account: Account, accountStateManager: Accoun
|
||||
}
|
||||
|
||||
let updatedParticipant = ChannelParticipant.creator(id: user.id, adminInfo: nil, rank: currentParticipant?.rank)
|
||||
let updatedPreviousCreator = ChannelParticipant.member(id: accountUser.id, invitedAt: Int32(Date().timeIntervalSince1970), adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(flags: flags), promotedBy: accountUser.id, canBeEditedByAccountPeer: false), banInfo: nil, rank: currentCreator?.rank)
|
||||
let updatedPreviousCreator = ChannelParticipant.member(id: accountUser.id, invitedAt: Int32(Date().timeIntervalSince1970), adminInfo: ChannelParticipantAdminInfo(rights: TelegramChatAdminRights(rights: flags), promotedBy: accountUser.id, canBeEditedByAccountPeer: false), banInfo: nil, rank: currentCreator?.rank)
|
||||
|
||||
let checkPassword = twoStepAuthData(account.network)
|
||||
|> mapError { error -> ChannelOwnershipTransferError in
|
||||
@ -160,7 +160,7 @@ public func updateChannelOwnership(account: Account, accountStateManager: Accoun
|
||||
case .creator:
|
||||
wasAdmin = true
|
||||
case let .member(_, _, adminInfo, _, _):
|
||||
if let adminInfo = adminInfo, !adminInfo.rights.isEmpty {
|
||||
if let _ = adminInfo {
|
||||
wasAdmin = true
|
||||
}
|
||||
}
|
||||
|
@ -342,7 +342,7 @@ public func joinGroupCall(account: Account, peerId: PeerId, callId: Int64, acces
|
||||
case .creator:
|
||||
adminIds.insert(parsedParticipant.peerId)
|
||||
case let .member(_, _, adminInfo, _, _):
|
||||
if let adminInfo = adminInfo, adminInfo.rights.flags.contains(.canManageCalls) {
|
||||
if let adminInfo = adminInfo, adminInfo.rights.rights.contains(.canManageCalls) {
|
||||
adminIds.insert(parsedParticipant.peerId)
|
||||
}
|
||||
}
|
||||
|
@ -384,14 +384,7 @@ private func clearHistory(transaction: Transaction, postbox: Postbox, network: N
|
||||
return .complete()
|
||||
}
|
||||
} else if peer.id.namespace == Namespaces.Peer.CloudChannel, let inputChannel = apiInputChannel(peer) {
|
||||
var flags: Int32 = 0
|
||||
switch operation.type {
|
||||
case .forEveryone:
|
||||
flags |= 1 << 0
|
||||
default:
|
||||
break
|
||||
}
|
||||
return network.request(Api.functions.channels.deleteHistory(flags: flags, channel: inputChannel, maxId: operation.topMessageId.id))
|
||||
return network.request(Api.functions.channels.deleteHistory(channel: inputChannel, maxId: operation.topMessageId.id))
|
||||
|> `catch` { _ -> Signal<Api.Bool, NoError> in
|
||||
return .single(.boolFalse)
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ public func removeGroupAdmin(account: Account, peerId: PeerId, adminId: PeerId)
|
||||
return current
|
||||
}
|
||||
})
|
||||
} |> mapError { _ -> RemoveGroupAdminError in return .generic }
|
||||
} |> mapError { _ -> RemoveGroupAdminError in }
|
||||
}
|
||||
} else {
|
||||
return .fail(.generic)
|
||||
@ -48,7 +48,7 @@ public func removeGroupAdmin(account: Account, peerId: PeerId, adminId: PeerId)
|
||||
return .fail(.generic)
|
||||
}
|
||||
}
|
||||
|> mapError { _ -> RemoveGroupAdminError in return .generic }
|
||||
|> mapError { _ -> RemoveGroupAdminError in }
|
||||
|> switchToLatest
|
||||
}
|
||||
|
||||
@ -108,7 +108,7 @@ public func addGroupAdmin(account: Account, peerId: PeerId, adminId: PeerId) ->
|
||||
return current
|
||||
}
|
||||
})
|
||||
} |> mapError { _ -> AddGroupAdminError in return .generic }
|
||||
} |> mapError { _ -> AddGroupAdminError in }
|
||||
}
|
||||
} else {
|
||||
return .fail(.generic)
|
||||
@ -117,7 +117,7 @@ public func addGroupAdmin(account: Account, peerId: PeerId, adminId: PeerId) ->
|
||||
return .fail(.generic)
|
||||
}
|
||||
}
|
||||
|> mapError { _ -> AddGroupAdminError in return .generic }
|
||||
|> mapError { _ -> AddGroupAdminError in }
|
||||
|> switchToLatest
|
||||
}
|
||||
|
||||
@ -150,10 +150,9 @@ public func fetchChannelParticipant(account: Account, peerId: PeerId, participan
|
||||
} |> switchToLatest
|
||||
}
|
||||
|
||||
public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId: PeerId, rights: TelegramChatAdminRights, rank: String?) -> Signal<(ChannelParticipant?, RenderedChannelParticipant), UpdateChannelAdminRightsError> {
|
||||
public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId: PeerId, rights: TelegramChatAdminRights?, rank: String?) -> Signal<(ChannelParticipant?, RenderedChannelParticipant), UpdateChannelAdminRightsError> {
|
||||
return fetchChannelParticipant(account: account, peerId: peerId, participantId: adminId)
|
||||
|> mapError { error -> UpdateChannelAdminRightsError in
|
||||
return .generic
|
||||
}
|
||||
|> mapToSignal { currentParticipant -> Signal<(ChannelParticipant?, RenderedChannelParticipant), UpdateChannelAdminRightsError> in
|
||||
return account.postbox.transaction { transaction -> Signal<(ChannelParticipant?, RenderedChannelParticipant), UpdateChannelAdminRightsError> in
|
||||
@ -162,7 +161,7 @@ public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId:
|
||||
let updatedParticipant: ChannelParticipant
|
||||
if let currentParticipant = currentParticipant, case let .member(_, invitedAt, currentAdminInfo, _, _) = currentParticipant {
|
||||
let adminInfo: ChannelParticipantAdminInfo?
|
||||
if !rights.flags.isEmpty {
|
||||
if let rights = rights {
|
||||
adminInfo = ChannelParticipantAdminInfo(rights: rights, promotedBy: currentAdminInfo?.promotedBy ?? account.peerId, canBeEditedByAccountPeer: true)
|
||||
} else {
|
||||
adminInfo = nil
|
||||
@ -170,7 +169,7 @@ public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId:
|
||||
updatedParticipant = .member(id: adminId, invitedAt: invitedAt, adminInfo: adminInfo, banInfo: nil, rank: rank)
|
||||
} else if let currentParticipant = currentParticipant, case .creator = currentParticipant {
|
||||
let adminInfo: ChannelParticipantAdminInfo?
|
||||
if !rights.flags.isEmpty {
|
||||
if let rights = rights {
|
||||
adminInfo = ChannelParticipantAdminInfo(rights: rights, promotedBy: account.peerId, canBeEditedByAccountPeer: true)
|
||||
} else {
|
||||
adminInfo = nil
|
||||
@ -178,14 +177,14 @@ public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId:
|
||||
updatedParticipant = .creator(id: adminId, adminInfo: adminInfo, rank: rank)
|
||||
} else {
|
||||
let adminInfo: ChannelParticipantAdminInfo?
|
||||
if !rights.flags.isEmpty {
|
||||
if let rights = rights {
|
||||
adminInfo = ChannelParticipantAdminInfo(rights: rights, promotedBy: account.peerId, canBeEditedByAccountPeer: true)
|
||||
} else {
|
||||
adminInfo = nil
|
||||
}
|
||||
updatedParticipant = .member(id: adminId, invitedAt: Int32(Date().timeIntervalSince1970), adminInfo: adminInfo, banInfo: nil, rank: rank)
|
||||
}
|
||||
return account.network.request(Api.functions.channels.editAdmin(channel: inputChannel, userId: inputUser, adminRights: rights.apiAdminRights, rank: rank ?? ""))
|
||||
return account.network.request(Api.functions.channels.editAdmin(channel: inputChannel, userId: inputUser, adminRights: rights?.apiAdminRights ?? .chatAdminRights(flags: 0), rank: rank ?? ""))
|
||||
|> map { [$0] }
|
||||
|> `catch` { error -> Signal<[Api.Updates], UpdateChannelAdminRightsError> in
|
||||
if error.errorDescription == "USER_NOT_PARTICIPANT" {
|
||||
@ -197,7 +196,7 @@ public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId:
|
||||
return .addMemberError(error)
|
||||
}
|
||||
|> then(
|
||||
account.network.request(Api.functions.channels.editAdmin(channel: inputChannel, userId: inputUser, adminRights: rights.apiAdminRights, rank: rank ?? ""))
|
||||
account.network.request(Api.functions.channels.editAdmin(channel: inputChannel, userId: inputUser, adminRights: rights?.apiAdminRights ?? .chatAdminRights(flags: 0), rank: rank ?? ""))
|
||||
|> mapError { error -> UpdateChannelAdminRightsError in
|
||||
return .generic
|
||||
}
|
||||
@ -226,14 +225,14 @@ public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId:
|
||||
case .creator:
|
||||
wasAdmin = true
|
||||
case let .member(_, _, adminInfo, _, _):
|
||||
if let adminInfo = adminInfo, !adminInfo.rights.isEmpty {
|
||||
if let _ = adminInfo {
|
||||
wasAdmin = true
|
||||
}
|
||||
}
|
||||
}
|
||||
if wasAdmin && rights.isEmpty {
|
||||
if wasAdmin && rights == nil {
|
||||
updatedAdminCount = max(1, adminCount - 1)
|
||||
} else if !wasAdmin && !rights.isEmpty {
|
||||
} else if !wasAdmin && rights != nil {
|
||||
updatedAdminCount = adminCount + 1
|
||||
}
|
||||
|
||||
@ -254,7 +253,7 @@ public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId:
|
||||
}
|
||||
}
|
||||
return (currentParticipant, RenderedChannelParticipant(participant: updatedParticipant, peer: adminPeer, peers: peers, presences: presences))
|
||||
} |> mapError { _ -> UpdateChannelAdminRightsError in return .generic }
|
||||
} |> mapError { _ -> UpdateChannelAdminRightsError in }
|
||||
}
|
||||
} else {
|
||||
return .fail(.generic)
|
||||
@ -263,8 +262,7 @@ public func updateChannelAdminRights(account: Account, peerId: PeerId, adminId:
|
||||
return .fail(.generic)
|
||||
}
|
||||
}
|
||||
|> mapError { _ -> UpdateChannelAdminRightsError in return .generic }
|
||||
|> mapError { _ -> UpdateChannelAdminRightsError in }
|
||||
|> switchToLatest
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@ public extension TelegramChannel {
|
||||
if self.flags.contains(.isCreator) {
|
||||
if case .canBeAnonymous = permission {
|
||||
if let adminRights = self.adminRights {
|
||||
return adminRights.flags.contains(.canBeAnonymous)
|
||||
return adminRights.rights.contains(.canBeAnonymous)
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
@ -32,7 +32,7 @@ public extension TelegramChannel {
|
||||
case .sendMessages:
|
||||
if case .broadcast = self.info {
|
||||
if let adminRights = self.adminRights {
|
||||
return adminRights.flags.contains(.canPostMessages)
|
||||
return adminRights.rights.contains(.canPostMessages)
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
@ -51,12 +51,12 @@ public extension TelegramChannel {
|
||||
case .pinMessages:
|
||||
if case .broadcast = self.info {
|
||||
if let adminRights = self.adminRights {
|
||||
return adminRights.flags.contains(.canPinMessages) || adminRights.flags.contains(.canEditMessages)
|
||||
return adminRights.rights.contains(.canPinMessages) || adminRights.rights.contains(.canEditMessages)
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
if let adminRights = self.adminRights, adminRights.flags.contains(.canPinMessages) {
|
||||
if let adminRights = self.adminRights, adminRights.rights.contains(.canPinMessages) {
|
||||
return true
|
||||
}
|
||||
if let bannedRights = self.bannedRights, bannedRights.flags.contains(.banPinMessages) {
|
||||
@ -70,12 +70,12 @@ public extension TelegramChannel {
|
||||
case .inviteMembers:
|
||||
if case .broadcast = self.info {
|
||||
if let adminRights = self.adminRights {
|
||||
return adminRights.flags.contains(.canInviteUsers)
|
||||
return adminRights.rights.contains(.canInviteUsers)
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
if let adminRights = self.adminRights, adminRights.flags.contains(.canInviteUsers) {
|
||||
if let adminRights = self.adminRights, adminRights.rights.contains(.canInviteUsers) {
|
||||
return true
|
||||
}
|
||||
if let bannedRights = self.bannedRights, bannedRights.flags.contains(.banAddMembers) {
|
||||
@ -87,29 +87,29 @@ public extension TelegramChannel {
|
||||
return true
|
||||
}
|
||||
case .editAllMessages:
|
||||
if let adminRights = self.adminRights, adminRights.flags.contains(.canEditMessages) {
|
||||
if let adminRights = self.adminRights, adminRights.rights.contains(.canEditMessages) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
case .deleteAllMessages:
|
||||
if let adminRights = self.adminRights, adminRights.flags.contains(.canDeleteMessages) {
|
||||
if let adminRights = self.adminRights, adminRights.rights.contains(.canDeleteMessages) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
case .banMembers:
|
||||
if let adminRights = self.adminRights, adminRights.flags.contains(.canBanUsers) {
|
||||
if let adminRights = self.adminRights, adminRights.rights.contains(.canBanUsers) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
case .changeInfo:
|
||||
if case .broadcast = self.info {
|
||||
if let adminRights = self.adminRights {
|
||||
return adminRights.flags.contains(.canChangeInfo)
|
||||
return adminRights.rights.contains(.canChangeInfo)
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
if let adminRights = self.adminRights, adminRights.flags.contains(.canChangeInfo) {
|
||||
if let adminRights = self.adminRights, adminRights.rights.contains(.canChangeInfo) {
|
||||
return true
|
||||
}
|
||||
if let bannedRights = self.bannedRights, bannedRights.flags.contains(.banChangeInfo) {
|
||||
@ -121,17 +121,17 @@ public extension TelegramChannel {
|
||||
return true
|
||||
}
|
||||
case .addAdmins:
|
||||
if let adminRights = self.adminRights, adminRights.flags.contains(.canAddAdmins) {
|
||||
if let adminRights = self.adminRights, adminRights.rights.contains(.canAddAdmins) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
case .manageCalls:
|
||||
if let adminRights = self.adminRights, adminRights.flags.contains(.canManageCalls) {
|
||||
if let adminRights = self.adminRights, adminRights.rights.contains(.canManageCalls) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
case .canBeAnonymous:
|
||||
if let adminRights = self.adminRights, adminRights.flags.contains(.canBeAnonymous) {
|
||||
if let adminRights = self.adminRights, adminRights.rights.contains(.canBeAnonymous) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
@ -142,7 +142,7 @@ public extension TelegramChannel {
|
||||
if self.flags.contains(.isCreator) {
|
||||
return nil
|
||||
}
|
||||
if let adminRights = self.adminRights, !adminRights.flags.isEmpty {
|
||||
if let _ = self.adminRights {
|
||||
return nil
|
||||
}
|
||||
if let defaultBannedRights = self.defaultBannedRights, defaultBannedRights.flags.contains(rights) {
|
||||
@ -158,7 +158,7 @@ public extension TelegramChannel {
|
||||
if self.flags.contains(.isCreator) {
|
||||
return false
|
||||
}
|
||||
if let adminRights = self.adminRights, !adminRights.flags.isEmpty {
|
||||
if let _ = self.adminRights {
|
||||
return false
|
||||
}
|
||||
if case let .group(group) = self.info {
|
||||
|
@ -5,14 +5,20 @@ import TelegramApi
|
||||
import SyncCore
|
||||
|
||||
extension TelegramChatAdminRights {
|
||||
init(apiAdminRights: Api.ChatAdminRights) {
|
||||
init?(apiAdminRights: Api.ChatAdminRights) {
|
||||
switch apiAdminRights {
|
||||
case let .chatAdminRights(flags):
|
||||
self.init(flags: TelegramChatAdminRightsFlags(rawValue: flags))
|
||||
if flags == 0 {
|
||||
return nil
|
||||
}
|
||||
let filteredFlags = flags & (~(1 << 12))
|
||||
self.init(rights: TelegramChatAdminRightsFlags(rawValue: filteredFlags))
|
||||
}
|
||||
}
|
||||
|
||||
var apiAdminRights: Api.ChatAdminRights {
|
||||
return .chatAdminRights(flags: self.flags.rawValue)
|
||||
var filteredFlags = self.rights.rawValue
|
||||
filteredFlags |= 1 << 12
|
||||
return .chatAdminRights(flags: filteredFlags)
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -322,6 +322,13 @@ final class AuthorizedApplicationContext {
|
||||
if let forwardInfo = firstMessage.forwardInfo, forwardInfo.flags.contains(.isImported) {
|
||||
return
|
||||
}
|
||||
for media in firstMessage.media {
|
||||
if let action = media as? TelegramMediaAction {
|
||||
if case .messageAutoremoveTimeoutUpdated = action.action {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if chatIsVisible {
|
||||
return
|
||||
|
@ -536,7 +536,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
if case .creator = group.role {
|
||||
canManageGroupCalls = true
|
||||
} else if case let .admin(rights, _) = group.role {
|
||||
if rights.flags.contains(.canManageCalls) {
|
||||
if rights.rights.contains(.canManageCalls) {
|
||||
canManageGroupCalls = true
|
||||
}
|
||||
}
|
||||
@ -592,7 +592,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
if case .creator = group.role {
|
||||
canSetupAutoremoveTimeout = true
|
||||
} else if case let .admin(rights, _) = group.role {
|
||||
if rights.flags.contains(.canDeleteMessages) {
|
||||
if rights.rights.contains(.canDeleteMessages) {
|
||||
canSetupAutoremoveTimeout = true
|
||||
}
|
||||
}
|
||||
@ -5608,7 +5608,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
if case .creator = group.role {
|
||||
canSetupAutoremoveTimeout = true
|
||||
} else if case let .admin(rights, _) = group.role {
|
||||
if rights.flags.contains(.canDeleteMessages) {
|
||||
if rights.rights.contains(.canDeleteMessages) {
|
||||
canSetupAutoremoveTimeout = true
|
||||
}
|
||||
}
|
||||
@ -7795,7 +7795,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
switch group.role {
|
||||
case .creator:
|
||||
canClearForMyself = .group
|
||||
canClearForEveryone = .group
|
||||
canClearForEveryone = nil
|
||||
case .admin, .member:
|
||||
canClearForMyself = .group
|
||||
canClearForEveryone = nil
|
||||
@ -7813,13 +7813,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
switch channel.info {
|
||||
case .broadcast:
|
||||
if channel.flags.contains(.isCreator) {
|
||||
canClearForEveryone = .channel
|
||||
canClearForEveryone = nil
|
||||
} else {
|
||||
canClearForEveryone = nil
|
||||
}
|
||||
case .group:
|
||||
if channel.flags.contains(.isCreator) {
|
||||
canClearForEveryone = .group
|
||||
canClearForEveryone = nil
|
||||
} else {
|
||||
canClearForEveryone = nil
|
||||
}
|
||||
@ -7846,7 +7846,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
|
||||
if channel.flags.contains(.isCreator) {
|
||||
canClearForMyself = .channel
|
||||
canClearForEveryone = .channel
|
||||
canClearForEveryone = nil
|
||||
} else {
|
||||
canClearForMyself = .channel
|
||||
canClearForEveryone = nil
|
||||
@ -7856,7 +7856,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
|
||||
if channel.flags.contains(.isCreator) {
|
||||
canClearForMyself = .group
|
||||
canClearForEveryone = .group
|
||||
canClearForEveryone = nil
|
||||
} else {
|
||||
canClearForMyself = .group
|
||||
canClearForEveryone = nil
|
||||
@ -12229,7 +12229,7 @@ extension Peer {
|
||||
if case .creator = group.role {
|
||||
return true
|
||||
} else if case let .admin(rights, _) = group.role {
|
||||
if rights.flags.contains(.canDeleteMessages) {
|
||||
if rights.rights.contains(.canDeleteMessages) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
@ -242,7 +242,7 @@ func inputTextPanelStateForChatPresentationInterfaceState(_ chatPresentationInte
|
||||
if case .creator = group.role {
|
||||
canSetupAutoremoveTimeout = true
|
||||
} else if case let .admin(rights, _) = group.role {
|
||||
if rights.flags.contains(.canDeleteMessages) {
|
||||
if rights.rights.contains(.canDeleteMessages) {
|
||||
canSetupAutoremoveTimeout = true
|
||||
}
|
||||
}
|
||||
|
@ -649,7 +649,7 @@ struct ChatRecentActionsEntry: Comparable, Identifiable {
|
||||
} else {
|
||||
var appendedRightsHeader = false
|
||||
|
||||
if case let .creator(_, prevAdminInfo, prevRank) = prev.participant, case let .creator(_, newAdminInfo, newRank) = new.participant, (prevRank != newRank || prevAdminInfo?.rights.flags.contains(.canBeAnonymous) != newAdminInfo?.rights.flags.contains(.canBeAnonymous)) {
|
||||
if case let .creator(_, prevAdminInfo, prevRank) = prev.participant, case let .creator(_, newAdminInfo, newRank) = new.participant, (prevRank != newRank || prevAdminInfo?.rights.rights.contains(.canBeAnonymous) != newAdminInfo?.rights.rights.contains(.canBeAnonymous)) {
|
||||
if prevRank != newRank {
|
||||
appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessageRankName(new.peer.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder), newRank ?? "") : self.presentationData.strings.Channel_AdminLog_MessageRankUsername(new.peer.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder), "@" + new.peer.addressName!, newRank ?? ""), generateEntities: { index in
|
||||
var result: [MessageTextEntityType] = []
|
||||
@ -663,7 +663,7 @@ struct ChatRecentActionsEntry: Comparable, Identifiable {
|
||||
return result
|
||||
}, to: &text, entities: &entities)
|
||||
}
|
||||
if prevAdminInfo?.rights.flags.contains(.canBeAnonymous) != newAdminInfo?.rights.flags.contains(.canBeAnonymous) {
|
||||
if prevAdminInfo?.rights.rights.contains(.canBeAnonymous) != newAdminInfo?.rights.rights.contains(.canBeAnonymous) {
|
||||
let order: [(TelegramChatAdminRightsFlags, String)]
|
||||
|
||||
if let peer = peer as? TelegramChannel, case .broadcast = peer.info {
|
||||
@ -676,7 +676,7 @@ struct ChatRecentActionsEntry: Comparable, Identifiable {
|
||||
|
||||
var appendedRightsHeader = false
|
||||
for (flag, string) in order {
|
||||
if prevAdminInfo?.rights.flags.contains(flag) != newAdminInfo?.rights.flags.contains(flag) {
|
||||
if prevAdminInfo?.rights.rights.contains(flag) != newAdminInfo?.rights.rights.contains(flag) {
|
||||
if !appendedRightsHeader {
|
||||
appendedRightsHeader = true
|
||||
appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessagePromotedName(new.peer.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder)) : self.presentationData.strings.Channel_AdminLog_MessagePromotedNameUsername(new.peer.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder), "@" + new.peer.addressName!), generateEntities: { index in
|
||||
@ -694,7 +694,7 @@ struct ChatRecentActionsEntry: Comparable, Identifiable {
|
||||
}
|
||||
|
||||
text += "\n"
|
||||
if prevAdminInfo?.rights.flags.contains(flag) != true {
|
||||
if prevAdminInfo?.rights.rights.contains(flag) != true {
|
||||
text += "+"
|
||||
} else {
|
||||
text += "-"
|
||||
@ -705,8 +705,8 @@ struct ChatRecentActionsEntry: Comparable, Identifiable {
|
||||
}
|
||||
} else if case let .member(_, _, prevAdminRights, _, prevRank) = prev.participant {
|
||||
if case let .member(_, _, newAdminRights, _, newRank) = new.participant {
|
||||
let prevFlags = prevAdminRights?.rights.flags ?? []
|
||||
let newFlags = newAdminRights?.rights.flags ?? []
|
||||
let prevFlags = prevAdminRights?.rights.rights ?? []
|
||||
let newFlags = newAdminRights?.rights.rights ?? []
|
||||
|
||||
let order: [(TelegramChatAdminRightsFlags, String)]
|
||||
|
||||
@ -734,6 +734,37 @@ struct ChatRecentActionsEntry: Comparable, Identifiable {
|
||||
]
|
||||
}
|
||||
|
||||
if prevFlags.isEmpty && newFlags.isEmpty && (prevAdminRights != nil) != (newAdminRights != nil) {
|
||||
if !appendedRightsHeader {
|
||||
appendedRightsHeader = true
|
||||
if prevAdminRights == nil {
|
||||
appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessageAddedAdminName(new.peer.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder)) : self.presentationData.strings.Channel_AdminLog_MessageAddedAdminNameUsername(new.peer.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder), "@" + new.peer.addressName!), generateEntities: { index in
|
||||
var result: [MessageTextEntityType] = []
|
||||
if index == 0 {
|
||||
result.append(.TextMention(peerId: new.peer.id))
|
||||
} else if index == 1 {
|
||||
result.append(.Mention)
|
||||
} else if index == 2 {
|
||||
result.append(.Bold)
|
||||
}
|
||||
return result
|
||||
}, to: &text, entities: &entities)
|
||||
} else {
|
||||
appendAttributedText(text: new.peer.addressName == nil ? self.presentationData.strings.Channel_AdminLog_MessageRemovedAdminName(new.peer.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder)) : self.presentationData.strings.Channel_AdminLog_MessageRemovedAdminNameUsername(new.peer.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder), "@" + new.peer.addressName!), generateEntities: { index in
|
||||
var result: [MessageTextEntityType] = []
|
||||
if index == 0 {
|
||||
result.append(.TextMention(peerId: new.peer.id))
|
||||
} else if index == 1 {
|
||||
result.append(.Mention)
|
||||
} else if index == 2 {
|
||||
result.append(.Bold)
|
||||
}
|
||||
return result
|
||||
}, to: &text, entities: &entities)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (flag, string) in order {
|
||||
if prevFlags.contains(flag) != newFlags.contains(flag) {
|
||||
if !appendedRightsHeader {
|
||||
|
@ -656,7 +656,7 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
|
||||
|
||||
if currentInvitationsContext == nil {
|
||||
var canManageInvitations = false
|
||||
if let channel = peerViewMainPeer(peerView) as? TelegramChannel, let cachedData = peerView.cachedData as? CachedChannelData, channel.flags.contains(.isCreator) || (channel.adminRights?.flags.contains(.canInviteUsers) == true) {
|
||||
if let channel = peerViewMainPeer(peerView) as? TelegramChannel, let cachedData = peerView.cachedData as? CachedChannelData, channel.flags.contains(.isCreator) || (channel.adminRights?.rights.contains(.canInviteUsers) == true) {
|
||||
canManageInvitations = true
|
||||
}
|
||||
if canManageInvitations {
|
||||
@ -816,10 +816,10 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
|
||||
if let group = peerViewMainPeer(peerView) as? TelegramGroup {
|
||||
if case .creator = group.role {
|
||||
canManageInvitations = true
|
||||
} else if case let .admin(rights, _) = group.role, rights.flags.contains(.canInviteUsers) {
|
||||
} else if case let .admin(rights, _) = group.role, rights.rights.contains(.canInviteUsers) {
|
||||
canManageInvitations = true
|
||||
}
|
||||
} else if let channel = peerViewMainPeer(peerView) as? TelegramChannel, channel.flags.contains(.isCreator) || (channel.adminRights?.flags.contains(.canInviteUsers) == true) {
|
||||
} else if let channel = peerViewMainPeer(peerView) as? TelegramChannel, channel.flags.contains(.isCreator) || (channel.adminRights?.rights.contains(.canInviteUsers) == true) {
|
||||
canManageInvitations = true
|
||||
}
|
||||
if canManageInvitations {
|
||||
@ -1035,7 +1035,7 @@ func peerInfoHeaderButtons(peer: Peer?, cachedData: CachedPeerData?, isOpenedFro
|
||||
}
|
||||
var displayMore = true
|
||||
if displayLeave && !channel.flags.contains(.isCreator) {
|
||||
if let adminRights = channel.adminRights, !adminRights.isEmpty {
|
||||
if let _ = channel.adminRights {
|
||||
displayMore = false
|
||||
}
|
||||
}
|
||||
@ -1107,7 +1107,7 @@ func peerInfoCanEdit(peer: Peer?, cachedData: CachedPeerData?, isContact: Bool?)
|
||||
return true
|
||||
} else if peer.hasPermission(.changeInfo) {
|
||||
return true
|
||||
} else if let adminRights = peer.adminRights, adminRights.flags.contains(.canAddAdmins) || adminRights.flags.contains(.canBanUsers) || adminRights.flags.contains(.canChangeInfo) || adminRights.flags.contains(.canInviteUsers) {
|
||||
} else if let _ = peer.adminRights {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
@ -1115,7 +1115,7 @@ func peerInfoCanEdit(peer: Peer?, cachedData: CachedPeerData?, isContact: Bool?)
|
||||
if case .creator = peer.role {
|
||||
return true
|
||||
} else if case let .admin(rights, _) = peer.role {
|
||||
if rights.flags.contains(.canAddAdmins) || rights.flags.contains(.canBanUsers) || rights.flags.contains(.canChangeInfo) || rights.flags.contains(.canInviteUsers) {
|
||||
if rights.rights.contains(.canAddAdmins) || rights.rights.contains(.canBanUsers) || rights.rights.contains(.canChangeInfo) || rights.rights.contains(.canInviteUsers) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
|
@ -1202,7 +1202,7 @@ private func editingItems(data: PeerInfoScreenData?, context: AccountContext, pr
|
||||
}))
|
||||
}
|
||||
|
||||
if (channel.flags.contains(.isCreator) && (channel.username?.isEmpty ?? true)) || (channel.adminRights?.flags.contains(.canInviteUsers) == true) {
|
||||
if (channel.flags.contains(.isCreator) && (channel.username?.isEmpty ?? true)) || (channel.adminRights?.rights.contains(.canInviteUsers) == true) {
|
||||
let invitesText: String
|
||||
if let count = data.invitations?.count, count > 0 {
|
||||
invitesText = "\(count)"
|
||||
@ -1324,7 +1324,7 @@ private func editingItems(data: PeerInfoScreenData?, context: AccountContext, pr
|
||||
}
|
||||
}
|
||||
|
||||
if (isCreator && (channel.username?.isEmpty ?? true) && cachedData.peerGeoLocation == nil) || (channel.adminRights?.flags.contains(.canInviteUsers) == true) {
|
||||
if (isCreator && (channel.username?.isEmpty ?? true) && cachedData.peerGeoLocation == nil) || (channel.adminRights?.rights.contains(.canInviteUsers) == true) {
|
||||
let invitesText: String
|
||||
if let count = data.invitations?.count, count > 0 {
|
||||
invitesText = "\(count)"
|
||||
@ -1365,7 +1365,7 @@ private func editingItems(data: PeerInfoScreenData?, context: AccountContext, pr
|
||||
}
|
||||
|
||||
var canViewAdminsAndBanned = false
|
||||
if let adminRights = channel.adminRights, !adminRights.isEmpty {
|
||||
if let _ = channel.adminRights {
|
||||
canViewAdminsAndBanned = true
|
||||
} else if channel.flags.contains(.isCreator) {
|
||||
canViewAdminsAndBanned = true
|
||||
@ -1476,7 +1476,7 @@ private func editingItems(data: PeerInfoScreenData?, context: AccountContext, pr
|
||||
interaction.openParticipantsSection(.admins)
|
||||
}))
|
||||
} else if case let .admin(rights, _) = group.role {
|
||||
if rights.flags.contains(.canInviteUsers) {
|
||||
if rights.rights.contains(.canInviteUsers) {
|
||||
let invitesText: String
|
||||
if let count = data.invitations?.count, count > 0 {
|
||||
invitesText = "\(count)"
|
||||
@ -3255,7 +3255,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
|
||||
if case .creator = group.role {
|
||||
canManageGroupCalls = true
|
||||
} else if case let .admin(rights, _) = group.role {
|
||||
if rights.flags.contains(.canManageCalls) {
|
||||
if rights.rights.contains(.canManageCalls) {
|
||||
canManageGroupCalls = true
|
||||
}
|
||||
}
|
||||
@ -6250,12 +6250,12 @@ func presentAddMembers(context: AccountContext, parentController: ViewController
|
||||
case .creator:
|
||||
canCreateInviteLink = true
|
||||
case let .admin(rights, _):
|
||||
canCreateInviteLink = rights.flags.contains(.canInviteUsers)
|
||||
canCreateInviteLink = rights.rights.contains(.canInviteUsers)
|
||||
default:
|
||||
break
|
||||
}
|
||||
} else if let channel = groupPeer as? TelegramChannel, (channel.addressName?.isEmpty ?? true) {
|
||||
if channel.flags.contains(.isCreator) || (channel.adminRights?.flags.contains(.canInviteUsers) == true) {
|
||||
if channel.flags.contains(.isCreator) || (channel.adminRights?.rights.contains(.canInviteUsers) == true) {
|
||||
canCreateInviteLink = true
|
||||
}
|
||||
}
|
||||
|
@ -378,7 +378,7 @@ public final class PeerChannelMemberCategoriesContextsManager {
|
||||
}
|
||||
}
|
||||
|
||||
public func updateMemberAdminRights(account: Account, peerId: PeerId, memberId: PeerId, adminRights: TelegramChatAdminRights, rank: String?) -> Signal<Void, UpdateChannelAdminRightsError> {
|
||||
public func updateMemberAdminRights(account: Account, peerId: PeerId, memberId: PeerId, adminRights: TelegramChatAdminRights?, rank: String?) -> Signal<Void, UpdateChannelAdminRightsError> {
|
||||
return updateChannelAdminRights(account: account, peerId: peerId, adminId: memberId, rights: adminRights, rank: rank)
|
||||
|> map(Optional.init)
|
||||
|> deliverOnMainQueue
|
||||
|
Loading…
x
Reference in New Issue
Block a user