improve mod list
All checks were successful
Publish to snapshot maven / build (push) Successful in 19s

This commit is contained in:
moehreag 2024-06-13 14:56:44 +02:00
parent 8a3267ffbe
commit e67ee70cb5
5 changed files with 56 additions and 34 deletions

View file

@ -75,7 +75,8 @@ public class LoaderGui extends JFrame {
public static void execUnfulfilledDep(Path reportPath, ModDependencyResolver.UnfulfilledDependencyException ex, boolean keepRunning) { public static void execUnfulfilledDep(Path reportPath, ModDependencyResolver.UnfulfilledDependencyException ex, boolean keepRunning) {
exec(gui -> { exec(gui -> {
gui.setHeader("Found " + ex.getDependencies().size() + " problems"); int count = ex.getDependencies().size();
gui.setHeader("Found " + count + " problem"+(count > 1 ? "s" : ""));
gui.addTab("Info", new UnfulfilledDepPage(ex)); gui.addTab("Info", new UnfulfilledDepPage(ex));
addReport(gui, reportPath); addReport(gui, reportPath);
}, keepRunning); }, keepRunning);
@ -83,7 +84,8 @@ public class LoaderGui extends JFrame {
public static void execBreakingDep(Path reportPath, ModDependencyResolver.BreakingModException ex, boolean keepRunning) { public static void execBreakingDep(Path reportPath, ModDependencyResolver.BreakingModException ex, boolean keepRunning) {
exec(gui -> { exec(gui -> {
gui.setHeader("Found " + ex.getBreaks().size() + " problems"); int count = ex.getBreaks().size();
gui.setHeader("Found " + count + " problem"+(count > 1 ? "s" : ""));
gui.addTab("Info", new BreakingDepPage(ex)); gui.addTab("Info", new BreakingDepPage(ex));
addReport(gui, reportPath); addReport(gui, reportPath);
}, keepRunning); }, keepRunning);

View file

@ -15,8 +15,9 @@ public class ReportPage extends JScrollPane {
getHorizontalScrollBar().setUnitIncrement(16); getHorizontalScrollBar().setUnitIncrement(16);
getVerticalScrollBar().setUnitIncrement(16); getVerticalScrollBar().setUnitIncrement(16);
JTextPane text = new JTextPane(); JTextArea text = new JTextArea();
text.setEditable(false); text.setEditable(false);
text.setTabSize(2);
try { try {
text.setText(Files.readString(reportPath, StandardCharsets.UTF_8)); text.setText(Files.readString(reportPath, StandardCharsets.UTF_8));
} catch (IOException e) { } catch (IOException e) {
@ -25,6 +26,7 @@ public class ReportPage extends JScrollPane {
printer.printf("Could not load contents of %s:%n", reportPath); printer.printf("Could not load contents of %s:%n", reportPath);
e.printStackTrace(printer); e.printStackTrace(printer);
} }
text.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8));
setViewportView(text); setViewportView(text);
SwingUtilities.invokeLater(() -> getViewport().setViewPosition(new Point(0, 0))); SwingUtilities.invokeLater(() -> getViewport().setViewPosition(new Point(0, 0)));
} }

View file

@ -133,7 +133,7 @@ public class ModPropertiesReader {
for (UnmodifiableConfig entry : dependenciesConfig) { for (UnmodifiableConfig entry : dependenciesConfig) {
String entryId = entry.get("id"); String entryId = entry.get("id");
String entryVersions = entry.get("versions"); String entryVersions = entry.get(key.equals("provides") ? "version" : "versions");
if (entryId == null || entryId.isEmpty()) if (entryId == null || entryId.isEmpty())
badProperties.add("frog.dependencies." + key + '.' + i + ".id"); badProperties.add("frog.dependencies." + key + '.' + i + ".id");

View file

@ -1,52 +1,69 @@
package dev.frogmc.frogloader.impl.mod; package dev.frogmc.frogloader.impl.mod;
import java.io.IOException; import java.util.*;
import java.net.URI;
import java.nio.file.Files;
import java.util.Collection;
import java.util.Comparator;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import dev.frogmc.frogloader.api.FrogLoader; import com.electronwill.nightconfig.core.UnmodifiableConfig;
import dev.frogmc.frogloader.api.mod.ModProperties; import dev.frogmc.frogloader.api.mod.ModProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ModUtil { public class ModUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(ModUtil.class);
public static String getModList(Collection<ModProperties> mods) { public static String getModList(Collection<ModProperties> mods) {
int size = mods.size(); int size = mods.size();
if (size == 0) { if (size == 0) {
return "No mods loaded."; return "No mods loaded.";
} }
Map<String, ModProperties> modIdMap = mods.stream().collect(Collectors.toMap(ModProperties::id, m -> m));
AtomicInteger indent = new AtomicInteger(1);
Map<ModProperties, Collection<String>> parentToChildIdMap = getParentMods(mods);
Collection<String> containedIds = parentToChildIdMap.values().stream().flatMap(Collection::stream).collect(Collectors.toUnmodifiableSet());
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
builder.append("Loaded ").append(size).append(" mod"); List<ModProperties> parents = parentToChildIdMap.keySet().stream().filter(p -> !containedIds.contains(p.id()))
.sorted(Comparator.comparing(ModProperties::id)).toList();
int parentCount = parents.size();
builder.append("Loaded ").append(parentCount).append(" (").append(size).append(")").append(" mod");
if (size > 1) { if (size > 1) {
builder.append("s"); builder.append("s");
} }
builder.append(":"); builder.append(":");
AtomicInteger i = new AtomicInteger(); parents.forEach(p -> printMod(modIdMap, p, builder, indent, parentToChildIdMap));
mods.stream().sorted(Comparator.comparing(ModProperties::id)).forEach(p -> {
builder.append("\n\t");
if (i.get() < size - 1) {
builder.append("|- ");
} else {
builder.append("\\- ");
}
builder.append(p.id()).append(" (").append(p.name()).append(") ").append(" ").append(p.version());
i.getAndIncrement();
});
return builder.toString(); return builder.toString();
} }
public static void installMod(String url) { private static void printMod(Map<String, ModProperties> mods, ModProperties p, StringBuilder builder, AtomicInteger indent, Map<ModProperties, Collection<String>> parentToChildIdMap) {
try { builder.append("\n").append("\t".repeat(indent.getAndIncrement()));
Files.copy(URI.create(url).toURL().openStream(), FrogLoader.getInstance().getModsDir().resolve(url.substring(url.lastIndexOf("/" + 1)))); Collection<String> children = parentToChildIdMap.get(p);
} catch (IOException e) { if (!children.isEmpty()) {
LOGGER.error("Failed to install mod:", e); builder.append("\\- ");
} else {
builder.append("|- ");
}
builder.append(p.id()).append(" (").append(p.name()).append(") ").append(" ").append(p.version());
for (String s : children) {
printMod(mods, mods.get(s), builder, indent, parentToChildIdMap);
}
indent.getAndDecrement();
}
private static Map<ModProperties, Collection<String>> getParentMods(Collection<ModProperties> mods) {
Map<ModProperties, Collection<String>> children = new HashMap<>();
for (ModProperties mod : mods) {
List<List<UnmodifiableConfig>> entries = mod.extensions().get(BuiltinExtensions.INCLUDED_JARS);
if (entries != null) {
for (var jars : entries) {
for (var jar : jars) {
String id = jar.get("id");
children.computeIfAbsent(mod, m -> new HashSet<>()).add(id);
} }
} }
} else {
children.computeIfAbsent(mod, m -> new HashSet<>());
}
}
return children;
}
} }

View file

@ -9,6 +9,7 @@ import java.net.MalformedURLException;
import java.nio.file.*; import java.nio.file.*;
import java.util.*; import java.util.*;
import com.electronwill.nightconfig.core.UnmodifiableConfig;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import dev.frogmc.frogloader.api.FrogLoader; import dev.frogmc.frogloader.api.FrogLoader;
import dev.frogmc.frogloader.api.extensions.PreLaunchExtension; import dev.frogmc.frogloader.api.extensions.PreLaunchExtension;
@ -123,13 +124,13 @@ public class Minecraft implements FrogPlugin {
ModProperties p = opt.get(); ModProperties p = opt.get();
modProperties.add(p); modProperties.add(p);
modPaths.put(mod, p); modPaths.put(mod, p);
List<List<Map<String, String>>> entries = p.extensions().getOrDefault(BuiltinExtensions.INCLUDED_JARS, Collections.emptyList()); List<List<UnmodifiableConfig>> entries = p.extensions().getOrDefault(BuiltinExtensions.INCLUDED_JARS, Collections.emptyList());
if (entries.isEmpty()) { if (entries.isEmpty()) {
return; return;
} }
try (FileSystem fs = FileSystems.newFileSystem(mod)) { try (FileSystem fs = FileSystems.newFileSystem(mod)) {
for (var jars : entries) { for (List<UnmodifiableConfig> jars : entries) {
for (Map<String, String> jar : jars) { for (UnmodifiableConfig jar : jars) {
Path path = fs.getPath(jar.get("path")).toAbsolutePath(); Path path = fs.getPath(jar.get("path")).toAbsolutePath();
mods.add(path); mods.add(path);
findJiJMods(path, mods, modPaths); findJiJMods(path, mods, modPaths);