feat(scripting): config interface

- change onLaunched to onDispose
- refactor JSModule extras
This commit is contained in:
rhunk
2023-10-14 12:14:30 +02:00
parent baf8727912
commit b92589fa07
15 changed files with 303 additions and 71 deletions

View File

@ -1,12 +1,11 @@
package me.rhunk.snapenhance.core.scripting
import android.content.Context
import me.rhunk.snapenhance.bridge.scripting.IPCListener
import me.rhunk.snapenhance.bridge.scripting.IScripting
import me.rhunk.snapenhance.common.logger.AbstractLogger
import me.rhunk.snapenhance.common.scripting.IPCInterface
import me.rhunk.snapenhance.common.scripting.Listener
import me.rhunk.snapenhance.common.scripting.ScriptRuntime
import me.rhunk.snapenhance.core.scripting.impl.CoreIPC
import me.rhunk.snapenhance.core.scripting.impl.CoreScriptConfig
import me.rhunk.snapenhance.core.scripting.impl.ScriptHooker
class CoreScriptRuntime(
@ -18,38 +17,19 @@ class CoreScriptRuntime(
fun connect(scriptingInterface: IScripting) {
scriptingInterface.apply {
buildModuleObject = { module ->
putConst("ipc", this, object: IPCInterface() {
override fun onBroadcast(channel: String, eventName: String, listener: Listener) {
registerIPCListener(channel, eventName, object: IPCListener.Stub() {
override fun onMessage(args: Array<out String?>) {
listener(args)
}
})
}
override fun on(eventName: String, listener: Listener) {
onBroadcast(module.moduleInfo.name, eventName, listener)
}
override fun emit(eventName: String, vararg args: String?) {
broadcast(module.moduleInfo.name, eventName, *args)
}
override fun broadcast(channel: String, eventName: String, vararg args: String?) {
sendIPCMessage(channel, eventName, args)
}
})
putConst("hooker", this, ScriptHooker(module.moduleInfo, logger, androidContext.classLoader).also {
module.extras["ipc"] = CoreIPC(this@apply, module.moduleInfo)
module.extras["hooker"] = ScriptHooker(module.moduleInfo, logger, androidContext.classLoader).also {
scriptHookers.add(it)
})
}
module.extras["config"] = CoreScriptConfig(this@apply, module.moduleInfo)
}
}
scriptingInterface.enabledScripts.forEach { path ->
runCatching {
load(path, scriptingInterface.getScriptContent(path))
}.onFailure {
logger.error("Failed to load script $path", it)
enabledScripts.forEach { path ->
runCatching {
load(path, scriptingInterface.getScriptContent(path))
}.onFailure {
logger.error("Failed to load script $path", it)
}
}
}
}

View File

@ -0,0 +1,32 @@
package me.rhunk.snapenhance.core.scripting.impl
import me.rhunk.snapenhance.bridge.scripting.IPCListener
import me.rhunk.snapenhance.bridge.scripting.IScripting
import me.rhunk.snapenhance.common.scripting.impl.IPCInterface
import me.rhunk.snapenhance.common.scripting.impl.Listener
import me.rhunk.snapenhance.common.scripting.type.ModuleInfo
class CoreIPC(
private val scripting: IScripting,
private val moduleInfo: ModuleInfo
) : IPCInterface() {
override fun onBroadcast(channel: String, eventName: String, listener: Listener) {
scripting.registerIPCListener(channel, eventName, object: IPCListener.Stub() {
override fun onMessage(args: Array<out String?>) {
listener(args)
}
})
}
override fun on(eventName: String, listener: Listener) {
onBroadcast(moduleInfo.name, eventName, listener)
}
override fun emit(eventName: String, vararg args: String?) {
broadcast(moduleInfo.name, eventName, *args)
}
override fun broadcast(channel: String, eventName: String, vararg args: String?) {
scripting.sendIPCMessage(channel, eventName, args)
}
}

View File

@ -0,0 +1,31 @@
package me.rhunk.snapenhance.core.scripting.impl
import me.rhunk.snapenhance.bridge.scripting.IScripting
import me.rhunk.snapenhance.common.scripting.impl.ConfigInterface
import me.rhunk.snapenhance.common.scripting.impl.ConfigTransactionType
import me.rhunk.snapenhance.common.scripting.type.ModuleInfo
class CoreScriptConfig(
private val scripting: IScripting,
private val moduleInfo: ModuleInfo
): ConfigInterface() {
override fun get(key: String, defaultValue: Any?): String? {
return scripting.configTransaction(moduleInfo.name, ConfigTransactionType.GET.key, key, defaultValue.toString(), false)
}
override fun set(key: String, value: Any?, save: Boolean) {
scripting.configTransaction(moduleInfo.name, ConfigTransactionType.SET.key, key, value.toString(), save)
}
override fun save() {
scripting.configTransaction(moduleInfo.name, ConfigTransactionType.SAVE.key, null, null, false)
}
override fun load() {
scripting.configTransaction(moduleInfo.name, ConfigTransactionType.LOAD.key, null, null, false)
}
override fun delete() {
scripting.configTransaction(moduleInfo.name, ConfigTransactionType.DELETE.key, null, null, false)
}
}