mirror of
https://github.com/wrwrabbit/Partisan-Telegram-Android.git
synced 2026-05-30 12:04:42 +00:00
fix find messages
This commit is contained in:
parent
5d1555ef07
commit
096b5f58cc
7 changed files with 222 additions and 153 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<>();
|
||||
}
|
||||
|
|
@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -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];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue