summaryrefslogblamecommitdiff
path: root/src/commands/download.rs
blob: e9a96b541a2be85417068a0d9098069ff4276e8c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
 

                             
                               
            
                                                    





                                                                                                    
 
                                                                                                     


                                  
                                   
                                                                                
                                                                                 
                                                                                    
                   

                                           


                                                                                    
 


                                                           
 


                                            
 
                                                                    
 
                                                    
                                                  
                    


                                                             



                                                                                        

             



                                          

                                    



                                                                           

                    

                    


                                                              
 

                                   
                               
                                                                                
                                                                 
                        
                                                                                 

                  


         
          
 

use indicatif::MultiProgress;

use crate::{config::Cfg, List};
use crate::{
    db::userlist_get_all_current_versions_with_mods,
    error::{ErrorType, MLError, MLE},
    files::{
        clean_list_dir, delete_version, disable_version, download_versions, get_downloaded_versions,
    },
    modrinth::get_raw_versions,
};

pub async fn download(config: &Cfg, liststack: Vec<List>, clean: bool, delete_old: bool) -> MLE<()> {

    let mp = MultiProgress::new();

    for current_list in liststack {
        println!("Downloading current versions of mods in {}", current_list.id);
        let downloaded_versions = get_downloaded_versions(current_list.clone())?;
        let current_version_ids = match userlist_get_all_current_versions_with_mods(
            config,
            String::from(&current_list.id),
        ) {
            Ok(i) => Ok(i),
            Err(e) => Err(MLError::new(ErrorType::DBError, e.to_string().as_str())),
        }?;

        let mut to_download: Vec<String> = 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() || clean {
                to_download.push(current_version);
            } else {
                let downloaded_version = current_download
                    .ok_or("SOMETHING_HAS_REALLY_GONE_WRONG")
                    .unwrap();
                if &current_version != downloaded_version {
                    to_disable.push((mod_id.clone(), String::from(downloaded_version)));
                    to_download.push(current_version);
                }
            }
        }

        if clean {
            clean_list_dir(&current_list)?
        };

        if !to_download.is_empty() {
            download_versions(
                current_list.clone(),
                config.clone(),
                get_raw_versions(&config.apis.modrinth, to_download).await,
                &mp,
                None
            )
            .await?;
        } else {
            println!("There are no new versions to download");
        }

        if !to_disable.is_empty() {
            for ver in to_disable {
                if delete_old {
                    // println!("Deleting version {} for mod {}", ver.1, ver.0);
                    delete_version(current_list.clone(), ver.1)?;
                } else {
                    disable_version(config, current_list.clone(), ver.1, ver.0)?;
                };
            }
        }
    }

    Ok(())
}