fix find messages

This commit is contained in:
vivabelarus 2024-02-04 17:33:49 +03:00
parent 5d1555ef07
commit 096b5f58cc
No known key found for this signature in database
GPG key ID: 0D2119CE32E33D2C
7 changed files with 222 additions and 153 deletions

View file

@ -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

View file

@ -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;

View file

@ -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<Long> 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<Integer> 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<Integer> 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;
}
}
}

View file

@ -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<Long, FindMessagesItem> messagesToDelete;
private boolean wasError = false;
private FindMessagesHelper(int accountNum, Map<Long, FindMessagesItem> 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<Integer> 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<Long, FindMessagesItem> 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;
}
}
}

View file

@ -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<Integer> messageIds = new ArrayList<>();
}

View file

@ -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<Long, FindMessagesItem> 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<Integer> 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)
);
}
}

View file

@ -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<Integer> 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<Long, FindMessagesItem> messagesToDelete = (Map<Long, FindMessagesItem>) 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];