diff --git a/app/src/main/java/moe/qwq/miko/ActionManager.kt b/app/src/main/java/moe/qwq/miko/ActionManager.kt index 7461309..96cfe60 100644 --- a/app/src/main/java/moe/qwq/miko/ActionManager.kt +++ b/app/src/main/java/moe/qwq/miko/ActionManager.kt @@ -9,6 +9,7 @@ import moe.qwq.miko.hooks.AllowGroupFlashPic import moe.qwq.miko.hooks.DefaultPacketHijacker import moe.qwq.miko.hooks.DisableFlashPictures import moe.qwq.miko.hooks.DisableQRLoginCheck +import moe.qwq.miko.hooks.DisableReplyAt import moe.qwq.miko.hooks.ForceTabletMode import moe.qwq.miko.hooks.HotUpdateSoPatch import moe.qwq.miko.hooks.MessageEncrypt @@ -44,7 +45,8 @@ object ActionManager { AllowGroupFlashPic::class.java, QQCrashHook::class.java, OptimizeAtSort::class.java, - DisableQRLoginCheck::class.java + DisableQRLoginCheck::class.java, + DisableReplyAt::class.java ) private val instanceMap = hashMapOf, IAction>() diff --git a/app/src/main/java/moe/qwq/miko/hooks/DisableReplyAt.kt b/app/src/main/java/moe/qwq/miko/hooks/DisableReplyAt.kt new file mode 100644 index 0000000..ad1c085 --- /dev/null +++ b/app/src/main/java/moe/qwq/miko/hooks/DisableReplyAt.kt @@ -0,0 +1,26 @@ +package moe.qwq.miko.hooks + +import android.content.Context +import com.tencent.mobileqq.aio.msg.AIOMsgItem +import de.robv.android.xposed.XposedBridge +import moe.fuqiuluo.xposed.loader.LuoClassloader +import moe.qwq.miko.actions.IAction +import moe.qwq.miko.ext.beforeHook +import moe.qwq.miko.internals.setting.QwQSetting + +class DisableReplyAt: IAction { + override fun onRun(ctx: Context) { + val replyAt = LuoClassloader.load("com.tencent.mobileqq.aio.input.reply.c") // 混淆的类名 + ?: throw RuntimeException("ReplyAt not found") + replyAt.declaredMethods.firstOrNull { + it.returnType == Void.TYPE && it.parameterTypes.size == 1 && it.parameterTypes[0] == AIOMsgItem::class.java + }?.let { + val hook = beforeHook { param -> + param.result = Unit + } + XposedBridge.hookMethod(it, hook) + } + } + + override val name: String = QwQSetting.DISABLE_REPLY_AT +} \ No newline at end of file diff --git a/app/src/main/java/moe/qwq/miko/internals/setting/QwQSetting.kt b/app/src/main/java/moe/qwq/miko/internals/setting/QwQSetting.kt index 5cdb6ea..38be7d1 100644 --- a/app/src/main/java/moe/qwq/miko/internals/setting/QwQSetting.kt +++ b/app/src/main/java/moe/qwq/miko/internals/setting/QwQSetting.kt @@ -6,6 +6,7 @@ import mqq.app.MobileQQ import kotlin.reflect.KProperty object QwQSetting { + const val DISABLE_REPLY_AT: String = "disable_reply_at" const val DISABLE_QRLOGIN_CHECK: String = "disable_qrlogin_check" const val DISABLE_QQ_CRASH_REPORT: String = "disable_qq_crash_report" const val MESSAGE_ENCRYPT: String = "message_encrypt" @@ -55,7 +56,8 @@ object QwQSetting { MESSAGE_TAIL to Setting(MESSAGE_TAIL, SettingType.STRING, ""), MESSAGE_ENCRYPT to Setting(MESSAGE_ENCRYPT, SettingType.STRING, ""), // 消息加密密钥 DISABLE_QQ_CRASH_REPORT to Setting(DISABLE_QQ_CRASH_REPORT, SettingType.BOOLEAN, true), - DISABLE_QRLOGIN_CHECK to Setting(DISABLE_QRLOGIN_CHECK, SettingType.BOOLEAN, true) + DISABLE_QRLOGIN_CHECK to Setting(DISABLE_QRLOGIN_CHECK, SettingType.BOOLEAN, true), + DISABLE_REPLY_AT to Setting(DISABLE_REPLY_AT, SettingType.BOOLEAN) ) val settingUrl: String diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/aio/msg/AIOMsgItem.java b/qqinterface/src/main/java/com/tencent/mobileqq/aio/msg/AIOMsgItem.java new file mode 100644 index 0000000..8cbc0c5 --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/aio/msg/AIOMsgItem.java @@ -0,0 +1,4 @@ +package com.tencent.mobileqq.aio.msg; + +public class AIOMsgItem { +}