diff --git a/curseforge/curseforge.go b/curseforge/curseforge.go index 3a45bcf..f494c7a 100644 --- a/curseforge/curseforge.go +++ b/curseforge/curseforge.go @@ -4,6 +4,7 @@ import ( "errors" "regexp" "strconv" + "strings" "github.com/comp500/packwiz/cmd" "github.com/comp500/packwiz/core" @@ -28,10 +29,81 @@ var fileIDRegexes = [...]*regexp.Regexp{ regexp.MustCompile("^https?://(?:www\\.)?curseforge\\.com/minecraft/mc-mods/(.+)/download/(\\d+)"), } -// TODO: fix this later -func fixThisLater(mcVersion string) string { - if mcVersion == "20w15a" { +var snapshotVersionRegex = regexp.MustCompile("(?:Snapshot )?(\\d+)w0?(0|[1-9]\\d*)([a-z])") + +func getCurseforgeVersion(mcVersion string) string { + if strings.HasSuffix(mcVersion, "-pre") { + return strings.TrimSuffix(mcVersion, "-pre") + "-Snapshot" + } + // Mojang why must it be this way + index := strings.Index(mcVersion, " Pre-Release ") + if index > -1 { + return mcVersion[:index] + "-Snapshot" + } + index = strings.Index(mcVersion, " Pre-release ") + if index > -1 { + return mcVersion[:index] + "-Snapshot" + } + + matches := snapshotVersionRegex.FindStringSubmatch(mcVersion) + if matches == nil { + return mcVersion + } + year, err := strconv.Atoi(matches[1]) + if err != nil { + return mcVersion + } + week, err := strconv.Atoi(matches[2]) + if err != nil { + return mcVersion + } + + if year == 20 && week >= 6 { return "1.16-Snapshot" + } else if year == 19 && week >= 34 { + return "1.15-Snapshot" + } else if year == 18 && week >= 43 || year == 19 && week <= 14 { + return "1.14-Snapshot" + } else if year == 18 && week >= 30 && week <= 33 { + return "1.13.1-Snapshot" + } else if year == 17 && week >= 43 || year == 18 && week <= 22 { + return "1.13-Snapshot" + } else if year == 17 && week == 31 { + return "1.12.1-Snapshot" + } else if year == 17 && week >= 6 && week <= 18 { + return "1.12-Snapshot" + } else if year == 16 && week == 50 { + return "1.11.1-Snapshot" + } else if year == 16 && week >= 32 && week <= 44 { + return "1.11-Snapshot" + } else if year == 16 && week >= 20 && week <= 21 { + return "1.10-Snapshot" + } else if year == 16 && week >= 14 && week <= 15 { + return "1.9.3-Snapshot" + } else if year == 15 && week >= 31 || year == 16 && week <= 7 { + return "1.9-Snapshot" + } else if year == 14 && week >= 2 && week <= 34 { + return "1.8-Snapshot" + } else if year == 13 && week >= 47 && week <= 49 { + return "1.7.4-Snapshot" + } else if year == 13 && week >= 36 && week <= 43 { + return "1.7.2-Snapshot" + } else if year == 13 && week >= 16 && week <= 26 { + return "1.6-Snapshot" + } else if year == 13 && week >= 11 && week <= 12 { + return "1.5.1-Snapshot" + } else if year == 13 && week >= 1 && week <= 10 { + return "1.5-Snapshot" + } else if year == 12 && week >= 49 && week <= 50 { + return "1.4.6-Snapshot" + } else if year == 12 && week >= 32 && week <= 42 { + return "1.4.2-Snapshot" + } else if year == 12 && week >= 15 && week <= 30 { + return "1.3.1-Snapshot" + } else if year == 12 && week >= 3 && week <= 8 { + return "1.2.1-Snapshot" + } else if year == 11 && week >= 47 || year == 12 && week <= 1 { + return "1.1-Snapshot" } return mcVersion } @@ -204,7 +276,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 == fixThisLater(mcVersion) && file.ID > fileID { + if file.GameVersion == getCurseforgeVersion(mcVersion) && file.ID > fileID { updateAvailable = true fileID = file.ID fileName = file.Name diff --git a/curseforge/install.go b/curseforge/install.go index 783d724..a6f8f0d 100644 --- a/curseforge/install.go +++ b/curseforge/install.go @@ -268,7 +268,7 @@ 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, fixThisLater(mcVersion)) + results, err := getSearch(searchTerm, getCurseforgeVersion(mcVersion)) if err != nil { fmt.Println(err) os.Exit(1) @@ -341,7 +341,7 @@ func getLatestFile(modInfoData modInfo, mcVersion string, fileID int) (modFileIn var fileInfoData modFileInfo for _, v := range modInfoData.LatestFiles { // Choose "newest" version by largest ID - if sliceContainsString(v.GameVersions, fixThisLater(mcVersion)) && v.ID > fileID { + if sliceContainsString(v.GameVersions, getCurseforgeVersion(mcVersion)) && v.ID > fileID { fileID = v.ID fileInfoData = v } @@ -355,7 +355,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 == fixThisLater(mcVersion) && v.ID > fileID { + if v.GameVersion == getCurseforgeVersion(mcVersion) && v.ID > fileID { fileID = v.ID } }