diff --git a/README.md b/README.md index 18fed85..1fcc428 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,2 @@ # Cache Mii Mii Render Caching Server that saves a .png and .tga render of a user's mii for use across SPFN's services - -Renderer Used: https://mii-server.cubexmine.dev/ diff --git a/src/main.rs b/src/main.rs index 6be6e01..236e47f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,9 +7,39 @@ use bytes::Bytes; static MII_RENDERER_URL: &str = "https://mii-renderer.bloxerhd.co.uk"; -async fn request_mii_render(client: &State, mii_data: &str, ext: &str) -> Result { +static EXPRESSIONS: [&str; 24] = [ + "normal", "normal_open_mouth", + "happy", "open_mouth", + "smile", "smile_open_mouth", + "anger", "anger_open_mouth", + "sorrow", "sorrow_open_mouth", + "surprise", "surprise_open_mouth", + "blink", "blink_open_mouth", + "like", "like_wink_left", "like_wink_right", + "wink_left", "wink_left_open_mouth", + "wink_right", "wink_right_open_mouth", + "frustrated", "surprised", "puzzled", +]; + +static EXTENSIONS: [&str; 2] = [ + "png", "tga" +]; + +async fn request_mii_render(client: &State, mii_data: &str, path: &str) -> Result { + let expression = path.splitn(2, ".").nth(0).unwrap_or("normal"); + let ext = path.splitn(2, ".").nth(1).unwrap_or(".png"); + let mii_data = urlencoding::encode(mii_data); - let req_str = format!("{MII_RENDERER_URL}/miis/image.{ext}?data={mii_data}"); + let expression = if expression == "main" { + "normal" + } else { + expression + }; + + if !EXPRESSIONS.contains(&expression) { return Err((Status::BadRequest, format!("{expression} is not a valid expression"))) }; + if !EXTENSIONS.contains(&ext) { return Err((Status::BadRequest, format!("{ext} is not a valid file extension"))) } + + let req_str = format!("{MII_RENDERER_URL}/miis/image.{ext}?data={mii_data}&expression={expression}"); let response = client.get(req_str) .send() @@ -45,8 +75,6 @@ async fn request_mii_render(client: &State, mii_data: &str, ext: &str) - #[rocket::get("//")] pub async fn mii_render(pid: i32, path: &str, client: &State) -> Result { - let ext = path.splitn(2, ".").nth(1).unwrap_or(".png"); - let mii_data = { let route = format!("https://account.spfn.net/api/v2/users/{pid}/mii"); let response = client.get(route) @@ -94,11 +122,11 @@ pub async fn mii_render(pid: i32, path: &str, client: &State) -> Result< Ok(hash) => { if hash == mii_data { // Cached images are correct if !img_path.exists() || !img_path.is_file() { // File type was not found - Request data - let img_data = request_mii_render(client, &mii_data, ext).await?; + let img_data = request_mii_render(client, &mii_data, path).await?; let _ = std::fs::write(&img_path, &img_data); } } else { // Cached images are outdated - Update data - let img_data = request_mii_render(client, &mii_data, ext).await?; + let img_data = request_mii_render(client, &mii_data, path).await?; let _ = std::fs::write(&img_path, &img_data); }; } @@ -106,14 +134,14 @@ pub async fn mii_render(pid: i32, path: &str, client: &State) -> Result< Err(_) => { // Data cannot be read - Request data let _ = std::fs::write(data_path, &mii_data); - let img_data = request_mii_render(client, &mii_data, ext).await?; + let img_data = request_mii_render(client, &mii_data, path).await?; let _ = std::fs::write(&img_path, &img_data); } } } else { // Data isn't saved - Request data let _ = std::fs::write(data_path, &mii_data); - let img_file = request_mii_render(client, &mii_data, ext).await?; + let img_file = request_mii_render(client, &mii_data, path).await?; let _ = std::fs::write(&img_path, &img_file); } } else { // Mii data was never cached - Request data @@ -121,7 +149,7 @@ pub async fn mii_render(pid: i32, path: &str, client: &State) -> Result< let _ = std::fs::write(data_path, &mii_data); - let img_data = request_mii_render(client, &mii_data, ext).await?; + let img_data = request_mii_render(client, &mii_data, path).await?; let _ = std::fs::write(&img_path, &img_data); };