Skip to content

Commit

Permalink
Prevent incorrect prompts by determining ChannelID
Browse files Browse the repository at this point in the history
  • Loading branch information
Nep-Timeline committed Jul 21, 2023
1 parent 12ef6ee commit 1e0bf20
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 80 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ android {
applicationId "nep.timeline.re_telegram"
minSdk 26
targetSdk 33
versionCode 2
versionName "2.3"
versionCode 25
versionName "2.5"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
37 changes: 30 additions & 7 deletions app/src/main/java/nep/timeline/re_telegram/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
Expand Down Expand Up @@ -61,10 +62,13 @@ public static void readDeletedMessages()
JsonObject jsonObject = (JsonObject) valueJsonElement;

jsonObject.entrySet().forEach(entry -> {
JsonArray jsonModule = entry.getValue().getAsJsonArray();
ArrayList<Integer> list = new ArrayList<>();
jsonModule.forEach(id -> list.add(id.getAsInt()));
AntiRecall.insertDeletedMessageFromSaveFile(Integer.parseInt(entry.getKey().trim()), list);
JsonObject jsonObject2 = entry.getValue().getAsJsonObject();
jsonObject2.entrySet().forEach(entry2 -> {
JsonArray jsonModule = entry2.getValue().getAsJsonArray();
ArrayList<Integer> list = new ArrayList<>();
jsonModule.forEach(id -> list.add(id.getAsInt()));
AntiRecall.insertDeletedMessageFromSaveFile(Integer.parseInt(entry.getKey().trim()), Long.parseLong(entry2.getKey().trim()), list);
});
});
}
}
Expand All @@ -81,11 +85,30 @@ public static void saveDeletedMessages()

JsonObject valueJsonObject = new JsonObject();

List<Integer> accounts = new ArrayList<>();

for (DeletedMessageInfo deletedMessageInfo : AntiRecall.getDeletedMessagesIds())
{
JsonArray jsonModule = new JsonArray();
deletedMessageInfo.getMessageIds().forEach(jsonModule::add);
valueJsonObject.add(String.valueOf(deletedMessageInfo.getSelectedAccount()), jsonModule);
if (!accounts.contains(deletedMessageInfo.getSelectedAccount()))
accounts.add(deletedMessageInfo.getSelectedAccount());
}

if (!accounts.isEmpty())
{
for (int account : accounts) {
JsonObject valueJsonObject2 = new JsonObject();

for (DeletedMessageInfo deletedMessageInfo : AntiRecall.getDeletedMessagesIds()) {
if (deletedMessageInfo.getSelectedAccount() == account)
{
JsonArray jsonModule = new JsonArray();
deletedMessageInfo.getMessageIds().forEach(jsonModule::add);
valueJsonObject2.add(String.valueOf(deletedMessageInfo.getChannelID()), jsonModule);
}
}

valueJsonObject.add(String.valueOf(account), valueJsonObject2);
}
}

FileUtils.save(deletedMessagesSavePath, BUILDER_GSON.toJson(valueJsonObject), false);
Expand Down
53 changes: 29 additions & 24 deletions app/src/main/java/nep/timeline/re_telegram/features/AntiRecall.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ public static List<DeletedMessageInfo> getDeletedMessagesIds() {
return deletedMessagesIds;
}

