From e51058a7e91e8ef86dc6eede9203448f393cd26f Mon Sep 17 00:00:00 2001 From: Ethan O'Brien Date: Fri, 17 Jul 2026 10:25:12 -0500 Subject: [PATCH] Add routing for 3d costume deck thingy idk --- Cargo.toml | 1 + build.rs | 4 +++ src/lib.rs | 2 ++ src/router/global.rs | 15 ++++++++-- src/router/live.rs | 68 ++++++++++++++++++++++++++++++++++++++++++ src/static_handlers.rs | 2 +- 6 files changed, 88 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9f47b50..687a551 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ name = "ew" version = "1.1.0" edition = "2024" +exclude = ["assets", "*.db"] [dependencies] actix-web = "4.13" diff --git a/build.rs b/build.rs index cc690ec..b42eab3 100644 --- a/build.rs +++ b/build.rs @@ -1,4 +1,8 @@ fn main() { + println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-changed=src"); + println!("cargo:rerun-if-changed=webui/index.html"); + let target = std::env::var("TARGET").unwrap(); if target == "aarch64-linux-android" { println!("cargo:rerun-if-changed=build.rs"); diff --git a/src/lib.rs b/src/lib.rs index 4343a07..1c07850 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -17,6 +17,7 @@ mod android; mod ios; use actix_web::{rt, App, HttpServer, web, dev::Service}; +//use actix_cors::Cors; use std::time::Duration; pub use options::get_args; use runtime::get_data_path; @@ -33,6 +34,7 @@ pub async fn run_server(in_thread: bool) -> std::io::Result<()> { } let rv = HttpServer::new(|| App::new() + //.wrap(Cors::permissive()) .wrap_fn(|req, srv| { println!("Request: {} {}", req.method(), req.path()); diff --git a/src/router/global.rs b/src/router/global.rs index 1436191..efc2e8b 100644 --- a/src/router/global.rs +++ b/src/router/global.rs @@ -17,9 +17,11 @@ struct AssetHashes { version_android: &'static str, version_ios: &'static str, version_windows: &'static str, + version_webgl: &'static str, android: &'static str, ios: &'static str, windows: &'static str, + webgl: &'static str, } static ASSET_TABLE: &[(&str, AssetHashes)] = &[ @@ -27,17 +29,21 @@ static ASSET_TABLE: &[(&str, AssetHashes)] = &[ version_android: "4c921d2443335e574a82e04ec9ea243c", version_ios: "4c921d2443335e574a82e04ec9ea243c", version_windows: "4c921d2443335e574a82e04ec9ea243c", + version_webgl: "4c921d2443335e574a82e04ec9ea243c", android: "67f8f261c16b3cca63e520a25aad6c1c", ios: "b8975be8300013a168d061d3fdcd4a16", - windows: "eb59fcba5ff6987eff1969dbd97eccde", + windows: "fcc15c3dc02250d49c4c492c3b9d58fc", + webgl: "e1ff7c74b20c8d216507972b6f24b9df", }), ("GL", AssetHashes { version_android: "5260ff15dff8ba0c00ad91400f515f55", - version_ios: "5260ff15dff8ba0c00ad91400f515f55", + version_ios: "5260ff15dff8ba0c00ad91400f515f55", version_windows: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + version_webgl: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", android: "d210b28037885f3ef56b8f8aa45ac95b", ios: "dd7175e4bcdab476f38c33c7f34b5e4d", windows: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + webgl: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }), ]; @@ -49,6 +55,7 @@ impl AssetHashes { ("JP", "Android") => (self.android, args.jp_android_asset_hash.as_str()), ("JP", "iOS") => (self.ios, args.jp_ios_asset_hash.as_str()), ("JP", "Windows") => (self.windows, args.windows_asset_hash.as_str()), + ("JP", "WebGL") => (self.webgl, ""), ("GL", "Android") => (self.android, args.en_android_asset_hash.as_str()), ("GL", "iOS") => (self.ios, args.en_ios_asset_hash.as_str()), _ => return None, @@ -69,6 +76,7 @@ impl AssetHashes { ("JP", "Android") => (self.version_android, ""), ("JP", "iOS") => (self.version_ios, ""), ("JP", "Windows") => (self.version_windows, args.windows_asset_version.as_str()), + ("JP", "WebGL") => (self.version_webgl, ""), ("GL", "Android") => (self.version_android, ""), ("GL", "iOS") => (self.version_ios, ""), ("GL", "Windows") => (self.version_windows, ""), @@ -108,7 +116,8 @@ pub fn parse_platform(header: &str) -> &str { "iphone" => "iOS", "windows" => "Windows", "windowsplayer" => "Windows", - _ => "Android", + "webglplayer" => "WebGL", + _ => panic!("Unknown platform: {header}"), } } diff --git a/src/router/live.rs b/src/router/live.rs index 6e57c5d..99eabd7 100644 --- a/src/router/live.rs +++ b/src/router/live.rs @@ -22,6 +22,74 @@ pub fn routes(cfg: &mut web::ServiceConfig) { .route("/continue", web::post().to(continuee)) .route("/reward", web::post().to(reward)) ); + cfg.route("/live3dDeck", web::post().to(live3d_deck)); + cfg.route("/live3dDeck/save", web::post().to(live3d_deck_save)); +} + +async fn live3d_deck(req: HttpRequest, body: String) -> impl Responder { + let key = global::get_login(req.headers(), &body); + let user = userdata::get_acc(&key); + let deck_list = if user["live_mv_deck_list"].is_array() { + user["live_mv_deck_list"].clone() + } else { + array![] + }; + global::api(&req, Some(object!{ + "deck_list": deck_list + })) +} + +async fn live3d_deck_save(req: HttpRequest, body: String) -> impl Responder { + let key = global::get_login(req.headers(), &body); + let body = jzon::parse(&encryption::decrypt_packet(&body).unwrap()).unwrap(); + let mut user = userdata::get_acc(&key); + + if !user["live_mv_deck_list"].is_array() { + user["live_mv_deck_list"] = array![]; + } + let music = body["master_music_id"].as_i64().unwrap_or(0); + let deck_type = body["deck_type"].as_i32().unwrap_or(0); + let clear = body["clear"].as_i32().unwrap_or(0) != 0; + + let mut index = None; + for (i, record) in user["live_mv_deck_list"].members().enumerate() { + if record["master_music_id"].as_i64().unwrap_or(-1) == music + && record["deck_type"].as_i32().unwrap_or(-1) == deck_type { + index = Some(i); + break; + } + } + + if clear { + if let Some(i) = index { + user["live_mv_deck_list"].array_remove(i); + } + } else { + let active = body["active"].as_i32().unwrap_or(0); + if active != 0 { + for record in user["live_mv_deck_list"].members_mut() { + if record["master_music_id"].as_i64().unwrap_or(-1) == music { + record["active"] = 0.into(); + } + } + } + let record = object!{ + "master_music_id": music, + "deck_type": deck_type, + "active": active, + "slot_list": body["slot_list"].clone() + }; + match index { + Some(i) => user["live_mv_deck_list"][i] = record, + None => { user["live_mv_deck_list"].push(record).unwrap(); } + } + } + + let deck_list = user["live_mv_deck_list"].clone(); + userdata::save_acc(&key, user); + global::api(&req, Some(object!{ + "deck_list": deck_list + })) } async fn retire(req: HttpRequest, body: String) -> impl Responder { diff --git a/src/static_handlers.rs b/src/static_handlers.rs index fea1da3..d74321f 100644 --- a/src/static_handlers.rs +++ b/src/static_handlers.rs @@ -71,7 +71,7 @@ fn platform_guard(ctx: &guard::GuardContext) -> bool { .split('/') .nth(1) .unwrap_or(""); - matches!(platform, "Android" | "StandaloneWindows64" | "iOS") + matches!(platform, "Android" | "StandaloneWindows64" | "StandaloneLinux64" | "WebGL" | "iOS") } pub fn routes(cfg: &mut web::ServiceConfig) {