Skip to content
Merged
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 dev/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
http-client.private.env.json
34 changes: 34 additions & 0 deletions dev/curseforge.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
###
GET https://api.curseforge.com/v1/categories?gameId=432&classesOnly=true
x-api-key: {{cfApiKey}}

<> 2023-04-01T131517.200.json
<> 2023-03-30T083426.200.json

###
GET https://api.curseforge.com/v1/mods/350464
x-api-key: {{cfApiKey}}

###
GET https://api.curseforge.com/v1/mods/694605/files/4098018/download-url
x-api-key: {{cfApiKey}}

###
GET https://api.curseforge.com/v1/mods/369096/files/4560441
x-api-key: {{cfApiKey}}

<> 2023-04-01T192357.200.json

###
GET https://api.curseforge.com/v1/mods/622737/files/4560441
x-api-key: {{cfApiKey}}

<> 2023-03-30T081023.200.json
<> 2023-03-30T075419.200.json
<> 2023-03-30T074422.200.json

###
GET https://api.curseforge.com/v1/mods/707734/files/4415193
x-api-key: {{cfApiKey}}

<> 2023-03-30T080528.403.html
21 changes: 21 additions & 0 deletions dev/purpur.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
###
GET https://api.purpurmc.org/v2/purpur/1.20
User-Agent: mc-image-helper

<> f-3.txt
<> f-2.txt

###
GET https://api.purpurmc.org/v2/purpur/1.19.4/1985
User-Agent: mc-image-helper

<> 2023-06-13T204234.200.json

###
GET https://api.purpurmc.org/v2/purpur/1.19.4/1985/download
User-Agent: mc-image-helper

<> purpur-1.19.4-1985.jar
<> 2023-06-13T170922.200.json
<> f-1.txt
<> f.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void close() {
preparedFetch.close();
}

