commit f6319891044a210308f248655d1b62bd8213882b
parent 553664771d64cf519420687200677707e62947ad
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Tue, 2 Apr 2024 21:42:31 +0200
fix(mapper): plus subscription mapper
Diffstat:
2 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/global/SnapchatPlus.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/global/SnapchatPlus.kt
@@ -5,6 +5,8 @@ import me.rhunk.snapenhance.core.features.FeatureLoadParams
import me.rhunk.snapenhance.core.util.hook.HookStage
import me.rhunk.snapenhance.core.util.hook.hook
import me.rhunk.snapenhance.core.util.hook.hookConstructor
+import me.rhunk.snapenhance.core.util.ktx.getObjectField
+import me.rhunk.snapenhance.core.util.ktx.setObjectField
import me.rhunk.snapenhance.mapper.impl.PlusSubscriptionMapper
class SnapchatPlus: Feature("SnapchatPlus", loadParams = FeatureLoadParams.INIT_SYNC) {
@@ -15,15 +17,17 @@ class SnapchatPlus: Feature("SnapchatPlus", loadParams = FeatureLoadParams.INIT_
if (!context.config.global.snapchatPlus.get()) return
context.mappings.useMapper(PlusSubscriptionMapper::class) {
- classReference.get()?.hookConstructor(HookStage.BEFORE) { param ->
- if (param.arg<Int>(0) == 2) return@hookConstructor
+ classReference.get()?.hookConstructor(HookStage.AFTER) { param ->
+ val instance = param.thisObject<Any>()
+ val tier = instance.getObjectField(tierField.getAsString()!!)
+ if (tier == 2) return@hookConstructor
//subscription tier
- param.setArg(0, 2)
+ instance.setObjectField(tierField.getAsString()!!, 2)
//subscription status
- param.setArg(1, 2)
+ instance.setObjectField(statusField.getAsString()!!, 2)
- param.setArg(2, originalSubscriptionTime)
- param.setArg(3, expirationTimeMillis)
+ instance.setObjectField(originalSubscriptionTimeMillisField.getAsString()!!, originalSubscriptionTime)
+ instance.setObjectField(expirationTimeMillisField.getAsString()!!, expirationTimeMillis)
}
}
diff --git a/mapper/src/main/kotlin/me/rhunk/snapenhance/mapper/impl/PlusSubscriptionMapper.kt b/mapper/src/main/kotlin/me/rhunk/snapenhance/mapper/impl/PlusSubscriptionMapper.kt
@@ -3,29 +3,37 @@ package me.rhunk.snapenhance.mapper.impl
import me.rhunk.snapenhance.mapper.AbstractClassMapper
import me.rhunk.snapenhance.mapper.ext.findConstString
import me.rhunk.snapenhance.mapper.ext.getClassName
+import me.rhunk.snapenhance.mapper.ext.searchNextFieldReference
class PlusSubscriptionMapper : AbstractClassMapper("PlusSubscription"){
val classReference = classReference("class")
+ val tierField = string("tierField")
+ val statusField = string("statusField")
+ val originalSubscriptionTimeMillisField = string("originalSubscriptionTimeMillisField")
+ val expirationTimeMillisField = string("expirationTimeMillisField")
init {
mapper {
for (clazz in classes) {
if (clazz.directMethods.filter { it.name == "<init>" }.none {
- it.parameterTypes.size > 3 &&
- it.parameterTypes[0] == "I" &&
- it.parameterTypes[1] == "I" &&
- it.parameterTypes[2] == "J" &&
- it.parameterTypes[3] == "J"
+ it.parameterTypes.size > 3
}) continue
- val isPlusSubscriptionInfoClass = clazz.virtualMethods.firstOrNull { it.name == "toString" }?.implementation?.let {
+ val toStringMethod = clazz.virtualMethods.firstOrNull { it.name == "toString" }?.implementation ?: continue
+ if (!toStringMethod.let {
it.findConstString("SubscriptionInfo", contains = true) && it.findConstString("expirationTimeMillis", contains = true)
- }
+ }) continue
- if (isPlusSubscriptionInfoClass == true) {
- classReference.set(clazz.getClassName())
- return@mapper
+ classReference.set(clazz.getClassName())
+
+ toStringMethod.apply {
+ searchNextFieldReference("tier", contains = true)?.let { tierField.set(it.name) }
+ searchNextFieldReference("status", contains = true)?.let { statusField.set(it.name) }
+ searchNextFieldReference("original", contains = true)?.let { originalSubscriptionTimeMillisField.set(it.name) }
+ searchNextFieldReference("expirationTimeMillis", contains = true)?.let { expirationTimeMillisField.set(it.name) }
}
+
+ return@mapper
}
}
}