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:
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/features/impl/global/SnapchatPlus.kt | 16++++++++++------
Mmapper/src/main/kotlin/me/rhunk/snapenhance/mapper/impl/PlusSubscriptionMapper.kt | 28++++++++++++++++++----------
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 } } }