diff --git a/curseforge/install.go b/curseforge/install.go index b25dc80..1f4bdf1 100644 --- a/curseforge/install.go +++ b/curseforge/install.go @@ -334,12 +334,14 @@ func searchCurseforgeInternal(args []string, mcVersion string, packLoaderType in } func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoaderType int) (modFileInfo, error) { + anyFileObtained := false // For snapshots, curseforge doesn't put them in GameVersionLatestFiles if fileID == 0 { var fileInfoData modFileInfo fileInfoObtained := false for _, v := range modInfoData.LatestFiles { + anyFileObtained = true // Choose "newest" version by largest ID if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID && matchLoaderTypeFileInfo(packLoaderType, v) { fileID = v.ID @@ -349,6 +351,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoader } // TODO: change to timestamp-based comparison?? for _, v := range modInfoData.GameVersionLatestFiles { + anyFileObtained = true // Choose "newest" version by largest ID if matchGameVersion(mcVersion, v.GameVersion) && v.ID > fileID && matchLoaderType(packLoaderType, v.Modloader) { fileID = v.ID @@ -360,6 +363,10 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoader } } + if !anyFileObtained { + return modFileInfo{}, fmt.Errorf("addon %d has no files", modInfoData.ID) + } + if fileID == 0 { return modFileInfo{}, errors.New("mod not available for the configured Minecraft version(s) (use the acceptable-game-versions option to accept more) or loader") } diff --git a/curseforge/request.go b/curseforge/request.go index 96d6c02..eba4931 100644 --- a/curseforge/request.go +++ b/curseforge/request.go @@ -168,6 +168,9 @@ func getModInfo(modID int) (modInfo, error) { if err != nil { return modInfo{}, err } + if resp.StatusCode != 200 { + return modInfo{}, fmt.Errorf("failed to request addon ID %d: %s", modID, resp.Status) + } err = json.NewDecoder(resp.Body).Decode(&infoRes) if err != nil && err != io.EOF { @@ -175,7 +178,7 @@ func getModInfo(modID int) (modInfo, error) { } if infoRes.ID != modID { - return modInfo{}, fmt.Errorf("unexpected addon ID in CurseForge response: %d/%d", modID, infoRes.ID) + return modInfo{}, fmt.Errorf("unexpected addon ID in CurseForge response: %d (expected %d)", infoRes.ID, modID) } return infoRes, nil @@ -303,6 +306,9 @@ func getFileInfo(modID int, fileID int) (modFileInfo, error) { if err != nil { return modFileInfo{}, err } + if resp.StatusCode != 200 { + return modFileInfo{}, fmt.Errorf("failed to request file ID %d for addon %d: %s", fileID, modID, resp.Status) + } err = json.NewDecoder(resp.Body).Decode(&infoRes) if err != nil && err != io.EOF { @@ -310,7 +316,7 @@ func getFileInfo(modID int, fileID int) (modFileInfo, error) { } if infoRes.ID != fileID { - return modFileInfo{}, fmt.Errorf("unexpected file ID in CurseForge response: %d/%d", modID, infoRes.ID) + return modFileInfo{}, fmt.Errorf("unexpected file ID for addon %d in CurseForge response: %d (expected %d)", modID, infoRes.ID, fileID) } return infoRes, nil