Add option to specify additional game versions (closes #25)

This commit is contained in:
comp500
2021-05-04 19:07:29 +01:00
parent 6557719c1f
commit 7bedd820c2
6 changed files with 76 additions and 11 deletions

View File

@@ -2,6 +2,7 @@ package curseforge
import (
"errors"
"github.com/spf13/viper"
"regexp"
"strconv"
"strings"
@@ -199,6 +200,34 @@ func createModFile(modInfo modInfo, fileInfo modFileInfo, index *core.Index) err
return index.RefreshFileWithHash(path, format, hash, true)
}
func matchGameVersion(mcVersion string, modMcVersion string) bool {
if getCurseforgeVersion(mcVersion) == modMcVersion {
return true
} else {
for _, v := range viper.GetStringSlice("acceptable-game-versions") {
if getCurseforgeVersion(v) == modMcVersion {
return true
}
}
return false
}
}
func matchGameVersions(mcVersion string, modMcVersions []string) bool {
for _, modMcVersion := range modMcVersions {
if getCurseforgeVersion(mcVersion) == modMcVersion {
return true
} else {
for _, v := range viper.GetStringSlice("acceptable-game-versions") {
if getCurseforgeVersion(v) == modMcVersion {
return true
}
}
}
}
return false
}
type cfUpdateData struct {
ProjectID int `mapstructure:"project-id"`
FileID int `mapstructure:"file-id"`
@@ -271,7 +300,7 @@ func (u cfUpdater) CheckUpdate(mods []core.Mod, mcVersion string) ([]core.Update
// For snapshots, curseforge doesn't put them in GameVersionLatestFiles
for _, v := range modInfos[i].LatestFiles {
// Choose "newest" version by largest ID
if sliceContainsString(v.GameVersions, getCurseforgeVersion(mcVersion)) && v.ID > fileID {
if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID {
updateAvailable = true
fileID = v.ID
fileInfoData = v
@@ -284,7 +313,7 @@ func (u cfUpdater) CheckUpdate(mods []core.Mod, mcVersion string) ([]core.Update
// TODO: change to timestamp-based comparison??
// TODO: manage alpha/beta/release correctly, check update channel?
// Choose "newest" version by largest ID
if file.GameVersion == getCurseforgeVersion(mcVersion) && file.ID > fileID {
if matchGameVersion(mcVersion, file.GameVersion) && file.ID > fileID {
updateAvailable = true
fileID = file.ID
fileName = file.Name

View File

@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"github.com/sahilm/fuzzy"
"github.com/spf13/viper"
"os"
"strings"
@@ -268,7 +269,13 @@ func (r modResultsList) Len() int {
func searchCurseforgeInternal(args []string, mcVersion string) (bool, modInfo) {
fmt.Println("Searching CurseForge...")
searchTerm := strings.Join(args, " ")
results, err := getSearch(searchTerm, getCurseforgeVersion(mcVersion))
// If there are more than one acceptable version, we shouldn't filter by game version at all (as we can't filter by multiple)
filterGameVersion := getCurseforgeVersion(mcVersion)
if len(viper.GetStringSlice("acceptable-game-versions")) > 0 {
filterGameVersion = ""
}
results, err := getSearch(searchTerm, filterGameVersion)
if err != nil {
fmt.Println(err)
os.Exit(1)
@@ -343,7 +350,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int) (modFileIn
for _, v := range modInfoData.LatestFiles {
// Choose "newest" version by largest ID
if sliceContainsString(v.GameVersions, getCurseforgeVersion(mcVersion)) && v.ID > fileID {
if matchGameVersions(mcVersion, v.GameVersions) && v.ID > fileID {
fileID = v.ID
fileInfoData = v
fileInfoObtained = true
@@ -352,7 +359,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int) (modFileIn
// TODO: change to timestamp-based comparison??
for _, v := range modInfoData.GameVersionLatestFiles {
// Choose "newest" version by largest ID
if v.GameVersion == getCurseforgeVersion(mcVersion) && v.ID > fileID {
if matchGameVersion(mcVersion, v.GameVersion) && v.ID > fileID {
fileID = v.ID
fileInfoObtained = false // Make sure we get the file info
}
@@ -363,7 +370,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int) (modFileIn
}
if fileID == 0 {
return modFileInfo{}, errors.New("mod not available for this minecraft version")
return modFileInfo{}, errors.New("mod not available for the configured Minecraft version(s) (use the acceptable-remote-versions option to accept more)")
}
fileInfoData, err := getFileInfo(modInfoData.ID, fileID)