Skip to content
This repository was archived by the owner on Sep 9, 2023. It is now read-only.

Commit 4d70c03

Browse files
Modpack file importing
1 parent 1af8f2e commit 4d70c03

6 files changed

Lines changed: 62 additions & 11 deletions

File tree

src/ml/northwestwind/Config.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.util.stream.Collectors;
1212

1313
public class Config {
14-
public static File directory, modpackDir, profileDir, exportDir;
14+
public static File directory, modpackDir, profileDir, exportDir, tempDir;
1515

1616
public static void run(String[] args) {
1717
if (args.length < 3) {
@@ -58,6 +58,7 @@ public static void load() {
5858
if (!profileDir.exists() || !profileDir.isDirectory()) profileDir.mkdir();
5959
exportDir = new File(directory.getPath() + File.separator + "exported");
6060
if (!exportDir.exists() || !exportDir.isDirectory()) exportDir.mkdir();
61+
tempDir = new File(directory.getPath() + File.separator + "tmp");
6162
} catch(Exception e) {
6263
e.printStackTrace();
6364
}

src/ml/northwestwind/Main.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
import java.util.Arrays;
66

7-
import static org.fusesource.jansi.Ansi.*;
8-
import static org.fusesource.jansi.Ansi.Color.*;
7+
import static org.fusesource.jansi.Ansi.Color.GREEN;
8+
import static org.fusesource.jansi.Ansi.Color.YELLOW;
9+
import static org.fusesource.jansi.Ansi.ansi;
910

1011
public class Main {
1112
public static void main(String[] args) {

src/ml/northwestwind/Mod.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@
55
import org.json.simple.JSONArray;
66
import org.json.simple.JSONObject;
77

8-
import java.io.File;
98
import java.io.PrintWriter;
109
import java.net.URLEncoder;
11-
import java.nio.charset.Charset;
1210
import java.util.Arrays;
1311
import java.util.HashMap;
1412
import java.util.Map;

src/ml/northwestwind/Modpack.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
import org.json.simple.JSONObject;
77
import org.json.simple.parser.JSONParser;
88

9-
import java.io.*;
9+
import java.io.File;
10+
import java.io.FileReader;
11+
import java.io.IOException;
12+
import java.io.PrintWriter;
1013
import java.util.*;
1114
import java.util.concurrent.atomic.AtomicInteger;
1215

@@ -58,14 +61,14 @@ private static void install(String[] ids) {
5861
}
5962
}
6063

61-
private static void copyFromOverride(String folder, String overridesName) throws IOException {
64+
public static void copyFromOverride(String folder, String overridesName) throws IOException {
6265
File overrides = new File(folder + File.separator + overridesName);
6366
if (!overrides.exists()) return;
6467
FileUtils.copyDirectory(overrides, new File(folder));
6568
FileUtils.deleteDirectory(overrides);
6669
}
6770

68-
private static void downloadMods(String folder) {
71+
public static void downloadMods(String folder) {
6972
System.out.println(Ansi.ansi().fg(Ansi.Color.CYAN).a("Starting mod download").reset());
7073
try {
7174
File modsFolder = new File(folder + File.separator + "mods");
@@ -95,7 +98,7 @@ private static void downloadMods(String folder) {
9598
StringBuilder formatted = new StringBuilder(String.format("[%d/%d] [S: %d | F: %d] Downloaded %s", ++i, array.size(), suc, fai, name));
9699
int ll = formatted.length() - lastlength;
97100
if (ll > 0) for (int ii = 0; ii < ll; ii++) formatted.append(" ");
98-
System.out.print(Ansi.ansi().fg(Ansi.Color.GREEN).a(formatted.toString()).reset()+"\r");
101+
System.out.print(Ansi.ansi().fg(Ansi.Color.GREEN).a(formatted.toString()).reset().a("\r"));
99102
System.out.flush();
100103
lastlength = formatted.length();
101104
}

src/ml/northwestwind/Profile.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public static void run(String[] args) {
3030
else if (cmd.equalsIgnoreCase("export")) export(args);
3131
else if (cmd.equalsIgnoreCase("edit")) edit(args[0]);
3232
else if (cmd.equalsIgnoreCase("delete")) delete(args);
33+
else if (cmd.equals("import")) importProf(args);
3334
else Utils.invalid();
3435
}
3536

@@ -491,6 +492,53 @@ private static void update(String[] args) {
491492
}
492493
}
493494

495+
private static void importProf(String[] paths) {
496+
if (!Config.tempDir.exists() || !Config.tempDir.isDirectory()) Config.tempDir.mkdir();
497+
else {
498+
System.out.println(Ansi.ansi().fg(Ansi.Color.RED).a("Another instance is importing a modpack. Please wait until it is finished."));
499+
return;
500+
}
501+
for (String path : paths) {
502+
File zipped = new File(path);
503+
try {
504+
if (!zipped.exists()) throw new Exception("The file " + path + " does not exist");
505+
if (zipped.isFile()) {
506+
FileUtils.copyFileToDirectory(zipped, Config.tempDir);
507+
if (!Utils.unzip(Config.tempDir.getPath() + File.separator + zipped.getName())) throw new Exception("Failed to extract modpack content of "+path);
508+
} else FileUtils.copyDirectoryToDirectory(zipped, Config.tempDir);
509+
File manifest = new File(Config.tempDir.getPath() + File.separator + "manifest.json");
510+
if (!manifest.exists() || !manifest.isFile()) throw new Exception("Modpack is missing manifest. Cannot convert to profile.");
511+
Modpack.copyFromOverride(Config.tempDir.getPath(), (String) ((JSONObject) parser.parse(new FileReader(manifest))).get("overrides"));
512+
Modpack.downloadMods(Config.tempDir.getPath());
513+
JSONObject json = (JSONObject) parser.parse(new FileReader(manifest));
514+
String slug = ((String) json.get("name")).toLowerCase().replaceAll("[^a-z0-9]", "-");
515+
FileUtils.moveDirectoryToDirectory(Config.tempDir, Config.profileDir, true);
516+
File packFolder = new File(Config.profileDir.getPath() + File.separator + "tmp");
517+
File newFolder = new File(Config.profileDir.getPath() + File.separator + slug);
518+
if (!packFolder.renameTo(newFolder)) {
519+
System.out.println(Ansi.ansi().fg(Ansi.Color.RED).a("Failed to rename modpack, but we are continuing anyway."));
520+
newFolder = packFolder;
521+
}
522+
JSONObject profile = new JSONObject();
523+
JSONObject minecraft = (JSONObject) json.get("minecraft");
524+
String[] launcher = ((String) ((JSONObject) ((JSONArray) minecraft.get("modLoaders")).get(0)).get("id")).split("-", 2);
525+
profile.put("name", json.get("name"));
526+
profile.put("mcVer", minecraft.get("version"));
527+
profile.put("launcher", launcher[0]);
528+
profile.put("modVer", launcher[1]);
529+
PrintWriter pw = new PrintWriter(newFolder.getPath() + File.separator + "profile.json");
530+
pw.write(profile.toJSONString());
531+
532+
pw.flush();
533+
pw.close();
534+
manifest.delete();
535+
System.out.println(Ansi.ansi().fg(Ansi.Color.GREEN).a("Converted modpack " + slug + " into profile."));
536+
} catch (Exception e) {
537+
e.printStackTrace();
538+
}
539+
}
540+
}
541+
494542
public static void printHelp(String prefix) {
495543
System.out.println(prefix + "profile: Commands for custom profiles.");
496544
System.out.println(prefix + "\tcreate: Create a profile.");
@@ -508,5 +556,7 @@ public static void printHelp(String prefix) {
508556
System.out.println(prefix + "\tupdate: Update mods in the profile.");
509557
System.out.println(prefix + "\t\targ <profile>: Name of the profile to target.");
510558
System.out.println(prefix + "\t\targ [ID]: The ID of mods. Omit to check for updates.");
559+
System.out.println(prefix + "\timport: Import a downloaded modpack.");
560+
System.out.println(prefix + "\t\targ <path>: Path to the zip or directory.");
511561
}
512562
}

src/ml/northwestwind/Utils.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package ml.northwestwind;
22

3-
import org.apache.commons.io.Charsets;
43
import org.apache.commons.io.FileUtils;
54
import org.fusesource.jansi.Ansi;
65
import org.json.simple.JSONArray;
@@ -10,7 +9,6 @@
109
import java.io.*;
1110
import java.net.HttpURLConnection;
1211
import java.net.URL;
13-
import java.net.URLEncoder;
1412
import java.nio.charset.StandardCharsets;
1513
import java.util.Arrays;
1614
import java.util.List;

0 commit comments

Comments
 (0)