diff --git a/src/main/java/net/ornithemc/meta/data/VersionDatabase.java b/src/main/java/net/ornithemc/meta/data/VersionDatabase.java index 599d219..04cb224 100644 --- a/src/main/java/net/ornithemc/meta/data/VersionDatabase.java +++ b/src/main/java/net/ornithemc/meta/data/VersionDatabase.java @@ -28,6 +28,7 @@ import net.ornithemc.meta.utils.MinecraftLauncherMeta; import net.ornithemc.meta.utils.MavenPomParser; import net.ornithemc.meta.utils.MavenMetadataParser; +import net.ornithemc.meta.utils.MavenMetadataParser.StableVersionIdentifier; import net.ornithemc.meta.utils.VersionManifest; import net.ornithemc.meta.web.LibraryUpgradesV3; import net.ornithemc.meta.web.LibraryUpgradesV3.LibraryUpgrade; @@ -39,6 +40,7 @@ import java.util.*; import java.util.function.Function; import java.util.function.Predicate; +import java.util.regex.Pattern; import java.util.stream.Collectors; @JsonIgnoreProperties({"manifest"}) @@ -60,6 +62,9 @@ public class VersionDatabase { public static final MavenMetadataParser OSL_METADATA_PARSER = new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc", "osl"); public static final MavenPomParser OSL_POM_PARSER = new MavenPomParser(ORNITHE_MAVEN_URL, "net.ornithemc", "osl"); + private static final Pattern INVALID_FABRIC_LOADER_VERSIONS_GEN2 = Pattern.compile("^(?:0\\.(?:\\d|1[0-6])\\..+|0\\.17\\.[0-2])"); + private static final Pattern INVALID_QUILT_LOADER_VERSIONS_GEN2 = Pattern.compile("^(?:0\\.(?:\\d|1\\d|2[0-8])\\..+|0\\.29\\.[0-2])"); + public static ConfigV3 config; private static final String modifyForIntermediaryGeneration(String s, int generation) { @@ -82,6 +87,34 @@ public static final MavenMetadataParser oslModuleMetadataParser(String module) { return new MavenMetadataParser(ORNITHE_MAVEN_URL, "net.ornithemc.osl", module); } + public static Pattern invalidLoaderVersionsPattern(LoaderType loaderType) { + switch (loaderType) { + case FABRIC: + return INVALID_FABRIC_LOADER_VERSIONS_GEN2; + case QUILT: + return INVALID_QUILT_LOADER_VERSIONS_GEN2; + default: + throw new IllegalStateException("no invalid loader versions pattern for loader type " + loaderType.getName()); + } + } + + public static StableVersionIdentifier filterLoaderVersions(int generation, LoaderType loaderType) { + return versions -> { + boolean foundStableVersion = false; + + for (Iterator it = versions.iterator(); it.hasNext(); ) { + BaseVersion version = it.next(); + + if (generation >= 2 && invalidLoaderVersionsPattern(loaderType).matcher(version.getVersion()).matches()) { + it.remove(); + } else if (!foundStableVersion && isPublicLoaderVersion(loaderType, version)) { + foundStableVersion = true; + version.setStable(true); + } + } + }; + } + private static List oslModules() { List modules = new ArrayList<>(); @@ -123,7 +156,7 @@ private static List oslModules() { private final Int2ObjectMap> game; private final Int2ObjectMap> intermediary; private final Int2ObjectMap> feather; - private final Map> loader; + private final Int2ObjectMap>> loader; private final Map> oslDependencies; private final Map> oslModules; @@ -139,7 +172,7 @@ private VersionDatabase() { this.game = new Int2ObjectOpenHashMap<>(); this.intermediary = new Int2ObjectOpenHashMap<>(); this.feather = new Int2ObjectOpenHashMap<>(); - this.loader = new EnumMap<>(LoaderType.class); + this.loader = new Int2ObjectOpenHashMap<>(); this.oslDependencies = new HashMap<>(); this.oslModules = new HashMap<>(); } @@ -151,27 +184,13 @@ public static VersionDatabase generate() throws Exception { for (int generation = 1; generation <= config.latestIntermediaryGeneration; generation++) { database.intermediary.put(generation, intermediaryMetadataParser(generation).getVersions(MavenVersion::new)); database.feather.put(generation, featherMetadataParser(generation).getVersions(MavenBuildGameVersion::new)); + database.loader.put(generation, new EnumMap<>(LoaderType.class)); + database.loader.get(generation).put(LoaderType.FABRIC, FABRIC_LOADER_METADATA_PARSER.getVersions(MavenBuildVersion::new, filterLoaderVersions(generation, LoaderType.FABRIC))); + database.loader.get(generation).put(LoaderType.QUILT, QUILT_LOADER_METADATA_PARSER.getVersions(MavenBuildVersion::new, filterLoaderVersions(generation, LoaderType.QUILT))); } database.raven = RAVEN_METADATA_PARSER.getVersions(MavenBuildGameVersion::new); database.sparrow = SPARROW_METADATA_PARSER.getVersions(MavenBuildGameVersion::new); database.nests = NESTS_METADATA_PARSER.getVersions(MavenBuildGameVersion::new); - database.loader.put(LoaderType.FABRIC, FABRIC_LOADER_METADATA_PARSER.getVersions(MavenBuildVersion::new, list -> { - for (BaseVersion version : list) { - if (isPublicLoaderVersion(version)) { - version.setStable(true); - break; - } - } - })); - database.loader.put(LoaderType.QUILT, QUILT_LOADER_METADATA_PARSER.getVersions(MavenBuildVersion::new, list -> { - for (BaseVersion version : list) { - // Quilt publishes beta versions of their loader, filter those out - if (isPublicLoaderVersion(version) && !version.getVersion().contains("-")) { - version.setStable(true); - break; - } - } - })); database.installer = INSTALLER_METADATA_PARSER.getVersions(MavenUrlVersion::new); database.osl = OSL_METADATA_PARSER.getVersions(MavenVersion::new); for (MavenVersion version : database.osl) { @@ -188,8 +207,9 @@ public static VersionDatabase generate() throws Exception { return database; } - private static boolean isPublicLoaderVersion(BaseVersion version) { - return true; + private static boolean isPublicLoaderVersion(LoaderType type, BaseVersion version) { + // Quilt publishes beta versions of their loader, filter those out + return !(type == LoaderType.QUILT && version.getVersion().contains("-")); } private void loadMcData() throws IOException { @@ -297,8 +317,8 @@ public List getFeather(int generation) { return feather.get(generation); } - public List getLoader(LoaderType type) { - return loader.get(type).stream().filter(VersionDatabase::isPublicLoaderVersion).collect(Collectors.toList()); + public List getLoader(int generation, LoaderType type) { + return loader.get(generation).get(type).stream().filter(v -> isPublicLoaderVersion(type, v)).collect(Collectors.toList()); } public List getOslDependencies(String version) { @@ -309,7 +329,7 @@ public List getOslModule(String module) { return oslModules.get(module); } - public List getAllLoader(LoaderType type) { - return Collections.unmodifiableList(loader.get(type)); + public List getAllLoader(int generation, LoaderType type) { + return Collections.unmodifiableList(loader.get(generation).get(type)); } } diff --git a/src/main/java/net/ornithemc/meta/web/EndpointsV3.java b/src/main/java/net/ornithemc/meta/web/EndpointsV3.java index 8c8b56d..bc0be95 100644 --- a/src/main/java/net/ornithemc/meta/web/EndpointsV3.java +++ b/src/main/java/net/ornithemc/meta/web/EndpointsV3.java @@ -75,11 +75,11 @@ public static void setup() { jsonGetF("/libraries/:game_version", generation -> context -> withLimitSkip(context, getLibraries(context, generation))); - jsonGet("/fabric-loader", context -> withLimitSkip(context, OrnitheMeta.database.getLoader(LoaderType.FABRIC))); + jsonGetF("/fabric-loader", generation -> context -> withLimitSkip(context, OrnitheMeta.database.getLoader(generation, LoaderType.FABRIC))); jsonGetF("/fabric-loader/:game_version", generation -> context -> withLimitSkip(context, getLoaderInfoAll(context, generation, LoaderType.FABRIC))); jsonGetF("/fabric-loader/:game_version/:loader_version", generation -> context -> getLoaderInfo(context, generation, LoaderType.FABRIC)); - jsonGet("/quilt-loader", context -> withLimitSkip(context, OrnitheMeta.database.getLoader(LoaderType.QUILT))); + jsonGetF("/quilt-loader", generation -> context -> withLimitSkip(context, OrnitheMeta.database.getLoader(generation, LoaderType.QUILT))); jsonGetF("/quilt-loader/:game_version", generation -> context -> withLimitSkip(context, getLoaderInfoAll(context, generation, LoaderType.QUILT))); jsonGetF("/quilt-loader/:game_version/:loader_version", generation -> context -> getLoaderInfo(context, generation, LoaderType.QUILT)); @@ -184,7 +184,7 @@ private static Object getLoaderInfo(Context context, int generation, LoaderType String gameVersion = context.pathParam("game_version"); String loaderVersion = context.pathParam("loader_version"); - MavenBuildVersion loader = OrnitheMeta.database.getAllLoader(type).stream() + MavenBuildVersion loader = OrnitheMeta.database.getAllLoader(generation, type).stream() .filter(mavenBuildVersion -> loaderVersion.equals(mavenBuildVersion.getVersion())) .findFirst().orElse(null); @@ -219,7 +219,7 @@ private static List getLoaderInfoAll(Context context, int generation, LoaderT List infoList = new ArrayList<>(); - for(MavenBuildVersion loader : OrnitheMeta.database.getLoader(type)){ + for(MavenBuildVersion loader : OrnitheMeta.database.getLoader(generation, type)){ infoList.add(new LoaderInfoV3(type, loader, mappings).populateMeta()); } return infoList;