use crate::{files::{get_downloaded_versions, download_versions, delete_version, disable_version}, db::{userlist_get_all_current_versions_with_mods, lists_get_all_ids, lists_get}, modrinth::get_raw_versions}; use crate::{List, get_current_list, config::Cfg, input::Input}; pub async fn download(config: Cfg, input: Input) -> Result<(), Box> { let mut liststack: Vec = vec![]; if input.all_lists { let list_ids = lists_get_all_ids(config.clone())?; for id in list_ids { liststack.push(lists_get(config.clone(), id)?); } } else { let current = get_current_list(config.clone())?; println!("Downloading current versions of mods in {}", current.id); liststack.push(current) } for current_list in liststack { let downloaded_versions = get_downloaded_versions(current_list.clone())?; println!("To download: {:#?}", downloaded_versions); let current_version_ids = userlist_get_all_current_versions_with_mods(config.clone(), String::from(¤t_list.id))?; let mut to_download: Vec = vec![]; //(mod_id, version_id) let mut to_disable: Vec<(String, String)> = vec![]; for version in current_version_ids { let mod_id = version.0; let current_version = version.1; let current_download = downloaded_versions.get(&mod_id); if current_download.is_none() || input.clean { to_download.push(current_version); } else { let downloaded_version = current_download.ok_or("SOMETHING_HAS_REALLY_GONE_WRONG")?; if ¤t_version != downloaded_version { to_disable.push((mod_id.clone(), String::from(downloaded_version))); to_download.push(current_version); } } } if input.clean { let dl_path = ¤t_list.download_folder; println!("Cleaning {}", dl_path); for entry in std::fs::read_dir(dl_path)? { let entry = entry?; std::fs::remove_file(entry.path())?; } } if !to_download.is_empty() { download_versions(current_list.clone(), get_raw_versions(String::from(&config.apis.modrinth), to_download).await).await?; } else { println!("There are no new versions to download"); } if !to_disable.is_empty() { for ver in to_disable { if input.delete_old { println!("Deleting version {} for mod {}", ver.1, ver.0); delete_version(current_list.clone(), ver.1)?; } else { disable_version(config.clone(), current_list.clone(), ver.1, ver.0)?; }; } } } Ok(()) }