diff options
| author | Cara Salter <cara@devcara.com> | 2023-03-26 12:05:27 -0400 | 
|---|---|---|
| committer | Cara Salter <cara@devcara.com> | 2023-03-26 12:05:27 -0400 | 
| commit | b59b5a9bcbc64902366f6da21c84cb20be61efb8 (patch) | |
| tree | ae5dcf03ebfd4b9f7ff26e54195b4d31317b0597 /src/util.rs | |
| download | modpackman-ng-master.tar.gz modpackman-ng-master.zip | |
Diffstat (limited to 'src/util.rs')
| -rw-r--r-- | src/util.rs | 137 | 
1 files changed, 137 insertions, 0 deletions
| diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..4e9f5a0 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,137 @@ +use std::fs; + +use serde::{Deserialize, Serialize}; +use thirtyfour::{DesiredCapabilities, WebDriver, By}; +use toml::Table; +use tracing::{info, debug}; + +use crate::errors::CliError; + + +#[derive(Deserialize, Serialize)] +pub struct PackConfig { +    pub pack: Pack, +    pub mods: Table, +} + +#[derive(Deserialize, Serialize)] +pub struct Pack { +    pub name: String, +    pub pack_base_url: String, +    pub forge_url: String, +    pub game_version: String, +    pub java_args: String, +} + +#[derive(Deserialize, Serialize)] +pub struct PackLock { +    pub global: LockGlobal, +    pub mod_versions: Table, +} + +#[derive(Deserialize, Serialize)] +pub struct LockGlobal { +    pub pack_version: u16, +} + +pub fn read_pack_config() -> Result<PackConfig, CliError> { +   let contents = fs::read_to_string("./pack.toml")?;  + +   let res: PackConfig = toml::from_str(&contents)?; + +   Ok(res) +} + +pub fn read_pack_lock() -> Result<PackLock, CliError> { +   let contents = fs::read_to_string("./pack.lock")?;  + +   let res = toml::from_str(&contents)?; + +   Ok(res) +} + +pub async fn find_updated_urls(urls: toml::map::Values<'_>, game_version: String) -> Result<Vec<String>, CliError> { +    let res: Vec<String> = Vec::new(); +    debug!("Attempting to find updated URLs"); +    debug!("Attempting to open webdriver"); +    let caps = DesiredCapabilities::firefox(); +    let driver = WebDriver::new("http://localhost:9515", caps).await?; +    driver.close_window().await?; +    debug!("Closed test window"); + +    for url in urls { +        find_url(url.to_string(), &game_version).await?; +    } + +    Ok(res) +} + +async fn find_url(homepage_url: String, game_version: &String) -> Result<String, CliError> { +    if homepage_url.contains("curseforge") { +        let caps = DesiredCapabilities::firefox(); +        let driver = WebDriver::new("http://localhost:9515", caps).await?; + +        find_cdn(&driver, homepage_url, game_version).await?; +        driver.close_window().await?; +    } else { + +    } + +    Ok(String::new()) +} + + +#[derive(Debug)] +struct RowInfo { +    pub release_type: String, +    pub filename: String, +    pub cdn_id: String, +    pub game_version: (u16, u16, u16) +} + +/** + * Ugh... + */ +async fn find_cdn(driver: &WebDriver, homepage_url: String, game_version: &String) -> Result<String, CliError> { +    let mut page_index = 0; +    let best_row: RowInfo; +    loop { +        let mut url = homepage_url.clone(); +        url.push_str(&format!("/files/all?page={}", page_index)); +        driver.goto(&url).await?; + +        let mod_vers = driver.find(By::ClassName("listing")).await?.find_all(By::XPath("tbody/tr")).await?; + +        let mut rows: Vec<RowInfo> = Vec::new(); +        for entry in mod_vers { +            let entry_cells = entry.find_all(By::Tag("td")).await?; +            let release_type = entry_cells[0].text().await?; +            let tmp0 = &entry_cells[1].find_all(By::Tag("a")).await?[0].text().await?; +            let initial_filename = urlencoding::encode(tmp0); +  +            let tmp = entry_cells[4].find(By::ClassName("mr-2")).await?.text().await?; +            let tmp2: Vec<&str> = tmp.split(".").collect(); +            let version = (tmp2[0].clone().parse::<u16>()?, tmp2[1].clone().parse::<u16>()?, tmp2[2].parse::<u16>()?); + +            let tmp3 = entry_cells[1].find(By::Tag("a")).await?.prop("href").await?.unwrap(); +            let tmp4: Vec<&str> = tmp3.split("/").collect(); +            let cdn_id = *tmp4.last().unwrap(); + +            if !(initial_filename.to_lowercase().contains("fabric")) || (initial_filename.to_lowercase().contains("forge")) { +                rows.push(RowInfo { +                    release_type, +                    cdn_id: cdn_id.to_string(), +                    game_version: version, +                    filename: initial_filename.to_string() +                }) +            } +        } +        rows.sort_by_key(|k| k.game_version);  + +        let tuple_game_version_tmp: Vec<&str> = game_version.split(".").collect(); +        let tuple_game_version = (tuple_game_version_tmp[0].parse::<u16>()?, tuple_game_version_tmp[1].parse::<u16>()?, tuple_game_version_tmp[2].parse::<u16>()?); +        let best_rows: Vec<&RowInfo> = rows.iter().filter(|x| x.game_version > tuple_game_version).collect(); + +        info!("{:?}", best_rows); +    } +}
\ No newline at end of file | 
