fix(mapper): plus subscription mapper
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user