From 25747ad8bddff3d9e75925c590c7c398fea28eba Mon Sep 17 00:00:00 2001 From: comp500 Date: Wed, 12 Jun 2019 21:35:44 +0100 Subject: [PATCH] It Actually Works!!! --- curseforge/curseforge.go | 28 ++++++++++++++----- curseforge/import.go | 58 +++++++++++++++++++++++++++++++++++++--- curseforge/request.go | 10 ++++--- 3 files changed, 83 insertions(+), 13 deletions(-) diff --git a/curseforge/curseforge.go b/curseforge/curseforge.go index afb38cc..dd582b7 100644 --- a/curseforge/curseforge.go +++ b/curseforge/curseforge.go @@ -89,14 +89,13 @@ func getModIDFromString(mod string) (bool, int, error) { return false, 0, nil } -func createModFile(flags core.Flags, modID int, fileID int, modInfo modInfo) error { - fileInfo, err := getFileInfo(modID, fileID) - +func createModFile(flags core.Flags, modInfo modInfo, fileInfo modFileInfo) error { updateMap := make(map[string]map[string]interface{}) + var err error updateMap["curseforge"], err = cfUpdater{ - ProjectID: modID, - FileID: fileID, + ProjectID: modInfo.ID, + FileID: fileInfo.ID, // TODO: determine update channel ReleaseChannel: "release", }.ToMap() @@ -121,6 +120,7 @@ func createModFile(flags core.Flags, modID int, fileID int, modInfo modInfo) err fmt.Printf("%#v\n", modMeta) // TODO: what to do if it already exists? + // TODO: add to index return modMeta.Write() } @@ -172,15 +172,29 @@ func cmdInstall(flags core.Flags, mod string, modArgsTail []string) error { fmt.Println(mcVersion) modInfo, err := getModInfo(modID) - fmt.Println(err) + if err != nil { + return cli.NewExitError(err, 1) + } + fmt.Println(modInfo) _ = index if fileID == 0 { + fmt.Println("WIP: get an actual file ID!!!") return nil } - return createModFile(flags, modID, fileID, modInfo) + fileInfo, err := getFileInfo(modID, fileID) + if err != nil { + return cli.NewExitError(err, 1) + } + + err = createModFile(flags, modInfo, fileInfo) + if err != nil { + return cli.NewExitError(err, 1) + } + + return nil } type cfUpdateParser struct{} diff --git a/curseforge/import.go b/curseforge/import.go index 658a202..5a81aaa 100644 --- a/curseforge/import.go +++ b/curseforge/import.go @@ -1,5 +1,12 @@ package curseforge -import "github.com/comp500/packwiz/core" +import ( + "encoding/json" + "fmt" + "os" + + "github.com/comp500/packwiz/core" + "github.com/urfave/cli" +) type twitchPackMeta struct { Name string `json:"name"` @@ -14,14 +21,59 @@ type twitchPackMeta struct { Mods []struct { ID int `json:"addonID"` File struct { - // TODO: this is exactly the same as fileInfo, but with capitalised - // FileNameOnDisk. Move requesting stuff out of createModFile? + // This is exactly the same as modFileInfo, but with capitalised + // FileNameOnDisk. + ID int `json:"id"` + FileName string `json:"FileNameOnDisk"` + FriendlyName string `json:"fileName"` + Date cfDateFormat `json:"fileDate"` + Length int `json:"fileLength"` + FileType int `json:"releaseType"` + // fileStatus? means latest/preferred? + DownloadURL string `json:"downloadUrl"` + GameVersions []string `json:"gameVersion"` + Fingerprint int `json:"packageFingerprint"` + Dependencies []struct { + ModID int `json:"addonId"` + Type int `json:"type"` + } `json:"dependencies"` } `json:"installedFile"` } `json:"installedAddons"` } func cmdImport(flags core.Flags, file string) error { // TODO: implement + var packMeta twitchPackMeta + // TODO: is this relative to something? + f, err := os.Open(file) + if err != nil { + return err + } + err = json.NewDecoder(f).Decode(&packMeta) + if err != nil { + return err + } + + // TODO: magic involving existing files + + for _, v := range packMeta.Mods { + // TODO: progress bar? + + // TODO: batch requests? + modInfo, err := getModInfo(v.ID) + if err != nil { + // TODO: Fail more quietly? + return cli.NewExitError(err, 1) + } + fmt.Println(v) + fmt.Println(modFileInfo(v.File)) + + err = createModFile(flags, modInfo, modFileInfo(v.File)) + if err != nil { + return cli.NewExitError(err, 1) + } + } + return nil } diff --git a/curseforge/request.go b/curseforge/request.go index 76331a5..7a13446 100644 --- a/curseforge/request.go +++ b/curseforge/request.go @@ -153,14 +153,18 @@ type cfDateFormat struct { time.Time } +// Curse switched to proper RFC3339, but previously downloaded metadata still uses the old format :( func (f *cfDateFormat) UnmarshalJSON(input []byte) error { trimmed := strings.Trim(string(input), `"`) - time, err := time.Parse(cfDateFormatString, trimmed) + timeValue, err := time.Parse(time.RFC3339Nano, trimmed) if err != nil { - return err + timeValue, err = time.Parse(cfDateFormatString, trimmed) + if err != nil { + return err + } } - f.Time = time + f.Time = timeValue return nil }