commit 95558ea1a19e5abba278d9018f80530e721bc8b5
parent 43fce4e665d6559e57653183e34b593e512b80a9
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Sun, 28 May 2023 15:56:27 +0200
fix(scplus): update mappings
Diffstat:
2 files changed, 24 insertions(+), 43 deletions(-)
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/extras/SnapchatPlus.kt b/app/src/main/kotlin/me/rhunk/snapenhance/features/impl/extras/SnapchatPlus.kt
@@ -7,28 +7,23 @@ import me.rhunk.snapenhance.hook.HookStage
import me.rhunk.snapenhance.hook.Hooker
class SnapchatPlus: Feature("SnapchatPlus", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
+ private val originalSubscriptionTime = (System.currentTimeMillis() - 7776000000L)
+ private val expirationTimeMillis = (System.currentTimeMillis() + 15552000000L)
+
override fun asyncOnActivityCreate() {
if (!context.config.bool(ConfigProperty.SNAPCHAT_PLUS)) return
- val subscriptionInfoMembers = context.mappings.getMappedMap("SubscriptionInfoClassMembers")
-
- Hooker.hookConstructor(context.mappings.getMappedClass("SubscriptionInfoClass"), HookStage.AFTER) { param ->
- val getField = { key: String -> param.thisObject<Any>().javaClass.declaredFields.first {it.name == (subscriptionInfoMembers[key] as String)}.also { it.isAccessible = true }}
-
- val subscriptionStatusField = getField("status")
- val isSubscribedField = getField("isSubscribed")
- val startTimeMsField = getField("startTimeMs")
- val expireTimeMsField = getField("expireTimeMs")
+ val subscriptionInfoClass = context.mappings.getMappedClass("SubscriptionInfoClass")
- //check if the user is already premium
- if ((subscriptionStatusField[param.thisObject()] as Double).toInt() == 2) {
- return@hookConstructor
- }
+ Hooker.hookConstructor(subscriptionInfoClass, HookStage.BEFORE) { param ->
+ if (param.arg<Int>(0) == 2) return@hookConstructor
+ //subscription tier
+ param.setArg(0, 2)
+ //subscription status
+ param.setArg(1, 2)
- isSubscribedField.set(param.thisObject(), true)
- startTimeMsField.set(param.thisObject(), (System.currentTimeMillis() - 7776000000L).toDouble())
- expireTimeMsField.set(param.thisObject(), (System.currentTimeMillis() + 15552000000L).toDouble())
- subscriptionStatusField.set(param.thisObject(), 2.toDouble())
+ param.setArg(2, originalSubscriptionTime)
+ param.setArg(3, expirationTimeMillis)
}
}
}
\ No newline at end of file
diff --git a/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/PlusSubscriptionMapper.kt b/app/src/main/kotlin/me/rhunk/snapenhance/mapping/impl/PlusSubscriptionMapper.kt
@@ -1,41 +1,27 @@
package me.rhunk.snapenhance.mapping.impl
import me.rhunk.snapenhance.mapping.Mapper
-import java.lang.reflect.Field
-import java.lang.reflect.Method
+import java.lang.reflect.Modifier
class PlusSubscriptionMapper : Mapper() {
- @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
override fun useClasses(
classLoader: ClassLoader,
classes: List<Class<*>>,
mappings: MutableMap<String, Any>
) {
- //find a method that contains annotations with isSubscribed
- val loadSubscriptionMethod = context.classCache.composerLocalSubscriptionStore.declaredMethods.first { method: Method ->
- val returnType = method.returnType
- returnType.declaredFields.any { field: Field ->
- field.declaredAnnotations.any { annotation: Annotation ->
- annotation.toString().contains("isSubscribed")
- }
- }
- }
- /*
- //get the first param of the method which is the PlusSubscriptionState class
- val plusSubscriptionStateClass = loadSubscriptionMethod.parameterTypes[0]
- //get the first param of the constructor of PlusSubscriptionState which is the SubscriptionInfo class
- val subscriptionInfoClass = plusSubscriptionStateClass.constructors[0].parameterTypes[0]
- */
- mappings["SubscriptionInfoClass"] = loadSubscriptionMethod.returnType.name
+ for (clazz in classes) {
+ clazz.fields.firstOrNull {
+ it.type == clazz &&
+ Modifier.isFinal(it.modifiers) &&
+ Modifier.isStatic(it.modifiers) &&
+ runCatching {
+ it?.get(null).toString().startsWith("PlusSubscriptionState")
+ }.getOrDefault(false)
+ } ?: continue
- val members = mutableMapOf<String, Any>()
- loadSubscriptionMethod.returnType.declaredFields.forEach { field ->
- val serializedNameAnnotation = (field.declaredAnnotations.first() as java.lang.annotation.Annotation)
- val propertyName = serializedNameAnnotation.annotationType().getDeclaredMethod("name").also { it.isAccessible = true }.invoke(serializedNameAnnotation) as String
- members[propertyName] = field.name
+ mappings["SubscriptionInfoClass"] = clazz.constructors[0]!!.parameterTypes[0]!!.name
+ return
}
-
- mappings["SubscriptionInfoClassMembers"] = members
}
}
\ No newline at end of file