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:
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