From ece5806714f21a335f7ecc40bf06cbda04f434c7 Mon Sep 17 00:00:00 2001 From: Zoriot Date: Tue, 14 Jul 2026 14:46:07 +0200 Subject: [PATCH] Support multiple loaders for plugin updates via Modrinth API --- .../autoplug/client/configs/UpdaterConfig.java | 6 +++++- .../osiris/autoplug/client/console/Commands.java | 5 ++++- .../client/tasks/updater/mods/ModrinthAPI.java | 13 +++++++------ .../tasks/updater/plugins/ResourceFinder.java | 6 ++++-- .../tasks/updater/plugins/TaskPluginsUpdater.java | 6 +++++- .../client/tasks/updater/TestPluginUpdaters.java | 3 ++- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/osiris/autoplug/client/configs/UpdaterConfig.java b/src/main/java/com/osiris/autoplug/client/configs/UpdaterConfig.java index 45437a41..0feaa702 100644 --- a/src/main/java/com/osiris/autoplug/client/configs/UpdaterConfig.java +++ b/src/main/java/com/osiris/autoplug/client/configs/UpdaterConfig.java @@ -17,7 +17,6 @@ import io.github.projectunified.mcserverupdater.UpdateBuilder; import java.io.IOException; -import java.util.stream.Collectors; public class UpdaterConfig extends MyYaml { @@ -54,6 +53,7 @@ public class UpdaterConfig extends MyYaml { public YamlSection plugins_updater_profile; public YamlSection plugins_updater_path; public YamlSection plugins_updater_version; + public YamlSection plugins_updater_loaders; public YamlSection plugins_updater_async; public YamlSection plugins_updater_web_database; public YamlSection plugins_updater_web_database_min_usages; @@ -204,6 +204,10 @@ public UpdaterConfig() throws IOException, DuplicateKeyException, YamlReaderExce plugins_updater_version = put(name, "plugins-updater", "version").setComments("The Minecraft version to check and download plugins for.", "If left empty, taken from server-updater.version above, if also empty, taken from general.yml, if also empty, taken from server jar.", "Currently only relevant for Modrinth plugins."); + plugins_updater_loaders = put(name, "plugins-updater", "loaders") + .setComments("The list of software's to update minecraft plugins.", + "If left empty, taken from server-updater.software above. I multiple values are specified it will prioritize the fist one.", + "Currently only relevant for Modrinth plugins."); plugins_updater_async = put(name, "plugins-updater", "async").setDefValues("true").setComments( "Asynchronously checks for updates.", "Normally this should be faster than checking for updates synchronously, thus it should be enabled.", diff --git a/src/main/java/com/osiris/autoplug/client/console/Commands.java b/src/main/java/com/osiris/autoplug/client/console/Commands.java index df18d2c1..fe35f51c 100644 --- a/src/main/java/com/osiris/autoplug/client/console/Commands.java +++ b/src/main/java/com/osiris/autoplug/client/console/Commands.java @@ -399,6 +399,9 @@ public static boolean installPlugin(String command) throws Exception { String mcVersion = updaterConfig.plugins_updater_version.asString(); if (mcVersion == null) mcVersion = Server.getMCVersion(); + List loaders = updaterConfig.plugins_updater_loaders.asStringList(); + if (loaders.isEmpty()) loaders = List.of(updaterConfig.server_software.asString()); + String repo = "spigot"; if(input.startsWith(repo)){ int spigotId = Integer.parseInt(input.replace(repo, "").trim()); @@ -427,7 +430,7 @@ public static boolean installPlugin(String command) throws Exception { MinecraftPlugin plugin2 = new MinecraftPlugin(new File(pluginsDir + "/" + tempName).getAbsolutePath(), tempName, "0", "", 0, 0, ""); plugin2.setModrinthId(input.replace(repo, "").trim()); - result = new ResourceFinder().findPluginByModrinthId(plugin2, mcVersion); + result = new ResourceFinder().findPluginByModrinthId(loaders, plugin2, mcVersion); } /* Nothing of the above worked thus do search by name diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java index 1850d673..ffee2bd5 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/mods/ModrinthAPI.java @@ -17,6 +17,7 @@ import java.io.File; import java.time.Instant; +import java.util.List; public class ModrinthAPI { @@ -38,16 +39,16 @@ private boolean isInt(String s) { */ public SearchResult searchUpdateMod(InstalledModLoader modLoader, MinecraftMod mod, String mcVersion) { if (mod.modrinthId == null && !isInt(mod.curseforgeId)) mod.modrinthId = mod.curseforgeId; // Slug - SearchResult res = searchUpdate((modLoader.isFabric || modLoader.isQuilt ? "fabric" : "forge"),mod.modrinthId,mcVersion, mod.installationPath, mod.forceLatest); + SearchResult res = searchUpdate((modLoader.isFabric || modLoader.isQuilt ? List.of("fabric") : List.of("forge")),mod.modrinthId,mcVersion, mod.installationPath, mod.forceLatest); res.mod = mod; return res; } - public SearchResult searchUpdatePlugin(MinecraftPlugin plugin, String mcVersion) { //TODO: probably don't hardcode spigot and papermc - return searchUpdate("spigot\",\"paper", plugin.getModrinthId(), mcVersion, plugin.getInstallationPath(), false); + public SearchResult searchUpdatePlugin(List loaders, MinecraftPlugin plugin, String mcVersion) { + return searchUpdate(loaders, plugin.getModrinthId(), mcVersion, plugin.getInstallationPath(), false); } - private SearchResult searchUpdate(String loader, String id, String mcVersion, String installPath, boolean forceLatest) { + private SearchResult searchUpdate(List loaders, String id, String mcVersion, String installPath, boolean forceLatest) { - String url = baseUrl + "/project/" + id + "/version?loaders=[\"" + loader + "\"]&game_versions=[\"" + mcVersion + "\"]"; + String url = baseUrl + "/project/" + id + "/version?loaders=[\"" + String.join( "\",\"", loaders) + "\"]&game_versions=[\"" + mcVersion + "\"]"; url = new UtilsURL().clean(url); Exception exception = null; String latest = null; @@ -67,7 +68,7 @@ private SearchResult searchUpdate(String loader, String id, String mcVersion, St if (!isInt(id)) { // Try another url, with slug replaced _ with - url = baseUrl + "/project/" + id.replace("_", "-") + "/version?loaders=[\"" + - loader + "\"]" + (forceLatest ? "" : "&game_versions=[\"" + mcVersion + "\"]"); + String.join( "\",\"", loaders) + "\"]" + (forceLatest ? "" : "&game_versions=[\"" + mcVersion + "\"]"); AL.debug(this.getClass(), url); release = Json.getAsJsonArray(url) .get(0).getAsJsonObject(); diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/ResourceFinder.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/ResourceFinder.java index 4d3d38f4..7d0bf079 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/ResourceFinder.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/ResourceFinder.java @@ -22,6 +22,8 @@ import com.osiris.autoplug.client.tasks.updater.search.spigot.SpigotSearchById; import com.osiris.autoplug.client.tasks.updater.search.spigot.SpigotSearchByName; +import java.util.List; + public class ResourceFinder { /** @@ -77,8 +79,8 @@ public SearchResult findPluginByBukkitId(MinecraftPlugin plugin) { sr.plugin = plugin; return sr; } - public SearchResult findPluginByModrinthId(MinecraftPlugin plugin, String mcVersion) { - SearchResult sr = new ModrinthAPI().searchUpdatePlugin(plugin, mcVersion); + public SearchResult findPluginByModrinthId(List loaders, MinecraftPlugin plugin, String mcVersion) { + SearchResult sr = new ModrinthAPI().searchUpdatePlugin(loaders, plugin, mcVersion); sr.plugin = plugin; return sr; } diff --git a/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/TaskPluginsUpdater.java b/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/TaskPluginsUpdater.java index ce1cbd91..81e8bfec 100644 --- a/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/TaskPluginsUpdater.java +++ b/src/main/java/com/osiris/autoplug/client/tasks/updater/plugins/TaskPluginsUpdater.java @@ -302,6 +302,9 @@ else if (installedPlugin.getVersion() == null || installedPlugin.getVersion().tr if (mcVersion == null) updaterConfig.server_updater_version.asString(); if (mcVersion == null) mcVersion = Server.getMCVersion(); + List loaders = updaterConfig.plugins_updater_loaders.asStringList(); + if (loaders.isEmpty()) loaders = List.of(updaterConfig.server_software.asString()); + for (MinecraftPlugin pl : includedPlugins) { try { @@ -325,7 +328,8 @@ else if (installedPlugin.getVersion() == null || installedPlugin.getVersion().tr } else if (pl.getModrinthId() != null) { // MODRINTH PLUGIN sizeModrinthPlugins++; String finalMcVersion = mcVersion; - activeFutures.add(executorService.submit(() -> new ResourceFinder().findPluginByModrinthId(pl, finalMcVersion))); + List finalLoaders = loaders; + activeFutures.add(executorService.submit(() -> new ResourceFinder().findPluginByModrinthId(finalLoaders, pl, finalMcVersion))); } else { sizeUnknownPlugins++; // UNKNOWN PLUGIN pl.setIgnoreContentType(true); // TODO temporary workaround for xamazon-json content type curseforge/bukkit issue: https://github.com/Osiris-Team/AutoPlug-Client/issues/109 diff --git a/src/test/java/com/osiris/autoplug/client/tasks/updater/TestPluginUpdaters.java b/src/test/java/com/osiris/autoplug/client/tasks/updater/TestPluginUpdaters.java index 59e87d44..2f4bda07 100644 --- a/src/test/java/com/osiris/autoplug/client/tasks/updater/TestPluginUpdaters.java +++ b/src/test/java/com/osiris/autoplug/client/tasks/updater/TestPluginUpdaters.java @@ -16,6 +16,7 @@ import org.junit.jupiter.api.Test; import java.io.IOException; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertSame; @@ -36,7 +37,7 @@ void testModrinth() throws IOException { UtilsTest.init(); MinecraftPlugin pl = new MinecraftPlugin("./plugins/", "BMMarker", "0.0.0", "Miraculixx", 0, 0, null); pl.modrinthId = "a8UoyV2h"; - SearchResult sr = new ModrinthAPI().searchUpdatePlugin(pl, "1.21.1"); + SearchResult sr = new ModrinthAPI().searchUpdatePlugin(List.of("paper"), pl, "1.21.1"); assertSame(SearchResult.Type.UPDATE_AVAILABLE, sr.type); } }