Iris downloader / History update

- Allow people to download in place and update in place the media
This commit is contained in:
Brian Neumann-Fopiano committed 2026-09-18 21:52:19 -04:00
1 parent b18681a3e2
commit edadd14f4b
40 files changed
+836 -122

No files matched your search

@@ -40,9 +40,8 @@ public final class ModdedIrisSplash {
private static void printPacks(ModdedLoader loader) {
File packFolder = IrisPlatforms.get().packsFolderNoCreate();
for (String line : IrisSplashComposer.composePackLines(packFolder, IrisLogging::reportError)) {
IrisLogging.info(line);
}
IrisSplashComposer.composePackLines(packFolder, IrisLogging::reportError)
.thenAccept(lines -> lines.forEach(IrisLogging::info));
}
private static void printLogo(ModdedLoader loader) {
@@ -406,14 +406,14 @@ public final class IrisModdedCommands {
? PackDownloader.downloadUrl(
packs,
request.url(),
false,
request.overwrite(),
(String message) -> dispatchDownloadFeedback(source, () -> ok(source, message)),
cancellation
)
: PackDownloader.downloadBuiltIn(
packs,
request.pack(),
false,
request.overwrite(),
(String message) -> dispatchDownloadFeedback(source, () -> ok(source, message)),
cancellation
);
@@ -478,15 +478,33 @@ public final class IrisModdedCommands {
if (rawRequest == null || rawRequest.isBlank()) {
return null;
}
if (rawRequest.startsWith("pack=")) {
String pack = rawRequest.substring("pack=".length()).trim().toLowerCase(Locale.ROOT);
return PackDownloader.isBuiltInPack(pack) ? new DownloadRequest(pack, null) : null;
String pack = null;
String url = null;
Boolean overwrite = null;
for (String argument : rawRequest.trim().split("\\s+")) {
if (argument.startsWith("pack=") && pack == null) {
pack = argument.substring("pack=".length()).toLowerCase(Locale.ROOT);
if (!PackDownloader.isBuiltInPack(pack)) {
return null;
}
} else if (argument.startsWith("link=") && url == null) {
url = argument.substring("link=".length());
if (!PackDownloader.isDirectZipUrl(url)) {
return null;
}
} else if (argument.startsWith("overwrite=") && overwrite == null) {
String value = argument.substring("overwrite=".length());
if (!"true".equalsIgnoreCase(value) && !"false".equalsIgnoreCase(value)) {
return null;
}
overwrite = Boolean.parseBoolean(value);
} else {
return null;
}
}
if (rawRequest.startsWith("link=")) {
String url = rawRequest.substring("link=".length()).trim();
return PackDownloader.isDirectZipUrl(url) ? new DownloadRequest(null, url) : null;
}
return null;
return (pack == null) == (url == null)
? null
: new DownloadRequest(pack, url, Boolean.TRUE.equals(overwrite));
}
static int metrics(CommandSourceStack source) {
@@ -555,6 +573,6 @@ public final class IrisModdedCommands {
ModdedCommandFeedback.fail(source, message);
}
record DownloadRequest(String pack, String url) {
record DownloadRequest(String pack, String url, boolean overwrite) {
}
}
@@ -70,7 +70,7 @@ final class ModdedCommandHelp {
Entry.command("seed", "", ModdedHelpMessages.COMMAND_SEED_PRINT_WORLD_AND_ENGINE_SEED_INFORMATION),
Entry.command("debug", "", ModdedHelpMessages.COMMAND_DEBUG_TOGGLE_IRIS_DEBUG_LOGGING_AND_SAVE_SETTINGS_JSON),
Entry.command("reload", "", ModdedHelpMessages.COMMAND_RELOAD_RELOAD_SETTINGS_JSON_ALSO_HOTLOADED_AUTOMATICALLY_EVERY_3S),
Entry.command("download", "<pack=overworld|pack=underworld|link=<zip-url>>", ModdedHelpMessages.COMMAND_DOWNLOAD_DOWNLOAD_A_PACK_PROJECT, "dl"),
Entry.command("download", "<pack=overworld|pack=underworld|link=<zip-url>> [overwrite=true]", ModdedHelpMessages.COMMAND_DOWNLOAD_DOWNLOAD_A_PACK_PROJECT, "dl"),
Entry.command("metrics", "", ModdedHelpMessages.COMMAND_METRICS_PRINT_GENERATION_METRICS_FOR_YOUR_CURRENT_IRIS_DIMENSION, "measure"),
Entry.command("regen", "[radius]", ModdedHelpMessages.COMMAND_REGEN_DELETE_AND_REGENERATE_NEARBY_CHUNKS_IN_PLACE, "rg"),
Entry.group("pregen", ModdedHelpMessages.GROUP_PREGEN_PREGENERATE_AN_IRIS_DIMENSION, "pregenerate"),
@@ -43,7 +43,7 @@ final class ModdedCommandTree {
private static final SuggestionProvider<CommandSourceStack> DOWNLOAD_SOURCES =
(context, builder) ->
SharedSuggestionProvider.suggest(
List.of("pack=overworld", "pack=underworld", "link="),
List.of("pack=overworld", "pack=underworld", "link=", "pack=overworld overwrite=true", "pack=underworld overwrite=true"),
builder
);
private static final Predicate<CommandSourceStack> GATE = Commands.hasPermission(Commands.LEVEL_GAMEMASTERS);
@@ -89,7 +89,27 @@ public class IrisModdedCommandParityTest {
assertNull(IrisModdedCommands.parseDownloadRequest("pack=custom"));
assertNull(IrisModdedCommands.parseDownloadRequest("link=https://packs.example.test/custom.tar.gz"));
assertNull(IrisModdedCommands.parseDownloadRequest("pack=underworld branch=stable"));
assertNull(IrisModdedCommands.parseDownloadRequest("pack=underworld overwrite=true"));
assertFalse(overworld.overwrite());
}
@Test
public void downloadOverwriteRequiresOneSourceAndAnExplicitBoolean() {
IrisModdedCommands.DownloadRequest pack = IrisModdedCommands.parseDownloadRequest("pack=underworld overwrite=true");
IrisModdedCommands.DownloadRequest link = IrisModdedCommands.parseDownloadRequest(
"overwrite=true link=https://packs.example.test/custom.zip?token=a=b");
assertNotNull(pack);
assertTrue(pack.overwrite());
assertEquals("underworld", pack.pack());
assertNotNull(link);
assertTrue(link.overwrite());
assertEquals("https://packs.example.test/custom.zip?token=a=b", link.url());
assertFalse(IrisModdedCommands.parseDownloadRequest("pack=overworld overwrite=false").overwrite());
assertNull(IrisModdedCommands.parseDownloadRequest("overwrite=true"));
assertNull(IrisModdedCommands.parseDownloadRequest("pack=overworld overwrite=yes"));
assertNull(IrisModdedCommands.parseDownloadRequest("pack=overworld overwrite=true overwrite=false"));
assertNull(IrisModdedCommands.parseDownloadRequest("pack=overworld pack=underworld"));
assertNull(IrisModdedCommands.parseDownloadRequest("pack=overworld link=https://packs.example.test/custom.zip"));
}
@Test