Select file id, improve searching

This commit is contained in:
comp500 2019-06-14 20:13:00 +01:00
parent e7ed7d8d11
commit ebc2115b41
No known key found for this signature in database
GPG Key ID: 214C822FFEC586B5
2 changed files with 59 additions and 25 deletions

View File

@ -152,25 +152,34 @@ func cmdInstall(flags core.Flags, mod string, modArgsTail []string) error {
return cli.NewExitError(err, 1) return cli.NewExitError(err, 1)
} }
done, modID, fileID, err := getFileIDsFromString(mod) var done bool
if err != nil { var modID, fileID int
return cli.NewExitError(err, 1) // If modArgsTail has anything, go straight to searching - URLs/Slugs should not have spaces!
} if len(modArgsTail) == 0 {
done, modID, fileID, err = getFileIDsFromString(mod)
if err != nil {
return cli.NewExitError(err, 1)
}
if !done { if !done {
done, modID, err = getModIDFromString(mod) done, modID, err = getModIDFromString(mod)
// Handle error later (e.g. lowercase to search instead of as a slug) // Ignore error, go to search instead (e.g. lowercase to search instead of as a slug)
if err != nil {
done = false
}
}
} }
modInfoObtained := false modInfoObtained := false
var modInfoData modInfo var modInfoData modInfo
if !done { if !done {
fmt.Println("Searching CurseForge...")
modArgs := append([]string{mod}, modArgsTail...) modArgs := append([]string{mod}, modArgsTail...)
searchTerm := strings.Join(modArgs, " ") searchTerm := strings.Join(modArgs, " ")
// TODO: Curse search // TODO: Curse search
// TODO: how to do interactive choices? automatically assume version? ask mod from list? choose first? // TODO: how to do interactive choices? automatically assume version? ask mod from list? choose first?
results, err := getSearch(searchTerm) results, err := getSearch(searchTerm, mcVersion)
if err != nil { if err != nil {
return cli.NewExitError(err, 1) return cli.NewExitError(err, 1)
} }
@ -200,7 +209,10 @@ func cmdInstall(flags core.Flags, mod string, modArgsTail []string) error {
fmt.Println("Cancelled!") fmt.Println("Cancelled!")
return nil return nil
} }
modInfoData, ok := menuRes[0].Value.(modInfo)
// Why is variable shadowing a thing!!!!
var ok bool
modInfoData, ok = menuRes[0].Value.(modInfo)
if !ok { if !ok {
return errors.New("Error converting interface from wmenu") return errors.New("Error converting interface from wmenu")
} }
@ -227,11 +239,6 @@ func cmdInstall(flags core.Flags, mod string, modArgsTail []string) error {
return cli.NewExitError(err, 1) return cli.NewExitError(err, 1)
} }
fmt.Printf("ids: %d %d %v\n", modID, fileID, done)
// TODO: get FileID if it isn't there
fmt.Println(mcVersion)
if !modInfoObtained { if !modInfoObtained {
modInfoData, err = getModInfo(modID) modInfoData, err = getModInfo(modID)
if err != nil { if err != nil {
@ -239,17 +246,38 @@ func cmdInstall(flags core.Flags, mod string, modArgsTail []string) error {
} }
} }
fileInfoObtained := false
var fileInfoData modFileInfo
if fileID == 0 { if fileID == 0 {
fmt.Println("WIP: get an actual file ID!!!") // TODO: how do we decide which version to use?
return nil for _, v := range modInfoData.GameVersionLatestFiles {
// Choose "newest" version by largest ID
if v.GameVersion == mcVersion && v.ID > fileID {
fileID = v.ID
}
}
if fileID == 0 {
return cli.NewExitError(errors.New("no files available for current Minecraft version"), 1)
}
// The API also provides some files inline, because that's efficient!
for _, v := range modInfoData.LatestFiles {
if v.ID == fileID {
fileInfoObtained = true
fileInfoData = v
}
}
} }
fileInfo, err := getFileInfo(modID, fileID) if !fileInfoObtained {
if err != nil { fileInfoData, err = getFileInfo(modID, fileID)
return cli.NewExitError(err, 1) if err != nil {
return cli.NewExitError(err, 1)
}
} }
err = createModFile(flags, modInfoData, fileInfo, &index) err = createModFile(flags, modInfoData, fileInfoData, &index)
if err != nil { if err != nil {
return cli.NewExitError(err, 1) return cli.NewExitError(err, 1)
} }
@ -267,7 +295,7 @@ func cmdInstall(flags core.Flags, mod string, modArgsTail []string) error {
return cli.NewExitError(err, 1) return cli.NewExitError(err, 1)
} }
fmt.Printf("Mod \"%s\" successfully installed!\n", modInfoData.Name) fmt.Printf("Mod \"%s\" successfully installed! (%s)\n", modInfoData.Name, fileInfoData.FileName)
return nil return nil
} }

View File

@ -204,8 +204,8 @@ func (f *cfDateFormat) UnmarshalJSON(input []byte) error {
// modFileInfo is a subset of the deserialised JSON response from the Curse API for mod files // modFileInfo is a subset of the deserialised JSON response from the Curse API for mod files
type modFileInfo struct { type modFileInfo struct {
ID int `json:"id"` ID int `json:"id"`
FileName string `json:"fileNameOnDisk"` FileName string `json:"fileName"`
FriendlyName string `json:"fileName"` FriendlyName string `json:"displayName"`
Date cfDateFormat `json:"fileDate"` Date cfDateFormat `json:"fileDate"`
Length int `json:"fileLength"` Length int `json:"fileLength"`
FileType int `json:"releaseType"` FileType int `json:"releaseType"`
@ -253,13 +253,19 @@ func getFileInfo(modID int, fileID int) (modFileInfo, error) {
} }
// TODO: pass gameVersion? // TODO: pass gameVersion?
func getSearch(searchText string) ([]modInfo, error) { func getSearch(searchText string, gameVersion string) ([]modInfo, error) {
var infoRes []modInfo var infoRes []modInfo
client := &http.Client{} client := &http.Client{}
textEscaped := url.QueryEscape(searchText) textEscaped := url.QueryEscape(searchText)
var reqURL string
if len(gameVersion) > 0 {
reqURL = "https://addons-ecs.forgesvc.net/api/v2/addon/search?gameId=432&pageSize=10&categoryId=0&sectionId=6&searchFilter=" + textEscaped + "&gameVersion=" + gameVersion
} else {
reqURL = "https://addons-ecs.forgesvc.net/api/v2/addon/search?gameId=432&pageSize=10&categoryId=0&sectionId=6&searchFilter=" + textEscaped
}
req, err := http.NewRequest("GET", "https://addons-ecs.forgesvc.net/api/v2/addon/search?gameId=432&pageSize=10&categoryId=0&sectionId=6&searchFilter="+textEscaped, nil) req, err := http.NewRequest("GET", reqURL, nil)
if err != nil { if err != nil {
return []modInfo{}, err return []modInfo{}, err
} }