diff --git a/src/main/java/me/itzg/helpers/curseforge/CurseForgeApiClient.java b/src/main/java/me/itzg/helpers/curseforge/CurseForgeApiClient.java
index e4770748..0f13021f 100644
--- a/src/main/java/me/itzg/helpers/curseforge/CurseForgeApiClient.java
+++ b/src/main/java/me/itzg/helpers/curseforge/CurseForgeApiClient.java
@@ -35,6 +35,9 @@
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
+/**
+ * Implements parts of the CurseForge REST API
+ */
@Slf4j
public class CurseForgeApiClient implements AutoCloseable {
@@ -185,25 +188,6 @@ public CurseForgeFile resolveModpackFile(
});
}
- Mono slugToId(CategoryInfo categoryInfo,
- String slug
- ) {
- return preparedFetch
- .fetch(
- uriBuilder.resolve("/v1/mods/search?gameId={gameId}&slug={slug}", gameId, slug)
- )
- .toObject(ModsSearchResponse.class)
- .assemble()
- .map(resp ->
- resp.getData().stream()
- .filter(curseForgeMod -> categoryInfo.contentClassIds.containsKey(curseForgeMod.getClassId()))
- .findFirst()
- .map(CurseForgeMod::getId)
- .orElseThrow(() -> new GenericException("Unable to resolve slug into ID (no matches): " + slug))
- )
- .onErrorMap(FailedRequestException::isForbidden, this::errorMapForbidden);
- }
-
public Mono getModInfo(
int projectID
) {
diff --git a/src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java b/src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java
index 53595659..a9d0f36f 100644
--- a/src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java
+++ b/src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java
@@ -637,15 +637,18 @@ private ExcludeIncludeIds resolveExcludeIncludes(InstallContext context) {
final ExcludeIncludes specific =
excludeIncludes.getModpacks() != null ? excludeIncludes.getModpacks().get(context.slug) : null;
+ final int modsClassId = context.categoryInfo.getClassIdForSlug(CurseForgeApiClient.CATEGORY_MC_MODS);
+
return Mono.zip(
resolveFromSlugOrIds(
- context, context.categoryInfo,
+ context,
+ modsClassId,
excludeIncludes.getGlobalExcludes(),
specific != null ? specific.getExcludes() : null
),
resolveFromSlugOrIds(
- context, context.categoryInfo,
- excludeIncludes.getGlobalForceIncludes(),
+ context,
+ modsClassId, excludeIncludes.getGlobalForceIncludes(),
specific != null ? specific.getForceIncludes() : null
)
)
@@ -656,8 +659,8 @@ private ExcludeIncludeIds resolveExcludeIncludes(InstallContext context) {
}
private Mono> resolveFromSlugOrIds(
- InstallContext context, CategoryInfo categoryInfo,
- Collection global, Collection specific
+ InstallContext context,
+ int modsClassId, Collection global, Collection specific
) {
log.trace("Resolving slug|id into IDs global={} specific={}", global, specific);
@@ -668,10 +671,12 @@ private Mono> resolveFromSlugOrIds(
)
.flatMap(s -> {
try {
+ // Is it an integer already? If not, it'll drop into catch-block below
final int id = Integer.parseInt(s);
return Mono.just(id);
} catch (NumberFormatException e) {
- return context.cfApi.slugToId(categoryInfo, s);
+ return context.cfApi.searchMod(s, modsClassId)
+ .map(CurseForgeMod::getId);
}
})
.collect(Collectors.toSet());
diff --git a/src/main/java/me/itzg/helpers/curseforge/model/package-info.java b/src/main/java/me/itzg/helpers/curseforge/model/package-info.java
new file mode 100644
index 00000000..c6951c9f
--- /dev/null
+++ b/src/main/java/me/itzg/helpers/curseforge/model/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Maps data model for CurseForge REST API
+ */
+package me.itzg.helpers.curseforge.model;
\ No newline at end of file