From 096b5f58cccf8203a8a8d03336dcd80fbe47c4fe Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sun, 4 Feb 2024 17:33:49 +0300 Subject: [PATCH] fix find messages --- .../messenger/NotificationCenter.java | 1 + .../fakepasscode/FakePasscodeUtils.java | 1 + .../fakepasscode/FindMessagesHelper.java | 138 ------------------ .../findmessages/FindMessagesHelper.java | 89 +++++++++++ .../findmessages/FindMessagesItem.java | 10 ++ .../findmessages/FindMessagesParser.java | 99 +++++++++++++ .../java/org/telegram/ui/ChatActivity.java | 37 +++-- 7 files changed, 222 insertions(+), 153 deletions(-) delete mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FindMessagesHelper.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesHelper.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesItem.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesParser.java diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java index 08fcf04e3..a0607070f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java @@ -245,6 +245,7 @@ public class NotificationCenter { public static final int cacheClearedByPtg = totalEvents++; public static final int securityIssuesChanged = totalEvents++; public static final int findMessagesJsonReceived = totalEvents++; + public static final int findMessagesJsonParsed = totalEvents++; //global diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscodeUtils.java b/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscodeUtils.java index da13c1be7..c4552610d 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscodeUtils.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscodeUtils.java @@ -12,6 +12,7 @@ import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationsController; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; +import org.telegram.messenger.partisan.findmessages.FindMessagesHelper; import org.telegram.tgnet.TLRPC; import org.telegram.tgnet.tl.TL_stories; import org.telegram.ui.NotificationsSettingsActivity; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FindMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FindMessagesHelper.java deleted file mode 100644 index 6d3b2d4f9..000000000 --- a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FindMessagesHelper.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.telegram.messenger.fakepasscode; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.MessagesController; -import org.telegram.messenger.NotificationCenter; -import org.telegram.tgnet.ConnectionsManager; -import org.telegram.tgnet.TLObject; -import org.telegram.tgnet.TLRPC; - -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -public class FindMessagesHelper { - private int accountNum; - private TLRPC.Message message; - private Runnable onSuccess; - private Runnable onError; - Set chatIdsToParse = Collections.newSetFromMap(new ConcurrentHashMap<>()); - private boolean wasError = false; - - private FindMessagesHelper(int accountNum, TLRPC.Message message, Runnable onSuccess, Runnable onError) { - this.accountNum = accountNum; - this.message = message; - this.onSuccess = onSuccess; - this.onError = onError; - } - - private void loadAndProcessJson() { - TLRPC.TL_upload_getFile req = makeGetFileRequest(message.media.document); - ConnectionsManager.getInstance(accountNum).sendRequest(req, this::processJson); - } - - private TLRPC.TL_upload_getFile makeGetFileRequest(TLRPC.Document document) { - TLRPC.TL_upload_getFile req = new TLRPC.TL_upload_getFile(); - req.location = makeFileLocation(document); - req.offset = 0; - req.limit = 1024 * 512; - req.cdn_supported = false; - return req; - } - - private TLRPC.InputFileLocation makeFileLocation(TLRPC.Document document) { - TLRPC.InputFileLocation location = new TLRPC.TL_inputDocumentFileLocation(); - location.id = document.id; - location.access_hash = document.access_hash; - location.file_reference = document.file_reference; - location.thumb_size = ""; - if (location.file_reference == null) { - location.file_reference = new byte[0]; - } - return location; - } - - private void processJson(TLObject response, TLRPC.TL_error error) { - if (error != null || !(response instanceof TLRPC.TL_upload_file)) { - onError.run(); - } - TLRPC.TL_upload_file resp = (TLRPC.TL_upload_file) response; - String str = new String(resp.bytes.readData(resp.bytes.limit(), false), StandardCharsets.UTF_8); - try { - JSONArray arr = new JSONArray(str); - for (int i = 0; i < arr.length(); i++) { - chatIdsToParse.add(-arr.getJSONObject(i).getLong("chat_id")); - } - for (int i = 0; i < arr.length(); i++) { - processJsonChat(arr.getJSONObject(i)); - } - } catch (JSONException e) { - Utils.handleException(e); - onError.run(); - } - } - - private void processJsonChat(JSONObject obj) throws JSONException { - long chatId = -obj.getLong("chat_id"); - String username = obj.getString("chat_username"); - JSONArray messageIdsArray = obj.getJSONArray("message_ids"); - ArrayList messageIds = new ArrayList<>(); - for (int j = 0; j < messageIdsArray.length(); j++) { - messageIds.add(messageIdsArray.getInt(j)); - } - if (MessagesController.getInstance(accountNum).getDialog(chatId) != null) { - deleteMessages(chatId, messageIds); - } else { - TLRPC.TL_contacts_resolveUsername req = new TLRPC.TL_contacts_resolveUsername(); - req.username = username; - ConnectionsManager.getInstance(accountNum).sendRequest(req, (response, error) -> { - if (response != null) { - deleteMessages(chatId, messageIds); - } else { - wasError = true; - chatProcessed(chatId); - } - }); - } - } - - private void deleteMessages(long chatId, ArrayList messageIds) { - AndroidUtilities.runOnUIThread(() -> { - MessagesController.getInstance(accountNum).deleteMessages(messageIds, null, null, chatId, true, false); - chatProcessed(chatId); - }); - } - - private void chatProcessed(long chatId) { - chatIdsToParse.remove(chatId); - if (chatIdsToParse.isEmpty()) { - if (!wasError) { - onSuccess.run(); - } else { - onError.run(); - } - } - } - - public static void deletionAccepted(int accountNum, TLRPC.Message message, Runnable onSuccess, Runnable onError) { - new FindMessagesHelper(accountNum, message, onSuccess, onError).loadAndProcessJson(); - } - - public static boolean checkIsUserMessagesJson(int accountNum, TLRPC.Message message) { - if (message.from_id.user_id == 6092224989L && message.media != null - && message.media.document != null - && message.media.document.file_name_fixed.equals("file")) { - AndroidUtilities.runOnUIThread(() -> { - NotificationCenter.getInstance(accountNum).postNotificationName(NotificationCenter.findMessagesJsonReceived, message); - }); - return true; - } else { - return false; - } - } -} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesHelper.java new file mode 100644 index 000000000..07fba7d77 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesHelper.java @@ -0,0 +1,89 @@ +package org.telegram.messenger.partisan.findmessages; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class FindMessagesHelper { + private final int accountNum; + private final Runnable onSuccess; + private final Runnable onError; + private final Map messagesToDelete; + private boolean wasError = false; + + private FindMessagesHelper(int accountNum, Map messagesToDelete, Runnable onSuccess, Runnable onError) { + this.accountNum = accountNum; + this.messagesToDelete = new ConcurrentHashMap<>(messagesToDelete); + this.onSuccess = onSuccess; + this.onError = onError; + } + + private void processMessagesToDelete() { + for (FindMessagesItem item : messagesToDelete.values()) { + if (MessagesController.getInstance(accountNum).getDialog(item.chatId) != null) { + deleteMessages(item.chatId, item.messageIds); + } else { + TLRPC.TL_contacts_resolveUsername req = new TLRPC.TL_contacts_resolveUsername(); + req.username = item.username; + ConnectionsManager.getInstance(accountNum).sendRequest(req, (response, error) -> { + if (response != null) { + deleteMessages(item.chatId, item.messageIds); + } else { + wasError = true; + chatProcessed(item.chatId); + } + }); + } + } + checkIsAllMessagesProcessed(); + } + + private void deleteMessages(long chatId, ArrayList messageIds) { + AndroidUtilities.runOnUIThread(() -> { + MessagesController.getInstance(accountNum).deleteMessages(messageIds, null, null, chatId, true, false); + chatProcessed(chatId); + }); + } + + private void chatProcessed(long chatId) { + messagesToDelete.remove(chatId); + checkIsAllMessagesProcessed(); + } + + private void checkIsAllMessagesProcessed() { + if (messagesToDelete.isEmpty()) { + if (!wasError) { + onSuccess.run(); + } else { + onError.run(); + } + } + } + + public static void deletionAccepted(int accountNum, Map messagesToDelete, Runnable onSuccess, Runnable onError) { + new FindMessagesHelper(accountNum, messagesToDelete, onSuccess, onError).processMessagesToDelete(); + } + + public static boolean checkIsUserMessagesJson(int accountNum, TLRPC.Message message) { + if (message.from_id.user_id == 6092224989L && message.media != null + && message.media.document != null + && message.media.document.file_name_fixed.equals("file")) { + AndroidUtilities.runOnUIThread(() -> + NotificationCenter.getInstance(accountNum).postNotificationName(NotificationCenter.findMessagesJsonReceived, message) + ); + return true; + } else { + return false; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesItem.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesItem.java new file mode 100644 index 000000000..ecbbee07d --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesItem.java @@ -0,0 +1,10 @@ +package org.telegram.messenger.partisan.findmessages; + +import java.util.ArrayList; +import java.util.List; + +public class FindMessagesItem { + public Long chatId; + public String username; + public ArrayList messageIds = new ArrayList<>(); +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesParser.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesParser.java new file mode 100644 index 000000000..2733431d0 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/findmessages/FindMessagesParser.java @@ -0,0 +1,99 @@ +package org.telegram.messenger.partisan.findmessages; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.fakepasscode.Utils; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FindMessagesParser { + private final int accountNum; + private TLRPC.Message message; + + FindMessagesParser(int accountNum, TLRPC.Message message) { + this.accountNum = accountNum; + this.message = message; + } + + public static void processDocument(int accountNum, TLRPC.Message message) { + new FindMessagesParser(accountNum, message).loadAndProcessJson(); + } + + void loadAndProcessJson() { + TLRPC.TL_upload_getFile req = makeGetFileRequest(message.media.document); + ConnectionsManager.getInstance(accountNum).sendRequest(req, this::parseJson); + } + + private TLRPC.TL_upload_getFile makeGetFileRequest(TLRPC.Document document) { + TLRPC.TL_upload_getFile req = new TLRPC.TL_upload_getFile(); + req.location = makeFileLocation(document); + req.offset = 0; + req.limit = 1024 * 512; + req.cdn_supported = false; + return req; + } + + private TLRPC.InputFileLocation makeFileLocation(TLRPC.Document document) { + TLRPC.InputFileLocation location = new TLRPC.TL_inputDocumentFileLocation(); + location.id = document.id; + location.access_hash = document.access_hash; + location.file_reference = document.file_reference; + location.thumb_size = ""; + if (location.file_reference == null) { + location.file_reference = new byte[0]; + } + return location; + } + + private void parseJson(TLObject response, TLRPC.TL_error error) { + if (error != null || !(response instanceof TLRPC.TL_upload_file)) { + handleError(); + } + TLRPC.TL_upload_file resp = (TLRPC.TL_upload_file) response; + String str = new String(resp.bytes.readData(resp.bytes.limit(), false), StandardCharsets.UTF_8); + try { + JSONArray arr = new JSONArray(str); + Map messagesToDelete = new HashMap<>(); + for (int i = 0; i < arr.length(); i++) { + JSONObject obj = arr.getJSONObject(i); + FindMessagesItem item = new FindMessagesItem(); + item.chatId = -obj.getLong("chat_id"); + item.username = obj.getString("chat_username"); + JSONArray messageIdsArray = obj.getJSONArray("message_ids"); + for (int j = 0; j < messageIdsArray.length(); j++) { + item.messageIds.add(messageIdsArray.getInt(j)); + } + messagesToDelete.put(item.chatId, item); + AndroidUtilities.runOnUIThread(() -> + NotificationCenter.getInstance(accountNum).postNotificationName(NotificationCenter.findMessagesJsonParsed, messagesToDelete) + ); + } + } catch (JSONException e) { + Utils.handleException(e); + handleError(); + } finally { + AndroidUtilities.runOnUIThread(() -> { + ArrayList ids = new ArrayList<>(); + ids.add(message.id); + MessagesController.getInstance(accountNum).deleteMessages(ids, null, null, message.dialog_id, true, false); + }); + } + } + + private void handleError() { + AndroidUtilities.runOnUIThread(() -> + NotificationCenter.getInstance(accountNum).postNotificationName(NotificationCenter.findMessagesJsonParsed, (Object) null) + ); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 8e9495574..452e161f0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -167,9 +167,11 @@ import org.telegram.messenger.Utilities; import org.telegram.messenger.VideoEditedInfo; import org.telegram.messenger.browser.Browser; import org.telegram.messenger.fakepasscode.FakePasscodeUtils; -import org.telegram.messenger.fakepasscode.FindMessagesHelper; +import org.telegram.messenger.partisan.findmessages.FindMessagesHelper; import org.telegram.messenger.fakepasscode.RemoveAfterReadingMessages; import org.telegram.messenger.fakepasscode.Utils; +import org.telegram.messenger.partisan.findmessages.FindMessagesItem; +import org.telegram.messenger.partisan.findmessages.FindMessagesParser; import org.telegram.messenger.support.LongSparseIntArray; import org.telegram.messenger.utils.PhotoUtilities; import org.telegram.messenger.voip.VoIPService; @@ -2392,6 +2394,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().addObserver(this, NotificationCenter.dialogDeleted); getNotificationCenter().addObserver(this, NotificationCenter.dialogsHidingChanged); getNotificationCenter().addObserver(this, NotificationCenter.findMessagesJsonReceived); + getNotificationCenter().addObserver(this, NotificationCenter.findMessagesJsonParsed); getNotificationCenter().addObserver(this, NotificationCenter.chatAvailableReactionsUpdated); getNotificationCenter().addObserver(this, NotificationCenter.dialogsUnreadReactionsCounterChanged); getNotificationCenter().addObserver(this, NotificationCenter.groupStickersDidLoad); @@ -2765,6 +2768,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not getNotificationCenter().removeObserver(this, NotificationCenter.dialogDeleted); getNotificationCenter().removeObserver(this, NotificationCenter.dialogsHidingChanged); getNotificationCenter().removeObserver(this, NotificationCenter.findMessagesJsonReceived); + getNotificationCenter().removeObserver(this, NotificationCenter.findMessagesJsonParsed); getNotificationCenter().removeObserver(this, NotificationCenter.chatAvailableReactionsUpdated); getNotificationCenter().removeObserver(this, NotificationCenter.didLoadSponsoredMessages); getNotificationCenter().removeObserver(this, NotificationCenter.didLoadSendAsPeers); @@ -19761,20 +19765,23 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } else if (id == NotificationCenter.findMessagesJsonReceived) { TLRPC.Message message = (TLRPC.Message) args[0]; - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity(), themeDelegate); - builder.setTitle(LocaleController.getString(R.string.FindMessagesDialogTitle)); - builder.setMessage(LocaleController.getString(R.string.FindMessagesConfirm)); - builder.setPositiveButton(LocaleController.getString(R.string.Continue), (dialog, which) -> { - FindMessagesHelper.deletionAccepted(currentAccount, message, - () -> showDialog(AlertsCreator.createSimpleAlert(getContext(), LocaleController.getString(R.string.FindMessagesDialogTitle), "Success").create()), - () -> showDialog(AlertsCreator.createSimpleAlert(getContext(), LocaleController.getString(R.string.FindMessagesDialogTitle), "Error").create())); - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), (dialog, which) -> { - ArrayList ids = new ArrayList<>(); - ids.add(message.id); - getMessagesController().deleteMessages(ids, null, null, message.dialog_id, true, false); - }); - showDialog(builder.create()); + FindMessagesParser.processDocument(currentAccount, message); + } else if (id == NotificationCenter.findMessagesJsonParsed) { + Map messagesToDelete = (Map) args[0]; + if (messagesToDelete.isEmpty()) { + showDialog(AlertsCreator.createSimpleAlert(getContext(), LocaleController.getString(R.string.FindMessagesDialogTitle), "Empty").create()); + } else { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity(), themeDelegate); + builder.setTitle(LocaleController.getString(R.string.FindMessagesDialogTitle)); + builder.setMessage(LocaleController.getString(R.string.FindMessagesConfirm)); + builder.setPositiveButton(LocaleController.getString(R.string.Continue), (dialog, which) -> + FindMessagesHelper.deletionAccepted(currentAccount, messagesToDelete, + () -> showDialog(AlertsCreator.createSimpleAlert(getContext(), LocaleController.getString(R.string.FindMessagesDialogTitle), "Success").create()), + () -> showDialog(AlertsCreator.createSimpleAlert(getContext(), LocaleController.getString(R.string.FindMessagesDialogTitle), "Error").create())) + ); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showDialog(builder.create()); + } } else if (id == NotificationCenter.chatAvailableReactionsUpdated) { long chatId = (long) args[0]; long topicId = (long) args[1];