fix(mapper): plus subscription mapper

This commit is contained in:
rhunk
2024-04-02 21:42:31 +02:00
parent 553664771d
commit f631989104
2 changed files with 28 additions and 16 deletions

View File

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

View File

@@ -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
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) }
}
if (isPlusSubscriptionInfoClass == true) {
classReference.set(clazz.getClassName())
return@mapper
}
return@mapper
}
}
}