Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,4 @@ $RECYCLE.BIN/
# macOS
.DS_Store
.profileconfig.json
gradle.properties
66 changes: 63 additions & 3 deletions src/main/java/org/quiltmc/installer/VersionManifest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
Expand All @@ -36,7 +37,7 @@
*/
// TODO: Abstract to another library for sharing logic with meta?
public final class VersionManifest implements Collection<VersionManifest.Version> {
private static final String LAUNCHER_META_URL = "https://ornithemc.net/mc-versions/version_manifest.json";
private static final String LAUNCHER_META_URL = "https://ornithemc.net/mc-versions/gen2/version_manifest.json";
private static final String LAUNCHER_META_BY_GEN_URL = "https://ornithemc.net/mc-versions/gen2/version_manifest.json";

private final Version latestRelease;
Expand Down Expand Up @@ -147,6 +148,7 @@ private static void readVersions(JsonReader reader, Map<String, Version> version
String url = null;
String time = null;
String releaseTime = null;
String details = null; // used for getting client and server

while (reader.hasNext()) {
String key = reader.nextName();
Expand Down Expand Up @@ -187,13 +189,25 @@ private static void readVersions(JsonReader reader, Map<String, Version> version

releaseTime = reader.nextString();
break;
case "details":
if (reader.peek() != JsonToken.STRING) {
throw new ParseException("Version release time must be a string", reader);
}

details = reader.nextString();
break;
// v2 adds sha1 and complianceLevel, we do not need those
default:
reader.skipValue();
}
}

reader.endObject();

boolean[] clientServer = new boolean[] {false,false};
if(details != null) {
clientServer = readDetails(details);
}

if (id == null) throw new ParseException("Version id is required", reader);
if (type == null) throw new ParseException("Version type is required", reader);
Expand All @@ -203,11 +217,45 @@ private static void readVersions(JsonReader reader, Map<String, Version> version
// if (time == null) throw new ParseException("Version time is required", reader);
// if (releaseTime == null) throw new ParseException("Version release time is required", reader);

versions.put(id, new Version(id, type, url, time, releaseTime));
versions.put(id, new Version(id, type, url, time, releaseTime, clientServer[1], clientServer[0]));
}

reader.endArray();
}

private static boolean[] readDetails(String detailsUrl) throws MalformedURLException, IOException {
boolean[] clientServer = new boolean[] {false,false};
URL url = new URL(detailsUrl);
InputStreamReader stream = new InputStreamReader(Connections.openConnection(url).getInputStream(), StandardCharsets.UTF_8);
BufferedReader buf = new BufferedReader(stream);
try (JsonReader reader = JsonReader.json(buf)) {
if (reader.peek() != JsonToken.BEGIN_OBJECT) {
throw new ParseException("Description Meta was invalid type", reader);
}
reader.beginObject();
while (reader.hasNext()) {
String key = reader.nextName();

switch (key) {
case "client":
if (reader.peek() != JsonToken.BOOLEAN) {
throw new ParseException("Description client must be a boolean", reader);
}
clientServer[0] = reader.nextBoolean();
break;
case "server":
if (reader.peek() != JsonToken.BOOLEAN) {
throw new ParseException("Description server must be a boolean", reader);
}
clientServer[1] = reader.nextBoolean();
break;
default:
reader.skipValue();
}
}
}
return clientServer;
}

private VersionManifest(Version latestRelease, Version latestSnapshot, Map<String, Version> versions) {
this.latestRelease = latestRelease;
Expand Down Expand Up @@ -326,13 +374,17 @@ public static final class Version {
private final String url;
private final String time;
private final String releaseTime;
private final boolean serverVer;
private final boolean clientVer;

Version(String id, String type, String url, String time, String releaseTime) {
Version(String id, String type, String url, String time, String releaseTime, boolean serverVer, boolean clientVer) {
this.id = id;
this.type = type;
this.url = url;
this.time = time;
this.releaseTime = releaseTime;
this.serverVer = serverVer;
this.clientVer = clientVer;
}

public String id() {
Expand All @@ -354,5 +406,13 @@ public String time() {
public String releaseTime() {
return this.releaseTime;
}

public boolean hasClientVersion() {
return clientVer;
}

public boolean hasServerVersion() {
return serverVer;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,13 @@ static void populateMinecraftVersions(GameSide side, JComboBox<String> comboBox,
// Setup the combo box for Minecraft version selection
comboBox.removeAllItems();

manifest.parallelStream().filter(version -> version.type().equals("release")
manifest.parallelStream().filter(version -> (version.type().equals("release")
|| (version.type().equals("snapshot") && snapshots)
|| (version.type().equals("old_beta") && snapshots)
|| (version.type().equals("old_alpha") && snapshots)
|| (version.type().equals("alpha_server") && snapshots)
|| (version.type().equals("classic_server") && snapshots))
&& ((GameSide.CLIENT == side && version.hasClientVersion())) || (GameSide.SERVER == side && version.hasServerVersion()))
.map(VersionManifest.Version::id)
.filter(intermediaryVersions::containsKey)
.forEachOrdered(comboBox::addItem);
Expand Down