From d34728f3474f435ebed7e4a9c3ef1724b8a55d37 Mon Sep 17 00:00:00 2001 From: comp500 Date: Sun, 5 Jun 2022 04:39:51 +0100 Subject: [PATCH] Add support for CF files marked with Quilt (fixes #127) --- curseforge/curseforge.go | 44 ++++++++++++++++++++++++++++++---------- curseforge/install.go | 18 ++++++++-------- curseforge/request.go | 11 ++++++++++ 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/curseforge/curseforge.go b/curseforge/curseforge.go index f24e069..2d48bca 100644 --- a/curseforge/curseforge.go +++ b/curseforge/curseforge.go @@ -214,7 +214,7 @@ func createModFile(modInfo modInfo, fileInfo modFileInfo, index *core.Index, opt return index.RefreshFileWithHash(path, format, hash, true) } -func getLoader(pack core.Pack) int { +func getSearchLoaderType(pack core.Pack) int { dependencies := pack.Versions _, hasFabric := dependencies["fabric"] @@ -222,8 +222,12 @@ func getLoader(pack core.Pack) int { _, hasForge := dependencies["forge"] if (hasFabric || hasQuilt) && hasForge { return modloaderTypeAny - } else if hasFabric || hasQuilt { // Backwards-compatible; for now (could be configurable later) + } else if hasFabric || hasQuilt { return modloaderTypeFabric + } else if hasQuilt { + // Backwards-compatible with Fabric for now (could be configurable later) + // since we can't filter by more than one loader, just accept any and filter the response + return modloaderTypeAny } else if hasForge { return modloaderTypeForge } else { @@ -231,23 +235,41 @@ func getLoader(pack core.Pack) int { } } -func matchLoaderType(packLoaderType int, modLoaderType int) bool { - if packLoaderType == modloaderTypeAny || modLoaderType == modloaderTypeAny { +func getLoaders(pack core.Pack) (loaders []string) { + _, hasFabric := pack.Versions["fabric"] + if hasFabric { + loaders = append(loaders, "fabric") + } + if _, hasQuilt := pack.Versions["quilt"]; hasQuilt { + // Backwards-compatible with Fabric for now (could be configurable later) + if !hasFabric { + loaders = append(loaders, "fabric") + } + loaders = append(loaders, "quilt") + } + if _, hasForge := pack.Versions["forge"]; hasForge { + loaders = append(loaders, "forge") + } + return +} + +func matchLoaderType(packLoaders []string, modLoaderType int) bool { + if len(packLoaders) == 0 || modLoaderType == modloaderTypeAny { return true } else { - return packLoaderType == modLoaderType + return slices.Contains(packLoaders, modloaderIds[modLoaderType]) } } -func matchLoaderTypeFileInfo(packLoaderType int, fileInfoData modFileInfo) bool { - if packLoaderType == modloaderTypeAny { +func matchLoaderTypeFileInfo(packLoaders []string, fileInfoData modFileInfo) bool { + if len(packLoaders) == 0 { return true } else { containsLoader := false for i, name := range modloaderNames { if slices.Contains(fileInfoData.GameVersions, name) { containsLoader = true - if i == packLoaderType { + if slices.Contains(packLoaders, modloaderIds[i]) { return true } } @@ -339,7 +361,7 @@ func (u cfUpdater) CheckUpdate(mods []core.Mod, mcVersion string, pack core.Pack } } - packLoaderType := getLoader(pack) + packLoaders := getLoaders(pack) for i, v := range mods { projectRaw, ok := v.GetParsedUpdateData("curseforge") @@ -358,7 +380,7 @@ func (u cfUpdater) CheckUpdate(mods []core.Mod, mcVersion string, pack core.Pack // For snapshots, curseforge doesn't put them in GameVersionLatestFiles for _, v := range modInfos[i].LatestFiles { // Choose "newest" version by largest ID - if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID && matchLoaderTypeFileInfo(packLoaderType, v) { + if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID && matchLoaderTypeFileInfo(packLoaders, v) { updateAvailable = true fileID = v.ID fileInfoData = v @@ -371,7 +393,7 @@ func (u cfUpdater) CheckUpdate(mods []core.Mod, mcVersion string, pack core.Pack // TODO: change to timestamp-based comparison?? // TODO: manage alpha/beta/release correctly, check update channel? // Choose "newest" version by largest ID - if matchGameVersion(mcVersion, file.GameVersion) && file.ID > fileID && matchLoaderType(packLoaderType, file.Modloader) { + if matchGameVersion(mcVersion, file.GameVersion) && file.ID > fileID && matchLoaderType(packLoaders, file.Modloader) { updateAvailable = true fileID = file.ID fileName = file.Name diff --git a/curseforge/install.go b/curseforge/install.go index dc2ce22..4db1354 100644 --- a/curseforge/install.go +++ b/curseforge/install.go @@ -89,9 +89,9 @@ var installCmd = &cobra.Command{ var cancelled bool if slug == "" { searchTerm := strings.Join(args, " ") - cancelled, modInfoData = searchCurseforgeInternal(searchTerm, false, game, category, mcVersion, getLoader(pack)) + cancelled, modInfoData = searchCurseforgeInternal(searchTerm, false, game, category, mcVersion, getSearchLoaderType(pack)) } else { - cancelled, modInfoData = searchCurseforgeInternal(slug, true, game, category, mcVersion, getLoader(pack)) + cancelled, modInfoData = searchCurseforgeInternal(slug, true, game, category, mcVersion, getSearchLoaderType(pack)) } if cancelled { return @@ -114,7 +114,7 @@ var installCmd = &cobra.Command{ } var fileInfoData modFileInfo - fileInfoData, err = getLatestFile(modInfoData, mcVersion, fileID, getLoader(pack)) + fileInfoData, err = getLatestFile(modInfoData, mcVersion, fileID, getLoaders(pack)) if err != nil { fmt.Printf("Failed to get file for project: %v\n", err) os.Exit(1) @@ -187,7 +187,7 @@ var installCmd = &cobra.Command{ depIDPendingQueue = depIDPendingQueue[:0] for _, currData := range depInfoData { - depFileInfo, err := getLatestFile(currData, mcVersion, 0, getLoader(pack)) + depFileInfo, err := getLatestFile(currData, mcVersion, 0, getLoaders(pack)) if err != nil { fmt.Printf("Error retrieving dependency data: %s\n", err.Error()) continue @@ -278,7 +278,7 @@ func (r modResultsList) Len() int { return len(r) } -func searchCurseforgeInternal(searchTerm string, isSlug bool, game string, category string, mcVersion string, packLoaderType int) (bool, modInfo) { +func searchCurseforgeInternal(searchTerm string, isSlug bool, game string, category string, mcVersion string, searchLoaderType int) (bool, modInfo) { if isSlug { fmt.Println("Looking up CurseForge slug...") } else { @@ -351,7 +351,7 @@ func searchCurseforgeInternal(searchTerm string, isSlug bool, game string, categ } else { search = searchTerm } - results, err := cfDefaultClient.getSearch(search, slug, gameID, classID, categoryID, filterGameVersion, packLoaderType) + results, err := cfDefaultClient.getSearch(search, slug, gameID, classID, categoryID, filterGameVersion, searchLoaderType) if err != nil { fmt.Printf("Failed to search for project: %v\n", err) os.Exit(1) @@ -409,7 +409,7 @@ func searchCurseforgeInternal(searchTerm string, isSlug bool, game string, categ } } -func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoaderType int) (modFileInfo, error) { +func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoaders []string) (modFileInfo, error) { if fileID == 0 { var fileInfoData modFileInfo fileInfoObtained := false @@ -419,7 +419,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoader for _, v := range modInfoData.LatestFiles { anyFileObtained = true // Choose "newest" version by largest ID - if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID && matchLoaderTypeFileInfo(packLoaderType, v) { + if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID && matchLoaderTypeFileInfo(packLoaders, v) { fileID = v.ID fileInfoData = v fileInfoObtained = true @@ -429,7 +429,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoader 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) { + if matchGameVersion(mcVersion, v.GameVersion) && v.ID > fileID && matchLoaderType(packLoaders, v.Modloader) { fileID = v.ID fileInfoObtained = false // Make sure we get the file info } diff --git a/curseforge/request.go b/curseforge/request.go index b4dcf7b..e367796 100644 --- a/curseforge/request.go +++ b/curseforge/request.go @@ -110,6 +110,7 @@ const ( modloaderTypeCauldron modloaderTypeLiteloader modloaderTypeFabric + modloaderTypeQuilt ) var modloaderNames = [...]string{ @@ -118,6 +119,16 @@ var modloaderNames = [...]string{ "Cauldron", "Liteloader", "Fabric", + "Quilt", +} + +var modloaderIds = [...]string{ + "", + "forge", + "cauldron", + "liteloader", + "fabric", + "quilt", } //noinspection GoUnusedConst