Skip to content

Commit 2fb4ac6

Browse files
authored
forge|cf|modrinth: Forge promotions and maven URLs are configurable (#609)
1 parent 0857a7c commit 2fb4ac6

File tree

7 files changed

+101
-42
lines changed

7 files changed

+101
-42
lines changed

src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import me.itzg.helpers.files.ResultsFileWriter;
5353
import me.itzg.helpers.forge.ForgeInstaller;
5454
import me.itzg.helpers.forge.ForgeInstallerResolver;
55+
import me.itzg.helpers.forge.ForgeUrlArgs;
5556
import me.itzg.helpers.forge.NeoForgeInstallerResolver;
5657
import me.itzg.helpers.http.FailedRequestException;
5758
import me.itzg.helpers.http.Fetch;
@@ -129,6 +130,9 @@ public class CurseForgeInstaller {
129130
@Getter @Setter
130131
private CacheArgs cacheArgs;
131132

133+
@Getter @Setter
134+
private ForgeUrlArgs forgeUrlArgs;
135+
132136
/**
133137
*/
134138
public void installFromModpackZip(Path modpackZip, String slug) {
@@ -971,7 +975,8 @@ private void prepareFabric(String minecraftVersion, String loaderVersion) {
971975
private void prepareForge(SharedFetch sharedFetch, String minecraftVersion, String loaderVersion) {
972976
new ForgeInstaller(
973977
new ForgeInstallerResolver(sharedFetch,
974-
minecraftVersion, loaderVersion
978+
minecraftVersion, loaderVersion,
979+
forgeUrlArgs.getPromotionsUrl(), forgeUrlArgs.getMavenRepoUrl()
975980
)
976981
)
977982
.install(outputDir, resultsFile, forceReinstallModloader, "Forge");

src/main/java/me/itzg/helpers/curseforge/InstallCurseForgeCommand.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import me.itzg.helpers.curseforge.ModpacksPageUrlParser.Parsed;
1818
import me.itzg.helpers.files.ResultsFileWriter;
1919
import me.itzg.helpers.files.TabularOutput;
20+
import me.itzg.helpers.forge.ForgeUrlArgs;
2021
import me.itzg.helpers.http.PathOrUri;
2122
import me.itzg.helpers.http.PathOrUriConverter;
2223
import me.itzg.helpers.http.SharedFetchArgs;
@@ -167,6 +168,9 @@ static class Listed {
167168
@ArgGroup(exclusive = false)
168169
CacheArgs cacheArgs;
169170

171+
@ArgGroup(exclusive = false)
172+
ForgeUrlArgs forgeUrlArgs = new ForgeUrlArgs();
173+
170174
@Override
171175
public Integer call() throws Exception {
172176
// https://www.curseforge.com/minecraft/modpacks/all-the-mods-8/files
@@ -203,7 +207,8 @@ public Integer call() throws Exception {
203207
.setApiKey(apiKey)
204208
.setDownloadsRepo(downloadsRepo)
205209
.setDisableApiCaching(disableApiCaching)
206-
.setCacheArgs(cacheArgs);
210+
.setCacheArgs(cacheArgs)
211+
.setForgeUrlArgs(forgeUrlArgs);
207212

208213
if (apiBaseUrl != null) {
209214
installer.setApiBaseUrl(apiBaseUrl);

src/main/java/me/itzg/helpers/forge/ForgeInstallerResolver.java

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,31 @@
1515
import me.itzg.helpers.http.FailedRequestException;
1616
import me.itzg.helpers.http.SharedFetch;
1717
import me.itzg.helpers.http.Uris;
18+
import reactor.core.publisher.Flux;
19+
import reactor.core.publisher.Mono;
1820

1921
@Slf4j
2022
public class ForgeInstallerResolver implements InstallerResolver {
2123
public static final String LATEST = "latest";
2224
public static final String RECOMMENDED = "recommended";
25+
public static final String DEFAULT_PROMOTIONS_URL = "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json";
26+
public static final String DEFAULT_MAVEN_REPO_URL = "https://maven.minecraftforge.net";
2327

24-
private final static String promotionsUrl = "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json";
25-
private final static String mavenRepoUrl = "https://maven.minecraftforge.net";
28+
private final String promotionsUrl;
29+
private final String mavenRepoUrl;
2630
private final SharedFetch sharedFetch;
2731
private final String requestedMinecraftVersion;
2832
private final String requestedForgeVersion;
2933

3034
public ForgeInstallerResolver(SharedFetch sharedFetch,
31-
String requestedMinecraftVersion, String requestedForgeVersion
35+
String requestedMinecraftVersion, String requestedForgeVersion,
36+
String promotionsUrl, String mavenRepoUrl
3237
) {
3338
this.sharedFetch = sharedFetch;
3439
this.requestedMinecraftVersion = requestedMinecraftVersion;
3540
this.requestedForgeVersion = requestedForgeVersion;
41+
this.promotionsUrl = promotionsUrl;
42+
this.mavenRepoUrl = mavenRepoUrl;
3643
}
3744

3845
@Override
@@ -62,41 +69,35 @@ public Path download(String minecraftVersion, String forgeVersion, Path outputDi
6269
minecraftVersion, forgeVersion
6370
) +".jar");
6471

65-
boolean success = false;
66-
// every few major versions Forge would chane their version qualifier scheme :(
67-
for (final String installerUrlVersion : new String[]{
68-
String.join("-", minecraftVersion, forgeVersion),
69-
String.join("-", minecraftVersion, forgeVersion, minecraftVersion),
70-
String.join("-", minecraftVersion, forgeVersion, "mc172")
71-
}) {
72-
try {
73-
sharedFetch.fetch(Uris.populateToUri(
74-
mavenRepoUrl
75-
+ "/net/minecraftforge/forge/{version}/forge-{version}-installer.jar",
76-
installerUrlVersion, installerUrlVersion
77-
))
78-
.userAgentCommand("forge")
79-
.toFile(installerJar)
80-
.skipExisting(true)
81-
.acceptContentTypes(Collections.singletonList("application/java-archive"))
82-
.execute();
83-
success = true;
84-
break;
85-
} catch (FailedRequestException e){
86-
if (e.getStatusCode() != 404) {
87-
throw new RuntimeException("Trying to download forge installer", e);
88-
}
89-
}
90-
catch (IOException e) {
91-
throw new RuntimeException("Trying to download forge installer", e);
92-
}
93-
}
94-
95-
if (!success) {
72+
final Path result = Flux.just(
73+
// every few major versions Forge changes their version qualifier scheme
74+
String.join("-", minecraftVersion, forgeVersion),
75+
String.join("-", minecraftVersion, forgeVersion, minecraftVersion),
76+
String.join("-", minecraftVersion, forgeVersion, "mc172")
77+
)
78+
// concatMap ensures each is tried (to be found) before the next
79+
.concatMap(versionToTry ->
80+
sharedFetch.fetch(Uris.populateToUri(
81+
mavenRepoUrl
82+
+ "/net/minecraftforge/forge/{version}/forge-{version}-installer.jar",
83+
versionToTry, versionToTry
84+
))
85+
.toFile(installerJar)
86+
.skipExisting(true)
87+
.acceptContentTypes(Collections.singletonList("application/java-archive"))
88+
.assemble()
89+
.checkpoint("downloading installer jar for " + versionToTry)
90+
// just skip this one if not found
91+
.onErrorResume(FailedRequestException::isNotFound, throwable -> Mono.empty())
92+
)
93+
.blockFirst();
94+
95+
if (result == null) {
9696
throw new GenericException("Failed to locate forge installer");
9797
}
98-
99-
return installerJar;
98+
else {
99+
return result;
100+
}
100101
}
101102

102103
@Override
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package me.itzg.helpers.forge;
2+
3+
import picocli.CommandLine.Option;
4+
5+
public class ForgeUrlArgs {
6+
7+
@Option(names = "--forge-promotions-url", paramLabel = "URL",
8+
defaultValue = "${FORGE_PROMOTIONS_URL:-" + ForgeInstallerResolver.DEFAULT_PROMOTIONS_URL + "}",
9+
description = "URL for Forge promotions JSON.%n"
10+
+ "Can also be set via env var FORGE_PROMOTIONS_URL%n"
11+
+ "Default is ${DEFAULT-VALUE}"
12+
)
13+
String promotionsUrl;
14+
15+
public String getPromotionsUrl() {
16+
return promotionsUrl != null ? promotionsUrl : ForgeInstallerResolver.DEFAULT_PROMOTIONS_URL;
17+
}
18+
19+
@Option(names = "--forge-maven-repo-url", paramLabel = "URL",
20+
defaultValue = "${FORGE_MAVEN_REPO_URL:-" + ForgeInstallerResolver.DEFAULT_MAVEN_REPO_URL + "}",
21+
description = "URL for Forge Maven repository where installer is downloaded.%n"
22+
+ "Can also be set via env var FORGE_MAVEN_REPO_URL%n"
23+
+ "Default is ${DEFAULT-VALUE}"
24+
)
25+
String mavenRepoUrl;
26+
27+
public String getMavenRepoUrl() {
28+
return mavenRepoUrl != null ? mavenRepoUrl : ForgeInstallerResolver.DEFAULT_MAVEN_REPO_URL;
29+
}
30+
}

src/main/java/me/itzg/helpers/forge/InstallForgeCommand.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void setVersion(String version) {
6868
this.version = version.toLowerCase();
6969
}
7070

71-
@Option(names = "--forge-installer", description = "Use a local forge installer")
71+
@Option(names = "--forge-installer", description = "Use a local forge installer", paramLabel = "FILE")
7272
Path installer;
7373
}
7474

@@ -89,14 +89,20 @@ public void setVersion(String version) {
8989
@ArgGroup(exclusive = false)
9090
SharedFetchArgs sharedFetchArgs = new SharedFetchArgs();
9191

92+
@ArgGroup(exclusive = false)
93+
ForgeUrlArgs forgeUrlArgs = new ForgeUrlArgs();
94+
9295
@Override
9396
public Integer call() throws Exception {
9497
try (SharedFetch sharedFetch = Fetch.sharedFetch("install-forge", sharedFetchArgs.options())) {
9598

9699
final ForgeInstaller installer = new ForgeInstaller(
97100
versionOrInstaller.installer != null ?
98101
new ProvidedInstallerResolver(versionOrInstaller.installer)
99-
: new ForgeInstallerResolver(sharedFetch, minecraftVersion, versionOrInstaller.version)
102+
: new ForgeInstallerResolver(
103+
sharedFetch, minecraftVersion, versionOrInstaller.version,
104+
forgeUrlArgs.getPromotionsUrl(), forgeUrlArgs.getMavenRepoUrl()
105+
)
100106

101107
);
102108

src/main/java/me/itzg/helpers/modrinth/InstallModrinthModpackCommand.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import me.itzg.helpers.errors.InvalidParameterException;
1313
import me.itzg.helpers.files.Manifests;
1414
import me.itzg.helpers.files.ResultsFileWriter;
15+
import me.itzg.helpers.forge.ForgeUrlArgs;
1516
import me.itzg.helpers.http.Fetch;
1617
import me.itzg.helpers.http.PathOrUri;
1718
import me.itzg.helpers.http.PathOrUriConverter;
@@ -21,6 +22,7 @@
2122
import me.itzg.helpers.modrinth.model.VersionType;
2223
import org.jetbrains.annotations.VisibleForTesting;
2324
import picocli.CommandLine;
25+
import picocli.CommandLine.ArgGroup;
2426
import picocli.CommandLine.ExitCode;
2527
import picocli.CommandLine.Option;
2628
import reactor.core.publisher.Mono;
@@ -116,6 +118,9 @@ public class InstallModrinthModpackCommand implements Callable<Integer> {
116118
@CommandLine.ArgGroup(exclusive = false)
117119
SharedFetchArgs sharedFetchArgs = new SharedFetchArgs();
118120

121+
@ArgGroup(exclusive = false)
122+
ForgeUrlArgs forgeUrlArgs = new ForgeUrlArgs();
123+
119124
@Override
120125
public Integer call() throws IOException {
121126

@@ -221,7 +226,8 @@ ModrinthPackInstaller create(ModrinthApiClient apiClient, Path mrPackFile,
221226
mrPackFile, this.outputDirectory, this.resultsFile,
222227
this.forceModloaderReinstall,
223228
fileInclusionCalculator
224-
);
229+
)
230+
.setForgeUrlArgs(forgeUrlArgs);
225231

226232
private Mono<Installation> processResultsFile(FetchedPack fetchedPack, Installation installation) {
227233
return Mono.fromCallable(() -> {

src/main/java/me/itzg/helpers/modrinth/ModrinthPackInstaller.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.stream.Collectors;
1414
import java.util.stream.Stream;
1515
import java.util.zip.ZipFile;
16+
import lombok.Setter;
1617
import lombok.extern.slf4j.Slf4j;
1718
import me.itzg.helpers.errors.GenericException;
1819
import me.itzg.helpers.errors.InvalidParameterException;
@@ -21,6 +22,7 @@
2122
import me.itzg.helpers.files.IoStreams;
2223
import me.itzg.helpers.forge.ForgeInstaller;
2324
import me.itzg.helpers.forge.ForgeInstallerResolver;
25+
import me.itzg.helpers.forge.ForgeUrlArgs;
2426
import me.itzg.helpers.forge.NeoForgeInstallerResolver;
2527
import me.itzg.helpers.http.SharedFetch;
2628
import me.itzg.helpers.http.SharedFetch.Options;
@@ -44,6 +46,8 @@ public class ModrinthPackInstaller {
4446
private final boolean forceModloaderReinstall;
4547
private final FileInclusionCalculator fileInclusionCalculator;
4648
private final Options sharedFetchOpts;
49+
@Setter
50+
private ForgeUrlArgs forgeUrlArgs = new ForgeUrlArgs();
4751

4852
private AntPathMatcher overridesExclusions;
4953

@@ -262,7 +266,9 @@ private void prepareFabric(SharedFetch sharedFetch, String minecraftVersion, Str
262266

263267
private void prepareForge(SharedFetch sharedFetch, String minecraftVersion, String version) {
264268
new ForgeInstaller(
265-
new ForgeInstallerResolver(sharedFetch, minecraftVersion, version)
269+
new ForgeInstallerResolver(sharedFetch, minecraftVersion, version,
270+
forgeUrlArgs.getPromotionsUrl(), forgeUrlArgs.getMavenRepoUrl()
271+
)
266272
)
267273
.install(
268274
this.outputDirectory,

0 commit comments

Comments
 (0)