diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java index c8ef0807d..0de35cf20 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java @@ -111,8 +111,10 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { } @Override - public RemoteMod getModById(String id) { - throw new UnsupportedOperationException(); + public RemoteMod getModById(String id) throws IOException { + id = StringUtils.removePrefix(id, "local-"); + Project project = HttpRequest.GET(PREFIX + "/v2/project/" + id).getJson(Project.class); + return project.toMod(); } @Override @@ -139,7 +141,7 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { .map(name -> new Category(null, name, Collections.emptyList())); } - public static class Project { + public static class Project implements RemoteMod.IMod { private final String slug; private final String title; @@ -238,6 +240,39 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { public List getVersions() { return versions; } + + + @Override + public List loadDependencies(RemoteModRepository modRepository) throws IOException { + Set dependencies = modRepository.getRemoteVersionsById(getId()) + .flatMap(version -> version.getDependencies().stream()) + .collect(Collectors.toSet()); + List mods = new ArrayList<>(); + for (String dependencyId : dependencies) { + if (StringUtils.isNotBlank(dependencyId)) { + mods.add(modRepository.getModById(dependencyId)); + } + } + return mods; + } + + @Override + public Stream loadVersions(RemoteModRepository modRepository) throws IOException { + return modRepository.getRemoteVersionsById(getId()); + } + + public RemoteMod toMod() { + return new RemoteMod( + slug, + "", + title, + description, + categories, + null, + iconUrl, + (RemoteMod.IMod) this + ); + } } @Immutable @@ -416,7 +451,7 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { datePublished, type, files.get(0).toFile(), - dependencies.stream().map(Dependency::getProjectId).collect(Collectors.toList()), + dependencies.stream().map(Dependency::getProjectId).filter(Objects::nonNull).collect(Collectors.toList()), gameVersions, loaders.stream().flatMap(loader -> { if ("fabric".equalsIgnoreCase(loader)) return Stream.of(ModLoaderType.FABRIC); @@ -570,7 +605,16 @@ public final class ModrinthRemoteModRepository implements RemoteModRepository { @Override public List loadDependencies(RemoteModRepository modRepository) throws IOException { - return Collections.emptyList(); + Set dependencies = modRepository.getRemoteVersionsById(getProjectId()) + .flatMap(version -> version.getDependencies().stream()) + .collect(Collectors.toSet()); + List mods = new ArrayList<>(); + for (String dependencyId : dependencies) { + if (StringUtils.isNotBlank(dependencyId)) { + mods.add(modRepository.getModById(dependencyId)); + } + } + return mods; } @Override