public CategoryInfo loadCategoryInfo(Set<String> applicableClassIdSlugs, String categorySlug) {
CategoryInfo loadModpacksCategoryInfo(Set<String> applicableClassIdSlugs) {
return preparedFetch
// get only categories that are classes, like mc-mods
.fetch(uriBuilder.resolve("/categories?gameId={gameId}&classesOnly=true", gameId))
Expand All @@ -67,7 +67,7 @@ public CategoryInfo loadCategoryInfo(Set<String> applicableClassIdSlugs, String
if (applicableClassIdSlugs.contains(category.getSlug())) {
contentClassIds.put(category.getId(), category);
}
if (category.getSlug().equals(categorySlug)) {
if (category.getSlug().equals(CurseForgeInstaller.CATEGORY_SLUG_MODPACKS)) {
modpackClassId = category.getId();
}
}
Expand All @@ -82,7 +82,7 @@ public CategoryInfo loadCategoryInfo(Set<String> applicableClassIdSlugs, String
.block();
}

public CurseForgeMod searchMod(String slug, CategoryInfo categoryInfo) {
CurseForgeMod searchMod(String slug, CategoryInfo categoryInfo) {
final ModsSearchResponse searchResponse = preparedFetch.fetch(
uriBuilder.resolve("/mods/search?gameId={gameId}&slug={slug}&classId={classId}",
gameId, slug, categoryInfo.modpackClassId
Expand Down Expand Up @@ -130,7 +130,7 @@ public CurseForgeFile resolveModpackFile(
});
}

public Mono<Integer> slugToId(CategoryInfo categoryInfo,
Mono<Integer> slugToId(CategoryInfo categoryInfo,
String slug
) {
return preparedFetch
Expand Down Expand Up @@ -158,6 +158,7 @@ public Mono<CurseForgeMod> getModInfo(
)
.toObject(GetModResponse.class)
.assemble()
.checkpoint("Getting mod info for " + projectID)
.map(GetModResponse::getData);
}

Expand Down
51 changes: 32 additions & 19 deletions src/main/java/me/itzg/helpers/curseforge/CurseForgeInstaller.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,41 @@
package me.itzg.helpers.curseforge;

import static java.util.Collections.emptySet;
import static java.util.Objects.requireNonNull;
import static java.util.Optional.ofNullable;
import static me.itzg.helpers.singles.MoreCollections.safeStreamFrom;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import me.itzg.helpers.curseforge.ExcludeIncludesContent.ExcludeIncludes;
import me.itzg.helpers.curseforge.model.*;
import me.itzg.helpers.curseforge.model.Category;
import me.itzg.helpers.curseforge.model.CurseForgeFile;
import me.itzg.helpers.curseforge.model.CurseForgeMod;
import me.itzg.helpers.curseforge.model.ManifestFileRef;
import me.itzg.helpers.curseforge.model.ManifestType;
import me.itzg.helpers.curseforge.model.MinecraftModpackManifest;
import me.itzg.helpers.curseforge.model.ModLoader;
import me.itzg.helpers.errors.GenericException;
import me.itzg.helpers.errors.InvalidParameterException;
import me.itzg.helpers.fabric.FabricLauncherInstaller;
Expand All @@ -20,22 +49,6 @@
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import static java.util.Collections.emptySet;
import static java.util.Objects.requireNonNull;
import static java.util.Optional.ofNullable;
import static me.itzg.helpers.singles.MoreCollections.safeStreamFrom;

@RequiredArgsConstructor
@Slf4j
public class CurseForgeInstaller {
Expand Down Expand Up @@ -131,7 +144,7 @@ public void install(String slug, String fileMatcher, Integer fileId) throws IOEx
);
}

protected void install(String slug, InstallationEntryPoint entryPoint) throws IOException {
void install(String slug, InstallationEntryPoint entryPoint) throws IOException {
requireNonNull(outputDir, "outputDir is required");
requireNonNull(slug);
requireNonNull(entryPoint);
Expand Down Expand Up @@ -160,7 +173,7 @@ protected void install(String slug, InstallationEntryPoint entryPoint) throws IO
MINECRAFT_GAME_ID
)
) {
final CategoryInfo categoryInfo = cfApi.loadCategoryInfo(applicableClassIdSlugs, CATEGORY_SLUG_MODPACKS);
final CategoryInfo categoryInfo = cfApi.loadModpacksCategoryInfo(applicableClassIdSlugs);

entryPoint.install(
new InstallContext(slug, cfApi, categoryInfo, manifest)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,6 @@
package me.itzg.helpers.curseforge;

import me.itzg.helpers.files.ResultsFileWriter;
import me.itzg.helpers.files.TabularOutput;
import me.itzg.helpers.http.PathOrUri;
import me.itzg.helpers.http.PathOrUriConverter;
import me.itzg.helpers.http.SharedFetchArgs;
import me.itzg.helpers.json.ObjectMappers;
import picocli.CommandLine.ArgGroup;
import picocli.CommandLine.Command;
import picocli.CommandLine.ExitCode;
import picocli.CommandLine.Option;
import static me.itzg.helpers.http.Fetch.fetch;

import java.io.BufferedWriter;
import java.io.IOException;
Expand All @@ -22,8 +13,16 @@
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static me.itzg.helpers.http.Fetch.fetch;
import me.itzg.helpers.files.ResultsFileWriter;
import me.itzg.helpers.files.TabularOutput;
import me.itzg.helpers.http.PathOrUri;
import me.itzg.helpers.http.PathOrUriConverter;
import me.itzg.helpers.http.SharedFetchArgs;
import me.itzg.helpers.json.ObjectMappers;
import picocli.CommandLine.ArgGroup;
import picocli.CommandLine.Command;
import picocli.CommandLine.ExitCode;
import picocli.CommandLine.Option;

@Command(name = "install-curseforge", subcommands = {
SchemasCommand.class
Expand Down Expand Up @@ -228,7 +227,7 @@ public Integer call() throws Exception {
System.err.println("Some mod authors disallow automated downloads.");
System.err.println("The following need to be manually downloaded into the repo or excluded:");
if (needsDownloadFile != null) {
System.err.printf("(Also written to %s%n", needsDownloadFile);
System.err.printf("(Also written to %s)%n", needsDownloadFile);
}
System.err.println();
final PrintWriter out = new PrintWriter(System.err);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ public enum ModLoaderType {
Cauldron,
LiteLoader,
Fabric,
Quilt;
Quilt,
// undocumented as of 2023-07-23 but referenced in https://www.curseforge.com/minecraft/mc-mods/chimes/files/4671986
NeoForge;

@JsonValue
public int toValue() {
Expand Down