From ba608793439832d666e7396adf58a51c26c44bd0 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Tue, 13 Jul 2021 14:33:42 +1000 Subject: [PATCH] Add support for new ban and delete all endpoint --- .../Context Menu/ContextMenuVC+Action.swift | 16 ++++++++++++++-- .../ConversationVC+Interaction.swift | 17 ++++++++++++++++- .../Open Groups/OpenGroupAPIV2.swift | 6 ++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Session/Conversations/Context Menu/ContextMenuVC+Action.swift b/Session/Conversations/Context Menu/ContextMenuVC+Action.swift index e83465073..747306fd3 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC+Action.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC+Action.swift @@ -35,6 +35,11 @@ extension ContextMenuVC { let title = "Ban User" return Action(icon: UIImage(named: "ic_block")!, title: title) { delegate?.ban(viewItem) } } + + static func banAndDeleteAllMessages(_ viewItem: ConversationViewItem, _ delegate: ContextMenuActionDelegate?) -> Action { + let title = "Ban and Delete All" + return Action(icon: UIImage(named: "ic_block")!, title: title) { delegate?.banAndDeleteAllMessages(viewItem) } + } } static func actions(for viewItem: ConversationViewItem, delegate: ContextMenuActionDelegate?) -> [Action] { @@ -53,7 +58,10 @@ extension ContextMenuVC { let isGroup = viewItem.isGroupThread if isGroup && viewItem.interaction is TSIncomingMessage { result.append(Action.copySessionID(viewItem, delegate)) } if !isGroup || viewItem.userCanDeleteGroupMessage { result.append(Action.delete(viewItem, delegate)) } - if isGroup && viewItem.interaction is TSIncomingMessage && viewItem.userHasModerationPermission { result.append(Action.ban(viewItem, delegate)) } + if isGroup && viewItem.interaction is TSIncomingMessage && viewItem.userHasModerationPermission { + result.append(Action.ban(viewItem, delegate)) + result.append(Action.banAndDeleteAllMessages(viewItem, delegate)) + } return result case .mediaMessage, .audio, .genericAttachment: var result: [Action] = [] @@ -63,7 +71,10 @@ extension ContextMenuVC { let isGroup = viewItem.isGroupThread if isGroup && viewItem.interaction is TSIncomingMessage { result.append(Action.copySessionID(viewItem, delegate)) } if !isGroup || viewItem.userCanDeleteGroupMessage { result.append(Action.delete(viewItem, delegate)) } - if isGroup && viewItem.interaction is TSIncomingMessage && viewItem.userHasModerationPermission { result.append(Action.ban(viewItem, delegate)) } + if isGroup && viewItem.interaction is TSIncomingMessage && viewItem.userHasModerationPermission { + result.append(Action.ban(viewItem, delegate)) + result.append(Action.banAndDeleteAllMessages(viewItem, delegate)) + } return result default: return [] } @@ -79,4 +90,5 @@ protocol ContextMenuActionDelegate : class { func delete(_ viewItem: ConversationViewItem) func save(_ viewItem: ConversationViewItem) func ban(_ viewItem: ConversationViewItem) + func banAndDeleteAllMessages(_ viewItem: ConversationViewItem) } diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 30919cd71..632463bcb 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -532,7 +532,8 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc func ban(_ viewItem: ConversationViewItem) { guard let message = viewItem.interaction as? TSIncomingMessage, message.isOpenGroupMessage else { return } - let alert = UIAlertController(title: "Ban This User?", message: nil, preferredStyle: .alert) + let explanation = "This will ban the selected user from this room. It won't ban them from other rooms." + let alert = UIAlertController(title: "Session", message: explanation, preferredStyle: .alert) let threadID = thread.uniqueId! alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in let publicKey = message.authorId @@ -542,6 +543,20 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil)) present(alert, animated: true, completion: nil) } + + func banAndDeleteAllMessages(_ viewItem: ConversationViewItem) { + guard let message = viewItem.interaction as? TSIncomingMessage, message.isOpenGroupMessage else { return } + let explanation = "This will ban the selected user from this room and delete all messages sent by them. It won't ban them from other rooms or delete the messages they sent there." + let alert = UIAlertController(title: "Session", message: explanation, preferredStyle: .alert) + let threadID = thread.uniqueId! + alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { _ in + let publicKey = message.authorId + guard let openGroupV2 = Storage.shared.getV2OpenGroup(for: threadID) else { return } + OpenGroupAPIV2.banAndDeleteAllMessages(publicKey, from: openGroupV2.room, on: openGroupV2.server).retainUntilComplete() + })) + alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil)) + present(alert, animated: true, completion: nil) + } func handleQuoteViewCancelButtonTapped() { snInputView.quoteDraftInfo = nil diff --git a/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift b/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift index 112e4faaf..069800c30 100644 --- a/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift +++ b/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift @@ -406,6 +406,12 @@ public final class OpenGroupAPIV2 : NSObject { return send(request).map(on: OpenGroupAPIV2.workQueue) { _ in } } + public static func banAndDeleteAllMessages(_ publicKey: String, from room: String, on server: String) -> Promise { + let parameters = [ "public_key" : publicKey ] + let request = Request(verb: .post, room: room, server: server, endpoint: "ban_and_delete_all", parameters: parameters) + return send(request).map(on: OpenGroupAPIV2.workQueue) { _ in } + } + public static func unban(_ publicKey: String, from room: String, on server: String) -> Promise { let request = Request(verb: .delete, room: room, server: server, endpoint: "block_list/\(publicKey)") return send(request).map(on: OpenGroupAPIV2.workQueue) { _ in }