mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-06-13 13:47:47 +02:00
feat(core/scripting): handle setArg primitive
- add toString for Wrapper objects
This commit is contained in:
@ -10,6 +10,7 @@ import org.mozilla.javascript.Function
|
|||||||
import org.mozilla.javascript.NativeJavaObject
|
import org.mozilla.javascript.NativeJavaObject
|
||||||
import org.mozilla.javascript.ScriptableObject
|
import org.mozilla.javascript.ScriptableObject
|
||||||
import org.mozilla.javascript.Undefined
|
import org.mozilla.javascript.Undefined
|
||||||
|
import org.mozilla.javascript.Wrapper
|
||||||
import java.lang.reflect.Modifier
|
import java.lang.reflect.Modifier
|
||||||
|
|
||||||
class JSModule(
|
class JSModule(
|
||||||
@ -88,7 +89,12 @@ class JSModule(
|
|||||||
}
|
}
|
||||||
|
|
||||||
moduleObject.putFunction("logInfo") { args ->
|
moduleObject.putFunction("logInfo") { args ->
|
||||||
scriptRuntime.logger.info(args?.joinToString(" ") ?: "")
|
scriptRuntime.logger.info(args?.joinToString(" ") {
|
||||||
|
when (it) {
|
||||||
|
is Wrapper -> it.unwrap().toString()
|
||||||
|
else -> it.toString()
|
||||||
|
}
|
||||||
|
} ?: "null")
|
||||||
Undefined.instance
|
Undefined.instance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,9 @@ import me.rhunk.snapenhance.hook.hookConstructor
|
|||||||
import me.rhunk.snapenhance.scripting.type.ModuleInfo
|
import me.rhunk.snapenhance.scripting.type.ModuleInfo
|
||||||
import org.mozilla.javascript.annotations.JSGetter
|
import org.mozilla.javascript.annotations.JSGetter
|
||||||
import org.mozilla.javascript.annotations.JSSetter
|
import org.mozilla.javascript.annotations.JSSetter
|
||||||
|
import java.lang.reflect.Constructor
|
||||||
import java.lang.reflect.Member
|
import java.lang.reflect.Member
|
||||||
|
import java.lang.reflect.Method
|
||||||
|
|
||||||
|
|
||||||
class ScriptHookCallback(
|
class ScriptHookCallback(
|
||||||
@ -28,14 +30,50 @@ class ScriptHookCallback(
|
|||||||
val args
|
val args
|
||||||
@JSGetter("args") get() = hookAdapter.args().toList()
|
@JSGetter("args") get() = hookAdapter.args().toList()
|
||||||
|
|
||||||
|
private val parameterTypes by lazy {
|
||||||
|
when (val member = hookAdapter.method()) {
|
||||||
|
is Method -> member.parameterTypes
|
||||||
|
is Constructor<*> -> member.parameterTypes
|
||||||
|
else -> emptyArray()
|
||||||
|
}.toList()
|
||||||
|
}
|
||||||
|
|
||||||
fun cancel() = hookAdapter.setResult(null)
|
fun cancel() = hookAdapter.setResult(null)
|
||||||
|
|
||||||
fun arg(index: Int) = hookAdapter.argNullable<Any>(index)
|
fun arg(index: Int) = hookAdapter.argNullable<Any>(index)
|
||||||
|
|
||||||
fun setArg(index: Int, any: Any) = hookAdapter.setArg(index, any)
|
fun setArg(index: Int, value: Any) {
|
||||||
|
val parameterType by lazy { parameterTypes[index] }
|
||||||
|
|
||||||
|
if (value is Number && parameterType.isPrimitive) {
|
||||||
|
hookAdapter.setArg(index, when (parameterType.name) {
|
||||||
|
"byte" -> value.toByte()
|
||||||
|
"short" -> value.toShort()
|
||||||
|
"int" -> value.toInt()
|
||||||
|
"long" -> value.toLong()
|
||||||
|
"float" -> value.toFloat()
|
||||||
|
"double" -> value.toDouble()
|
||||||
|
"boolean" -> value.toByte() != 0.toByte()
|
||||||
|
"char" -> value.toInt().toChar()
|
||||||
|
else -> value
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
hookAdapter.setArg(index, value)
|
||||||
|
}
|
||||||
|
|
||||||
fun invokeOriginal() = hookAdapter.invokeOriginal()
|
fun invokeOriginal() = hookAdapter.invokeOriginal()
|
||||||
|
|
||||||
fun invokeOriginal(args: Array<Any>) = hookAdapter.invokeOriginal(args)
|
fun invokeOriginal(args: Array<Any>) = hookAdapter.invokeOriginal(args)
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "ScriptHookCallback(\n" +
|
||||||
|
" thisObject=${ runCatching { thisObject.toString() }.getOrNull() },\n" +
|
||||||
|
" args=${ runCatching { args.toString() }.getOrNull() }\n" +
|
||||||
|
" result=${ runCatching { result.toString() }.getOrNull() },\n" +
|
||||||
|
")"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user