fix(core): hide streak restore

This commit is contained in:
rhunk 2024-04-26 17:37:55 +02:00
parent 7fc3ec9d10
commit debaecf91d
2 changed files with 35 additions and 5 deletions

View File

@ -2,22 +2,44 @@ package me.rhunk.snapenhance.core.features.impl.ui
import me.rhunk.snapenhance.core.features.Feature import me.rhunk.snapenhance.core.features.Feature
import me.rhunk.snapenhance.core.features.FeatureLoadParams import me.rhunk.snapenhance.core.features.FeatureLoadParams
import me.rhunk.snapenhance.core.features.impl.messaging.Messaging
import me.rhunk.snapenhance.core.util.dataBuilder import me.rhunk.snapenhance.core.util.dataBuilder
import me.rhunk.snapenhance.core.util.hook.HookStage import me.rhunk.snapenhance.core.util.hook.HookStage
import me.rhunk.snapenhance.core.util.hook.hookConstructor import me.rhunk.snapenhance.core.util.hook.hookConstructor
import me.rhunk.snapenhance.core.util.ktx.getObjectField
import me.rhunk.snapenhance.core.util.ktx.getObjectFieldOrNull
import me.rhunk.snapenhance.core.util.ktx.setObjectField
import me.rhunk.snapenhance.core.wrapper.impl.SnapUUID
class HideStreakRestore : Feature("HideStreakRestore", loadParams = FeatureLoadParams.INIT_SYNC) { class HideStreakRestore : Feature("HideStreakRestore", loadParams = FeatureLoadParams.INIT_SYNC) {
override fun init() { override fun init() {
if (!context.config.userInterface.hideStreakRestore.get()) return if (!context.config.userInterface.hideStreakRestore.get()) return
findClass("com.snapchat.client.messaging.FeedEntry").hookConstructor(HookStage.AFTER) { param ->
val instance = param.thisObject<Any>()
if (instance.getObjectFieldOrNull("mDisplayInfo")
?.getObjectFieldOrNull("mFeedItem")
?.getObjectFieldOrNull("mConversation")
?.getObjectFieldOrNull("mState")
?.toString() == "STREAK_RESTORE") {
instance.getObjectFieldOrNull("mDisplayInfo")
?.getObjectFieldOrNull("mFeedItem")
?.setObjectField("mConversation", null)
val conversationId = SnapUUID(instance.getObjectField("mConversationId")).toString()
context.feature(Messaging::class).conversationManager?.dismissStreakRestore(
conversationId,
onError = {
context.log.error("Failed to dismiss streak restore: $it")
}, onSuccess = {
context.log.info("Dismissed streak restore for conversation $conversationId")
}
)
}
}
findClass("com.snapchat.client.messaging.StreakMetadata").hookConstructor(HookStage.AFTER) { param -> findClass("com.snapchat.client.messaging.StreakMetadata").hookConstructor(HookStage.AFTER) { param ->
param.thisObject<Any>().dataBuilder { param.thisObject<Any>().dataBuilder {
val currentTimeMillis = System.currentTimeMillis()
val expiration = get<Long>("mExpirationTimestampMs") ?: return@hookConstructor
set("mExpiredStreak", null) set("mExpiredStreak", null)
if (expiration < currentTimeMillis) {
set("mExpirationTimestampMs", currentTimeMillis + 60000L)
}
} }
} }
} }

View File

@ -26,6 +26,7 @@ class ConversationManager(
private val fetchMessage by lazy { findMethodByName("fetchMessage") } private val fetchMessage by lazy { findMethodByName("fetchMessage") }
private val clearConversation by lazy { findMethodByName("clearConversation") } private val clearConversation by lazy { findMethodByName("clearConversation") }
private val getOneOnOneConversationIds by lazy { findMethodByName("getOneOnOneConversationIds") } private val getOneOnOneConversationIds by lazy { findMethodByName("getOneOnOneConversationIds") }
private val dismissStreakRestore by lazy { findMethodByName("dismissStreakRestore") }
private fun getCallbackClass(name: String): Class<*> { private fun getCallbackClass(name: String): Class<*> {
@ -175,4 +176,11 @@ class ConversationManager(
} }
fun isEditMessageSupported() = instanceNonNull()::class.java.methods.any { it.name == "editMessage" } fun isEditMessageSupported() = instanceNonNull()::class.java.methods.any { it.name == "editMessage" }
fun dismissStreakRestore(conversationId: String, onSuccess: () -> Unit, onError: (error: String) -> Unit) {
val callback = CallbackBuilder(getCallbackClass("Callback"))
.override("onSuccess") { onSuccess() }
.override("onError") { onError(it.arg<Any>(0).toString()) }.build()
dismissStreakRestore.invoke(instanceNonNull(), conversationId.toSnapUUID().instanceNonNull(), callback)
}
} }