commit 8e36425a369a0fd6d621c5f71d6b2e1fddf59e2b
parent 93490c323c7f39a0945f3aa1b325c0c76d484292
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Wed, 17 Jan 2024 15:28:51 +0100

fix: hide streak restore

Diffstat:
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/HideStreakRestore.kt | 17++++++++++++-----
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/util/DataClassBuilder.kt | 9++++++++-
2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/HideStreakRestore.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/ui/HideStreakRestore.kt @@ -2,16 +2,23 @@ package me.rhunk.snapenhance.core.features.impl.ui import me.rhunk.snapenhance.core.features.Feature import me.rhunk.snapenhance.core.features.FeatureLoadParams +import me.rhunk.snapenhance.core.util.dataBuilder import me.rhunk.snapenhance.core.util.hook.HookStage import me.rhunk.snapenhance.core.util.hook.hookConstructor -import me.rhunk.snapenhance.core.util.ktx.setObjectField -class HideStreakRestore : Feature("HideStreakRestore", loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC) { - override fun onActivityCreate() { +class HideStreakRestore : Feature("HideStreakRestore", loadParams = FeatureLoadParams.INIT_SYNC) { + override fun init() { if (!context.config.userInterface.hideStreakRestore.get()) return - findClass("com.snapchat.client.messaging.ExpiredStreakMetadata").hookConstructor(HookStage.AFTER) { param -> - param.thisObject<Any>().setObjectField("mIsRestorable", false) + findClass("com.snapchat.client.messaging.StreakMetadata").hookConstructor(HookStage.AFTER) { param -> + param.thisObject<Any>().dataBuilder { + val currentTimeMillis = System.currentTimeMillis() + val expiration = get<Long>("mExpirationTimestampMs") ?: return@hookConstructor + set("mExpiredStreak", null) + if (expiration < currentTimeMillis) { + set("mExpirationTimestampMs", currentTimeMillis + 60000L) + } + } } } } \ No newline at end of file diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/util/DataClassBuilder.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/util/DataClassBuilder.kt @@ -1,7 +1,7 @@ package me.rhunk.snapenhance.core.util -fun Any?.dataBuilder(dataClassBuilder: DataClassBuilder.() -> Unit): Any? { +inline fun Any?.dataBuilder(dataClassBuilder: DataClassBuilder.() -> Unit): Any? { return DataClassBuilder( when (this) { is Class<*> -> CallbackBuilder.createEmptyObject( @@ -44,6 +44,13 @@ class DataClassBuilder( fun set(vararg fields: Pair<String, Any?>) = fields.forEach { set(it.first, it.second) } + @Suppress("UNCHECKED_CAST") + fun <T> get(fieldName: String): T? { + val field = instance::class.java.declaredFields.firstOrNull { it.name == fieldName } ?: return null + field.isAccessible = true + return field.get(instance) as? T + } + fun from(fieldName: String, new: Boolean = false, callback: DataClassBuilder.() -> Unit) { val field = instance::class.java.declaredFields.firstOrNull { it.name == fieldName } ?: return field.isAccessible = true