Skip to content

Commit 4270ad1

Browse files
authored
cf-files: improve the logging of missing dependencies especially optional ones (#464)
1 parent 0ed6eb4 commit 4270ad1

File tree

2 files changed

+75
-9
lines changed

2 files changed

+75
-9
lines changed

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

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import me.itzg.helpers.curseforge.model.CurseForgeFile;
2121
import me.itzg.helpers.curseforge.model.CurseForgeMod;
2222
import me.itzg.helpers.curseforge.model.FileDependency;
23+
import me.itzg.helpers.curseforge.model.FileRelationType;
2324
import me.itzg.helpers.curseforge.model.ModLoaderType;
2425
import me.itzg.helpers.errors.GenericException;
2526
import me.itzg.helpers.errors.InvalidParameterException;
@@ -34,6 +35,8 @@
3435
import reactor.core.publisher.Flux;
3536
import reactor.core.publisher.Mono;
3637
import reactor.core.scheduler.Schedulers;
38+
import reactor.util.function.Tuple2;
39+
import reactor.util.function.Tuples;
3740

3841
@Command(name = "curseforge-files", description = "Download and manage individual mod/plugin files from CurseForge")
3942
@Slf4j
@@ -168,31 +171,70 @@ private Mono<List<FileEntry>> processModFileRefs(CategoryInfo categoryInfo,
168171

169172
return Flux.fromIterable(modFiles)
170173
.flatMap(modFile -> {
171-
for (final FileDependency dependency : modFile.getDependencies()) {
172-
if (!requestedModIds.contains(dependency.getModId())) {
173-
log.warn("The mod file {} depends on mod project ID {}, but that is not listed",
174-
modFile.getDisplayName(), dependency.getModId()
175-
);
176-
}
177-
}
174+
175+
final Mono<FileEntry> retrieval;
178176
final ModFileIds modFileIds = idsFrom(modFile);
179177
final FileEntry entry = previousFiles.get(modFileIds);
180178
if (entry != null
181179
&& Files.exists(outputDir.resolve(entry.getFilePath()))
182180
) {
183181
log.debug("Mod file {} already exists at {}", modFile.getFileName(), entry.getFilePath());
184-
return Mono.just(entry);
182+
retrieval = Mono.just(entry);
185183
}
186184
else {
187-
return retrieveModFile(apiClient, categoryInfo, modFile)
185+
retrieval = retrieveModFile(apiClient, categoryInfo, modFile)
188186
.map(path -> new FileEntry(modFileIds, outputDir.relativize(path).toString()));
189187
}
188+
189+
return reportMissingDependencies(apiClient, modFile, requestedModIds)
190+
.then(retrieval);
190191
});
191192
}
192193
)
193194
.collectList();
194195
}
195196

197+
/**
198+
*
199+
* @return flux of missing, required dependencies
200+
*/
201+
private static Flux<Tuple2<CurseForgeMod, FileDependency>> reportMissingDependencies(CurseForgeApiClient apiClient,
202+
CurseForgeFile modFile, Set<Integer> requestedModIds
203+
) {
204+
return Flux.fromIterable(modFile.getDependencies())
205+
.mapNotNull(dependency -> {
206+
if (!requestedModIds.contains(dependency.getModId())) {
207+
switch (dependency.getRelationType()) {
208+
case RequiredDependency:
209+
case OptionalDependency:
210+
return dependency;
211+
default:
212+
return null;
213+
}
214+
}
215+
else {
216+
return null;
217+
}
218+
})
219+
.flatMap(dependency ->
220+
apiClient.getModInfo(dependency.getModId())
221+
.map(curseForgeMod -> Tuples.of(curseForgeMod, dependency))
222+
)
223+
.doOnNext(missingDep -> {
224+
if (missingDep.getT2().getRelationType() == FileRelationType.RequiredDependency) {
225+
log.warn("The mod file '{}' depends on mod project '{}' at {}, but it is not listed",
226+
modFile.getDisplayName(), missingDep.getT1().getName(), missingDep.getT1().getLinks().getWebsiteUrl()
227+
);
228+
}
229+
else if (missingDep.getT2().getRelationType() == FileRelationType.OptionalDependency) {
230+
log.debug("The mod file '{}' optionally depends on mod project '{}', but it is not listed",
231+
modFile.getDisplayName(), missingDep.getT1().getName()
232+
);
233+
}
234+
})
235+
.filter(missingDep -> missingDep.getT2().getRelationType() == FileRelationType.RequiredDependency);
236+
}
237+
196238
@NotNull
197239
private static Map<ModFileIds, FileEntry> buildPreviousFilesFromManifest(CurseForgeFilesManifest oldManifest) {
198240
return oldManifest != null ?
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name" : "v1_mods_31043",
3+
"request" : {
4+
"url" : "/v1/mods/31043",
5+
"method" : "GET"
6+
},
7+
"response" : {
8+
"status" : 200,
9+
"jsonBody" : {
10+
"data": {
11+
"name": "WorldEdit for Bukkit",
12+
"links": {
13+
"websiteUrl": "https://www.curseforge.com/minecraft/bukkit-plugins/worldedit",
14+
"wikiUrl": "https://worldedit.enginehub.org/en/latest/",
15+
"issuesUrl": "https://github.com/EngineHub/WorldEdit/issues",
16+
"sourceUrl": "https://github.com/EngineHub/WorldEdit"
17+
}
18+
}
19+
},
20+
"headers" : {
21+
"Content-Type" : "application/json; charset=utf-8"
22+
}
23+
}
24+
}

0 commit comments

Comments
 (0)