nso 0.1.2

An interface to the Nintendo Switch Online APIs
use regex::Regex;
use reqwest::blocking::Client;
use reqwest::header::{ACCEPT, COOKIE, DNT, REFERER, UPGRADE_INSECURE_REQUESTS};
fn main() {
    let find_script = Regex::new(r#"<script (?:defer(?:="?defer"?)? )?src="(/static/js/main\.[0-9a-fA-F]{8}\.js)">"#).unwrap();
    let client = Client::new();
    let page_text = client
        .get("https://api.lp1.av5ja.srv.nintendo.net")
        .header(UPGRADE_INSECURE_REQUESTS, "1")
        .header(ACCEPT, "*/*")
        .header(DNT, "1")
        .header("X-AppColorScheme", "DARK")
        .header("X-Requested-With", "com.nintendo.znca")
        .header("Sec-Fetch-Site", "none")
        .header("Sec-Fetch-Mode", "navigate")
        .header("Sec-Fetch-User", "?1")
        .header("Sec-Fetch-Dest", "document")
        .header(COOKIE, "_dnt=1")
        .send()
        .expect("Nintendo API request failed")
        .text()
        .expect("Failed to read response body");
    let script_url = format!(
        "https://api.lp1.av5ja.srv.nintendo.net{}",
        find_script
            .captures(&page_text)
            .expect(&page_text)
            .get(1)
            .expect("Regex capture missing")
            .as_str()
    );
    println!("{script_url}");
    let script = client
        .get(script_url)
        .header(ACCEPT, "*/*")
        .header("X-Requested-With", "com.nintendo.znca")
        .header("Sec-Fetch-Site", "same-origin")
        .header("Sec-Fetch-Mode", "no-cors")
        .header("Sec-Fetch-Dest", "script")
        .header(REFERER, "https://api.lp1.av5ja.srv.nintendo.net/")
        .send()
        .expect("Nintendo API request failed")
        .text()
        .expect("Failed to read response body");
    let revision_pattern = Regex::new(concat!(
        r"\b(?P<revision>[0-9a-f]{40})",
        r#"\b[\S]*?void 0[\S]*?"revision_info_not_set"\}"#,
        r"`,.*?=`(?P<version>\d+\.\d+\.\d+)-",
    ))
    .unwrap();
    let revision_match = revision_pattern
        .captures(&script)
        .expect("Failed to find revision info");
    let version = revision_match
        .name("version")
        .expect("Regex capture 'version' missing")
        .as_str();
    let revision = revision_match
        .name("revision")
        .expect("Regex capture 'revision' missing")
        .as_str();
    println!(
        "cargo:rustc-env=SPLATOON3_WEB_VIEW_VERSION={version}-{}",
        &revision[..8]
    );
}