fix: hide streak restore

This commit is contained in:
rhunk
2024-01-17 15:28:51 +01:00
parent 93490c323c
commit 8e36425a36
2 changed files with 20 additions and 6 deletions

View File

@ -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)
}
}
}
}
}

View File

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