From d4a6a56a27a026be75fe278230883e0338020e30 Mon Sep 17 00:00:00 2001 From: Ethan O'Brien Date: Sun, 28 Jun 2026 19:15:24 -0500 Subject: [PATCH] Add ability to pass JSON args to backend --- src/android.rs | 19 +++++++++------- src/options.rs | 4 +++- src/runtime.rs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 9 deletions(-) diff --git a/src/android.rs b/src/android.rs index 70b6ac5..4d38d0e 100644 --- a/src/android.rs +++ b/src/android.rs @@ -1,6 +1,6 @@ use jni::JNIEnv; use jni::objects::{JClass}; -use jni::sys::{jstring, jboolean}; +use jni::sys::jstring; use std::thread; use std::sync::Once; use jni::objects::JString; @@ -43,14 +43,12 @@ fn android_init() { extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_startServer<'local>( mut env: JNIEnv<'local>, _class: JClass<'local>, - data_path: JString<'local>, - easter: jboolean + config: JString<'local>, ) -> jstring { android_init(); - crate::runtime::set_easter_mode(easter != 0); - let data_path: String = env.get_string(&data_path).unwrap().into(); - crate::runtime::update_data_path(&data_path); + let config: String = env.get_string(&config).unwrap().into(); + crate::runtime::apply_config_json(&config); let output = env.new_string(String::from("Azunyannnn~")).unwrap(); thread::spawn(|| { @@ -70,7 +68,12 @@ extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_stopServer<'lo #[unsafe(no_mangle)] -extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_setEasterMode<'local>(_env: JNIEnv<'local>, _class: JClass<'local>, easter: jboolean) { +extern "C" fn Java_one_ethanthesleepy_androidew_BackgroundService_updateConfig<'local>( + mut env: JNIEnv<'local>, + _class: JClass<'local>, + config: JString<'local>, +) { android_init(); - crate::runtime::set_easter_mode(easter != 0); + let config: String = env.get_string(&config).unwrap().into(); + crate::runtime::apply_config_json(&config); } diff --git a/src/options.rs b/src/options.rs index 8707e9d..eb3fe8c 100644 --- a/src/options.rs +++ b/src/options.rs @@ -76,5 +76,7 @@ pub struct Args { } pub fn get_args() -> Args { - Args::parse() + let mut args = Args::parse(); + crate::runtime::overlay_args(&mut args); + args } diff --git a/src/runtime.rs b/src/runtime.rs index 7495b39..3b2b474 100644 --- a/src/runtime.rs +++ b/src/runtime.rs @@ -11,6 +11,18 @@ lazy_static! { static ref MASTERDATA_WARNED: Mutex> = Mutex::new(HashSet::new()); static ref MOD_PATHS: RwLock> = RwLock::new(Vec::new()); static ref EASTER: RwLock = RwLock::new(false); + static ref HOST_CONFIG: RwLock = RwLock::new(HostConfig::default()); +} + +// This is used by an embedding app in lib mode +#[derive(Default, Clone)] +pub struct HostConfig { + pub assets_url: String, + pub npps4: String, + pub max_time: u64, + pub port: u16, + pub jp_android_asset_hash: String, + pub en_android_asset_hash: String, } pub fn set_running(running: bool) { @@ -116,3 +128,50 @@ pub fn read_mod_files(rel_path: &str) -> Vec<(String, Vec)> { } out } + +pub fn apply_config_json(json: &str) { + let parsed = match jzon::parse(json) { + Ok(p) => p, + Err(e) => { + println!("Ignoring invalid host config json: {}", e); + return; + } + }; + + if let Some(v) = parsed["dataPath"].as_str() { + if !v.is_empty() { + update_data_path(v); + } + } + set_easter_mode(parsed["easterMode"].as_bool().unwrap_or(false)); + + let s = |key: &str| parsed[key].as_str().unwrap_or("").to_string(); + let mut cfg = HOST_CONFIG.write().unwrap(); + cfg.assets_url = s("assetsUrl"); + cfg.npps4 = s("npps4"); + cfg.max_time = parsed["maxTime"].as_u64().unwrap_or(0); + cfg.port = parsed["port"].as_u64().unwrap_or(0) as u16; + cfg.jp_android_asset_hash = s("jpAndroidAssetHash"); + cfg.en_android_asset_hash = s("enAndroidAssetHash"); +} + +pub fn overlay_args(args: &mut crate::options::Args) { + let cfg = HOST_CONFIG.read().unwrap(); + macro_rules! overlay_str { + ($field:ident) => { + if !cfg.$field.is_empty() { + args.$field = cfg.$field.clone(); + } + }; + } + overlay_str!(assets_url); + overlay_str!(npps4); + if cfg.max_time != 0 { + args.max_time = cfg.max_time; + } + if cfg.port != 0 { + args.port = cfg.port; + } + overlay_str!(jp_android_asset_hash); + overlay_str!(en_android_asset_hash); +}