Add support for CF files marked with Quilt (fixes #127)

This commit is contained in:
comp500 2022-06-05 04:39:51 +01:00
parent 57b554d5e3
commit d34728f347
3 changed files with 53 additions and 20 deletions

View File

@ -214,7 +214,7 @@ func createModFile(modInfo modInfo, fileInfo modFileInfo, index *core.Index, opt
return index.RefreshFileWithHash(path, format, hash, true) return index.RefreshFileWithHash(path, format, hash, true)
} }
func getLoader(pack core.Pack) int { func getSearchLoaderType(pack core.Pack) int {
dependencies := pack.Versions dependencies := pack.Versions
_, hasFabric := dependencies["fabric"] _, hasFabric := dependencies["fabric"]
@ -222,8 +222,12 @@ func getLoader(pack core.Pack) int {
_, hasForge := dependencies["forge"] _, hasForge := dependencies["forge"]
if (hasFabric || hasQuilt) && hasForge { if (hasFabric || hasQuilt) && hasForge {
return modloaderTypeAny return modloaderTypeAny
} else if hasFabric || hasQuilt { // Backwards-compatible; for now (could be configurable later) } else if hasFabric || hasQuilt {
return modloaderTypeFabric 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 { } else if hasForge {
return modloaderTypeForge return modloaderTypeForge
} else { } else {
@ -231,23 +235,41 @@ func getLoader(pack core.Pack) int {
} }
} }
func matchLoaderType(packLoaderType int, modLoaderType int) bool { func getLoaders(pack core.Pack) (loaders []string) {
if packLoaderType == modloaderTypeAny || modLoaderType == modloaderTypeAny { _, 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 return true
} else { } else {
return packLoaderType == modLoaderType return slices.Contains(packLoaders, modloaderIds[modLoaderType])
} }
} }
func matchLoaderTypeFileInfo(packLoaderType int, fileInfoData modFileInfo) bool { func matchLoaderTypeFileInfo(packLoaders []string, fileInfoData modFileInfo) bool {
if packLoaderType == modloaderTypeAny { if len(packLoaders) == 0 {
return true return true
} else { } else {
containsLoader := false containsLoader := false
for i, name := range modloaderNames { for i, name := range modloaderNames {
if slices.Contains(fileInfoData.GameVersions, name) { if slices.Contains(fileInfoData.GameVersions, name) {
containsLoader = true containsLoader = true
if i == packLoaderType { if slices.Contains(packLoaders, modloaderIds[i]) {
return true 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 { for i, v := range mods {
projectRaw, ok := v.GetParsedUpdateData("curseforge") 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 snapshots, curseforge doesn't put them in GameVersionLatestFiles
for _, v := range modInfos[i].LatestFiles { for _, v := range modInfos[i].LatestFiles {
// Choose "newest" version by largest ID // 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 updateAvailable = true
fileID = v.ID fileID = v.ID
fileInfoData = v 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: change to timestamp-based comparison??
// TODO: manage alpha/beta/release correctly, check update channel? // TODO: manage alpha/beta/release correctly, check update channel?
// Choose "newest" version by largest ID // 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 updateAvailable = true
fileID = file.ID fileID = file.ID
fileName = file.Name fileName = file.Name

View File

@ -89,9 +89,9 @@ var installCmd = &cobra.Command{
var cancelled bool var cancelled bool
if slug == "" { if slug == "" {
searchTerm := strings.Join(args, " ") 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 { } else {
cancelled, modInfoData = searchCurseforgeInternal(slug, true, game, category, mcVersion, getLoader(pack)) cancelled, modInfoData = searchCurseforgeInternal(slug, true, game, category, mcVersion, getSearchLoaderType(pack))
} }
if cancelled { if cancelled {
return return
@ -114,7 +114,7 @@ var installCmd = &cobra.Command{
} }
var fileInfoData modFileInfo var fileInfoData modFileInfo
fileInfoData, err = getLatestFile(modInfoData, mcVersion, fileID, getLoader(pack)) fileInfoData, err = getLatestFile(modInfoData, mcVersion, fileID, getLoaders(pack))
if err != nil { if err != nil {
fmt.Printf("Failed to get file for project: %v\n", err) fmt.Printf("Failed to get file for project: %v\n", err)
os.Exit(1) os.Exit(1)
@ -187,7 +187,7 @@ var installCmd = &cobra.Command{
depIDPendingQueue = depIDPendingQueue[:0] depIDPendingQueue = depIDPendingQueue[:0]
for _, currData := range depInfoData { for _, currData := range depInfoData {
depFileInfo, err := getLatestFile(currData, mcVersion, 0, getLoader(pack)) depFileInfo, err := getLatestFile(currData, mcVersion, 0, getLoaders(pack))
if err != nil { if err != nil {
fmt.Printf("Error retrieving dependency data: %s\n", err.Error()) fmt.Printf("Error retrieving dependency data: %s\n", err.Error())
continue continue
@ -278,7 +278,7 @@ func (r modResultsList) Len() int {
return len(r) 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 { if isSlug {
fmt.Println("Looking up CurseForge slug...") fmt.Println("Looking up CurseForge slug...")
} else { } else {
@ -351,7 +351,7 @@ func searchCurseforgeInternal(searchTerm string, isSlug bool, game string, categ
} else { } else {
search = searchTerm 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 { if err != nil {
fmt.Printf("Failed to search for project: %v\n", err) fmt.Printf("Failed to search for project: %v\n", err)
os.Exit(1) 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 { if fileID == 0 {
var fileInfoData modFileInfo var fileInfoData modFileInfo
fileInfoObtained := false fileInfoObtained := false
@ -419,7 +419,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoader
for _, v := range modInfoData.LatestFiles { for _, v := range modInfoData.LatestFiles {
anyFileObtained = true anyFileObtained = true
// Choose "newest" version by largest ID // 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 fileID = v.ID
fileInfoData = v fileInfoData = v
fileInfoObtained = true fileInfoObtained = true
@ -429,7 +429,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int, packLoader
for _, v := range modInfoData.GameVersionLatestFiles { for _, v := range modInfoData.GameVersionLatestFiles {
anyFileObtained = true anyFileObtained = true
// Choose "newest" version by largest ID // 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 fileID = v.ID
fileInfoObtained = false // Make sure we get the file info fileInfoObtained = false // Make sure we get the file info
} }

View File

@ -110,6 +110,7 @@ const (
modloaderTypeCauldron modloaderTypeCauldron
modloaderTypeLiteloader modloaderTypeLiteloader
modloaderTypeFabric modloaderTypeFabric
modloaderTypeQuilt
) )
var modloaderNames = [...]string{ var modloaderNames = [...]string{
@ -118,6 +119,16 @@ var modloaderNames = [...]string{
"Cauldron", "Cauldron",
"Liteloader", "Liteloader",
"Fabric", "Fabric",
"Quilt",
}
var modloaderIds = [...]string{
"",
"forge",
"cauldron",
"liteloader",
"fabric",
"quilt",
} }
//noinspection GoUnusedConst //noinspection GoUnusedConst