|
1 | 1 | use std::{path::{Path, PathBuf}, sync::Arc}; |
2 | 2 |
|
3 | 3 | use bridge::{import::ImportFromOtherLauncherJob, modal_action::{ModalAction, ProgressTracker}}; |
4 | | -use schema::{instance::{InstanceConfiguration, InstanceMemoryConfiguration}, loader::Loader}; |
| 4 | +use schema::{curseforge::CurseforgeModpackManifestJson, instance::{InstanceConfiguration, InstanceMemoryConfiguration}, loader::Loader}; |
5 | 5 | use serde::Deserialize; |
6 | 6 |
|
7 | 7 | use crate::{BackendState, write_safe}; |
8 | 8 |
|
9 | 9 | #[derive(Debug, Deserialize)] |
10 | 10 | #[serde(rename_all = "camelCase")] |
11 | 11 | struct CurseforgeInstance { |
12 | | - manifest: CurseforgeManifest, |
| 12 | + manifest: CurseforgeModpackManifestJson, |
13 | 13 | is_memory_override: bool, |
14 | 14 | allocated_memory: u32, |
15 | 15 | // memory_allocated_type: u8, |
16 | 16 | } |
17 | 17 |
|
18 | | -#[derive(Debug, Deserialize)] |
19 | | -#[serde(rename_all = "camelCase")] |
20 | | -struct CurseforgeManifest { |
21 | | - minecraft: CurseforgeManifestMinecraft, |
22 | | -} |
23 | | - |
24 | | -#[derive(Debug, Deserialize)] |
25 | | -#[serde(rename_all = "camelCase")] |
26 | | -struct CurseforgeManifestMinecraft { |
27 | | - version: String, |
28 | | - mod_loaders: Vec<CurseforgeModLoader>, |
29 | | -} |
30 | | - |
31 | | -#[derive(Debug, Deserialize)] |
32 | | -#[serde(rename_all = "camelCase")] |
33 | | -struct CurseforgeModLoader { |
34 | | - id: String, |
35 | | - primary: bool, |
36 | | -} |
37 | | - |
38 | | - |
39 | 18 | fn try_load_from_curseforge(config_path: &Path) -> Option<InstanceConfiguration> { |
40 | 19 | let instance_cfg_bytes = std::fs::read(config_path).ok()?; |
41 | 20 | let instance_cfg = serde_json::from_slice::<CurseforgeInstance>(&instance_cfg_bytes).ok()?; |
42 | 21 |
|
43 | | - let loader_details = instance_cfg.manifest.minecraft.mod_loaders.iter().filter(|loader| loader.primary).nth(0)?; |
44 | | - let loader = Loader::from_name(&loader_details.id.split("-").next()?); |
45 | | - let mut configuration = InstanceConfiguration::new(instance_cfg.manifest.minecraft.version.into(), loader); |
| 22 | + let loader = instance_cfg.manifest.minecraft.get_loader().unwrap_or(Loader::Vanilla); |
| 23 | + let mut configuration = InstanceConfiguration::new(instance_cfg.manifest.minecraft.version?.into(), loader); |
46 | 24 | if instance_cfg.is_memory_override { |
47 | 25 | configuration.memory = Some(InstanceMemoryConfiguration { |
48 | 26 | enabled: true, |
@@ -126,13 +104,11 @@ pub fn import_instances_from_curseforge(backend: &BackendState, import_job: &Imp |
126 | 104 | _ = std::fs::create_dir_all(&to_import.pandora_path); |
127 | 105 | let target_dot_minecraft = to_import.pandora_path.join(".minecraft"); |
128 | 106 |
|
129 | | - let copy_options = fs_extra::dir::CopyOptions::default().copy_inside(true); |
130 | | - _ = fs_extra::dir::copy_with_progress(to_import.folder, &target_dot_minecraft, ©_options, |state| { |
131 | | - tracker.set_total(state.total_bytes as usize); |
132 | | - tracker.set_count(state.copied_bytes as usize); |
| 107 | + _ = std::fs::create_dir_all(&target_dot_minecraft); |
| 108 | + _ = crate::copy_content_recursive(&to_import.folder, &target_dot_minecraft, false, &|copied, total| { |
| 109 | + tracker.set_total(total as usize); |
| 110 | + tracker.set_count(copied as usize); |
133 | 111 | tracker.notify(); |
134 | | - |
135 | | - fs_extra::dir::TransitProcessResult::ContinueOrAbort |
136 | 112 | }); |
137 | 113 |
|
138 | 114 | // remove old configuration, rename icon path. |
|
0 commit comments