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