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 index ae1be918..d9104f0b 100644 --- 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().setObjectField("mIsRestorable", false) + findClass("com.snapchat.client.messaging.StreakMetadata").hookConstructor(HookStage.AFTER) { param -> + param.thisObject().dataBuilder { + val currentTimeMillis = System.currentTimeMillis() + val expiration = get("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 index ec174d2d..865c8b7b 100644 --- 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) = fields.forEach { set(it.first, it.second) } + @Suppress("UNCHECKED_CAST") + fun 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