Added the ability to update mods
This commit is contained in:
parent
846b3d0edf
commit
dac3092502
@ -24,4 +24,10 @@ pub enum Commands {
|
|||||||
|
|
||||||
/// Remove a mod from the modpack
|
/// Remove a mod from the modpack
|
||||||
Remove,
|
Remove,
|
||||||
|
|
||||||
|
/// Update a mod or all mods
|
||||||
|
Update,
|
||||||
|
|
||||||
|
/// Migrate to a other Minecraft version
|
||||||
|
Migrate,
|
||||||
}
|
}
|
||||||
|
@ -2,3 +2,4 @@ pub mod add;
|
|||||||
pub mod init;
|
pub mod init;
|
||||||
pub mod list;
|
pub mod list;
|
||||||
pub mod remove;
|
pub mod remove;
|
||||||
|
pub mod update;
|
||||||
|
67
src/commands/update.rs
Normal file
67
src/commands/update.rs
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
use crate::{
|
||||||
|
config,
|
||||||
|
modrinth::{project::get_project_versions, versions::ProjectVersion},
|
||||||
|
pack::{Mod, Modpack},
|
||||||
|
};
|
||||||
|
use colored::*;
|
||||||
|
use inquire::MultiSelect;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
struct Diff {
|
||||||
|
r#mod: Mod,
|
||||||
|
new_version: ProjectVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Diff {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"{} {} -> {}",
|
||||||
|
self.r#mod.title.bold(),
|
||||||
|
self.r#mod.version.as_ref().unwrap().version_number.red(),
|
||||||
|
self.new_version.version_number.green()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn update() {
|
||||||
|
let mut config = config::Config::get().unwrap();
|
||||||
|
let modpack = Modpack::from_config(&config).await.unwrap();
|
||||||
|
|
||||||
|
let mut diffs: Vec<Diff> = vec![];
|
||||||
|
|
||||||
|
// Find the newest compatible version of the mod
|
||||||
|
for (project_id, r#mod) in modpack.mods {
|
||||||
|
let project_versions = get_project_versions(&project_id, &config.game_version)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let new_version = project_versions.get(0).unwrap();
|
||||||
|
|
||||||
|
if r#mod.version.as_ref().unwrap().version_number == new_version.version_number {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
diffs.push(Diff {
|
||||||
|
r#mod,
|
||||||
|
new_version: new_version.clone(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if diffs.len() == 0 {
|
||||||
|
return println!("There are no mods left to update :)");
|
||||||
|
}
|
||||||
|
|
||||||
|
let updated_diffs = MultiSelect::new("Select mods to update", diffs)
|
||||||
|
.prompt()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Bumb the new versions to the config
|
||||||
|
for diff in updated_diffs {
|
||||||
|
config
|
||||||
|
.projects
|
||||||
|
.insert(diff.r#mod.project_id, diff.new_version.id.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
config.save().unwrap();
|
||||||
|
}
|
@ -23,6 +23,9 @@ async fn main() {
|
|||||||
cli::Commands::List => {
|
cli::Commands::List => {
|
||||||
commands::list::list().await;
|
commands::list::list().await;
|
||||||
}
|
}
|
||||||
|
cli::Commands::Update => {
|
||||||
|
commands::update::update().await;
|
||||||
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ use serde::Deserialize;
|
|||||||
|
|
||||||
type Response = Vec<ProjectVersion>;
|
type Response = Vec<ProjectVersion>;
|
||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize, Clone)]
|
||||||
pub struct ProjectVersion {
|
pub struct ProjectVersion {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub version_number: String,
|
pub version_number: String,
|
||||||
|
Loading…
Reference in New Issue
Block a user