public static boolean messageIsDeleted(int messageId) {
public static boolean messageIsDeleted(long channelID, int messageId) {
boolean deleted = false;
for (DeletedMessageInfo deletedMessagesId : deletedMessagesIds) {
if (deletedMessagesId.getSelectedAccount() == UserConfig.getSelectedAccount() && deletedMessagesId.getMessageIds().contains(messageId))
if (deletedMessagesId.getSelectedAccount() == UserConfig.getSelectedAccount() && deletedMessagesId.getChannelID() == channelID && deletedMessagesId.getMessageIds().contains(messageId))
{
deleted = true;
break;
Expand All @@ -46,10 +46,10 @@ public static boolean messageIsDeleted(int messageId) {
return deleted; // deletedMessagesIds.contains(messageId);
}

public static boolean findInNeedProcess(int messageId) {
public static boolean findInNeedProcess(long channelID, int messageId) {
boolean deleted = false;
for (DeletedMessageInfo deletedMessagesId : needProcessing) {
if (deletedMessagesId.getSelectedAccount() == UserConfig.getSelectedAccount() && deletedMessagesId.getMessageIds().contains(messageId))
if (deletedMessagesId.getSelectedAccount() == UserConfig.getSelectedAccount() && deletedMessagesId.getChannelID() == channelID && deletedMessagesId.getMessageIds().contains(messageId))
{
deleted = true;
break;
Expand All @@ -58,19 +58,19 @@ public static boolean findInNeedProcess(int messageId) {
return deleted; // deletedMessagesIds.contains(messageId);
}

public static void insertDeletedMessage(ArrayList<Integer> messageIds) {
public static void insertDeletedMessage(long channelID, ArrayList<Integer> messageIds) {
boolean needInit = true;
DeletedMessageInfo info = null;
for (DeletedMessageInfo deletedMessagesId : deletedMessagesIds) {
if (deletedMessagesId.getSelectedAccount() == UserConfig.getSelectedAccount())
if (deletedMessagesId.getSelectedAccount() == UserConfig.getSelectedAccount() && deletedMessagesId.getChannelID() == channelID)
{
info = deletedMessagesId;
needInit = false;
break;
}
}
if (needInit)
deletedMessagesIds.add(new DeletedMessageInfo(UserConfig.getSelectedAccount(), messageIds));
deletedMessagesIds.add(new DeletedMessageInfo(UserConfig.getSelectedAccount(), channelID, messageIds));
else
{
for (Integer messageId : messageIds)
Expand All @@ -80,19 +80,19 @@ public static void insertDeletedMessage(ArrayList<Integer> messageIds) {
Utils.saveDeletedMessages();
}

public static void insertDeletedMessage(DeletedMessageInfo messageInfo) {
public static void insertDeletedMessage(long channelID, DeletedMessageInfo messageInfo) {
boolean needInit = true;
DeletedMessageInfo info = null;
for (DeletedMessageInfo deletedMessagesId : deletedMessagesIds) {
if (deletedMessagesId.getSelectedAccount() == messageInfo.getSelectedAccount())
if (deletedMessagesId.getSelectedAccount() == messageInfo.getSelectedAccount() && deletedMessagesId.getChannelID() == channelID)
{
info = deletedMessagesId;
needInit = false;
break;
}
}
if (needInit)
deletedMessagesIds.add(new DeletedMessageInfo(messageInfo.getSelectedAccount(), messageInfo.getMessageIds()));
deletedMessagesIds.add(new DeletedMessageInfo(messageInfo.getSelectedAccount(), channelID, messageInfo.getMessageIds()));
else
{
for (Integer messageId : messageInfo.getMessageIds())
Expand All @@ -102,19 +102,19 @@ public static void insertDeletedMessage(DeletedMessageInfo messageInfo) {
Utils.saveDeletedMessages();
}

public static void insertNeedProcessDeletedMessage(ArrayList<Integer> messageIds) {
public static void insertNeedProcessDeletedMessage(long channelID, ArrayList<Integer> messageIds) {
boolean needInit = true;
DeletedMessageInfo info = null;
for (DeletedMessageInfo deletedMessagesId : needProcessing) {
if (deletedMessagesId.getSelectedAccount() == UserConfig.getSelectedAccount())
if (deletedMessagesId.getSelectedAccount() == UserConfig.getSelectedAccount() && deletedMessagesId.getChannelID() == channelID)
{
info = deletedMessagesId;
needInit = false;
break;
}
}
if (needInit)
needProcessing.add(new DeletedMessageInfo(UserConfig.getSelectedAccount(), messageIds));
needProcessing.add(new DeletedMessageInfo(UserConfig.getSelectedAccount(), channelID, messageIds));
else
{
for (Integer messageId : messageIds)
Expand All @@ -123,19 +123,19 @@ public static void insertNeedProcessDeletedMessage(ArrayList<Integer> messageIds
}
}

public static void insertDeletedMessageFromSaveFile(int selectedAccount, ArrayList<Integer> messageIds) {
public static void insertDeletedMessageFromSaveFile(int selectedAccount, long channelID, ArrayList<Integer> messageIds) {
boolean needInit = true;
DeletedMessageInfo info = null;
for (DeletedMessageInfo deletedMessagesId : deletedMessagesIds) {
if (deletedMessagesId.getSelectedAccount() == selectedAccount)
if (deletedMessagesId.getSelectedAccount() == selectedAccount && deletedMessagesId.getChannelID() == channelID)
{
info = deletedMessagesId;
needInit = false;
break;
}
}
if (needInit)
deletedMessagesIds.add(new DeletedMessageInfo(selectedAccount, messageIds));
deletedMessagesIds.add(new DeletedMessageInfo(selectedAccount, channelID, messageIds));
else
{
for (Integer messageId : messageIds)
Expand Down Expand Up @@ -166,7 +166,8 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
MessageObject messageObject = new MessageObject(param.args[0]);
TLRPC.Message owner = messageObject.getMessageOwner();
int id = owner.getID();
if (AntiRecall.messageIsDeleted(id))
long channel_id = -owner.getPeerID().getChannelID();
if (AntiRecall.messageIsDeleted(channel_id, id))
{
if (ClientChecker.isNekogram() || ClientChecker.isYukigram())
{
Expand Down Expand Up @@ -256,10 +257,13 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// AntiRecall.insertDeletedMessage(new TLRPC.TL_updateDeleteScheduledMessages(item).getMessages());

if (item.getClass().equals(TL_updateDeleteChannelMessages))
AntiRecall.insertNeedProcessDeletedMessage(new TLRPC.TL_updateDeleteChannelMessages(item).getMessages());
{
TLRPC.TL_updateDeleteChannelMessages channelMessages = new TLRPC.TL_updateDeleteChannelMessages(item);
AntiRecall.insertNeedProcessDeletedMessage(-channelMessages.getChannelID(), channelMessages.getMessages());
}

if (item.getClass().equals(TL_updateDeleteMessages))
AntiRecall.insertNeedProcessDeletedMessage(new TLRPC.TL_updateDeleteMessages(item).getMessages());
AntiRecall.insertNeedProcessDeletedMessage(DeletedMessageInfo.NOT_CHANNEL, new TLRPC.TL_updateDeleteMessages(item).getMessages());

if (HookInit.DEBUG_MODE && (item.getClass().equals(TL_updateDeleteMessages) || item.getClass().equals(TL_updateDeleteChannelMessages)))
Utils.log("Protected message! event: " + item.getClass());
Expand Down Expand Up @@ -302,10 +306,11 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (Configs.isAntiRecall() && param.args[1] instanceof ArrayList)
{
ArrayList<Integer> list = Utils.castList(param.args[1], Integer.class);
list.removeIf(AntiRecall::findInNeedProcess);
long channel_id = (long) param.args[0];
list.removeIf(i -> AntiRecall.findInNeedProcess(channel_id, i));
param.args[1] = list;
insertDeletedMessage(list);
needProcessing.forEach(AntiRecall::insertDeletedMessage);
insertDeletedMessage(channel_id, list);
needProcessing.forEach(i -> AntiRecall.insertDeletedMessage(channel_id, i));
needProcessing.clear();
}
}
Expand Down Expand Up @@ -348,11 +353,11 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (Configs.isAntiRecall() && ((int) param.args[0]) == messagesDeletedValue) {
Object[] args = (Object[]) param.args[1];
//long dialogID = (long) args[1];
long dialogID = (long) args[1];
param.setResult(null);
if (args[0] instanceof ArrayList<?>)
{
insertDeletedMessage(Utils.castList(args[0], Integer.class));
insertDeletedMessage(dialogID, Utils.castList(args[0], Integer.class));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class Nekogram {
classList.add(new ClassInfo("org.telegram.messenger.MessageObject", "bc0"));
classList.add(new ClassInfo("org.telegram.messenger.UserConfig", "sm1"));
classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$Message", "YL0"));
//classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$Peer", "oM0"));
classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$Peer", "oM0"));
classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$TL_updateDeleteMessages", "Ja1"));
classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$TL_updateDeleteChannelMessages", "Ia1"));
//classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$TL_updateDeleteScheduledMessages", "Ka1"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ public class Yukigram {
classList.add(new ClassInfo("org.telegram.messenger.MessageObject", "Mw0"));
classList.add(new ClassInfo("org.telegram.messenger.UserConfig", "Zs1"));
classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$Message", "Ng1"));
classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$TL_updateDeleteMessages", "Ja1"));
classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$TL_updateDeleteChannelMessages", "Ia1"));
classList.add(new ClassInfo("org.telegram.tgnet.TLRPC$Peer", "dh1"));
classList.add(new ClassInfo("org.telegram.ui.Cells.ChatMessageCell", "org.telegram.ui.Cells.m"));
classList.add(new ClassInfo("org.telegram.ui.ActionBar.Theme", "Wk1"));
classList.add(new ClassInfo("org.telegram.ui.ChatPullingDownDrawable", "org.telegram.ui.T2"));
Expand All @@ -34,6 +33,9 @@ public class Yukigram {
fieldList.add(new FieldInfo("TLRPC$Message", "id", "a"));
fieldList.add(new FieldInfo("TLRPC$TL_updateDeleteMessages", "messages", "a"));
fieldList.add(new FieldInfo("TLRPC$TL_updateDeleteChannelMessages", "messages", "a"));
fieldList.add(new FieldInfo("TLRPC$TL_updateDeleteChannelMessages", "channel_id", "a"));
fieldList.add(new FieldInfo("TLRPC$Message", "peer_id", "b"));
fieldList.add(new FieldInfo("TLRPC$Peer", "channel_id", "c"));

methodList.add(new MethodInfo("ApplicationLoader", "onCreate", "n"));
methodList.add(new MethodInfo("NotificationsController", "removeNotificationsForDialog", "p1"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,23 @@
import java.util.ArrayList;

public class DeletedMessageInfo {
public static final long NOT_CHANNEL = 0;

private final int selectedAccount;
private final long channelID;
private final ArrayList<Integer> messageIds;

public DeletedMessageInfo(int selectedAccount, ArrayList<Integer> messageIds)
public DeletedMessageInfo(int selectedAccount, long channelID, ArrayList<Integer> messageIds)
{
this.selectedAccount = selectedAccount;
this.channelID = channelID;
this.messageIds = messageIds;
}

public DeletedMessageInfo(int selectedAccount, int messageId)
public DeletedMessageInfo(int selectedAccount, long channelID, int messageId)
{
this.selectedAccount = selectedAccount;
this.channelID = channelID;
this.messageIds = new ArrayList<>();
this.messageIds.add(messageId);
}
Expand All @@ -23,6 +28,16 @@ public int getSelectedAccount() {
return this.selectedAccount;
}

public long getChannelID()
{
return this.channelID;
}

public boolean isNotChannel()
{
return this.channelID == NOT_CHANNEL;
}

public ArrayList<Integer> getMessageIds() {
return this.messageIds;
}
Expand Down
Loading

0 comments on commit 1e0bf20

Please sign in to comment.