use chrono::Local; pub fn nintendo_base64_decode(encoded: &str) -> String { let standard_b64 = encoded .replace('.', "+") .replace('-', "/") .replace('*', "="); match base64::Engine::decode(&base64::engine::general_purpose::STANDARD, standard_b64) { Ok(bytes) => String::from_utf8_lossy(&bytes).into_owned(), Err(_) => String::new(), } } pub fn nintendo_base64_encode(decoded: &[u8]) -> String { let standard_b64 = base64::Engine::encode(&base64::engine::general_purpose::STANDARD, decoded); standard_b64 .replace('+', ".") .replace('/', "-") .replace('=', "*") } pub fn nasc_date_time() -> String { Local::now().format("%Y%m%d%H%M%S").to_string() } pub fn nasc_error(error_code: &str) -> String { let return_cd = if error_code == "null" { error_code.to_string() } else { nintendo_base64_encode(error_code.as_bytes()) }; format!( "retry={}&returncd={}&datetime={}", nintendo_base64_encode(b"1"), return_cd, nintendo_base64_encode(nasc_date_time().as_bytes()) ) }