risk/api/api.go

105 lines
2.6 KiB
Go

package api
import (
"encoding/json"
"io/ioutil"
"os"
"r2mod-go/utils"
"time"
)
// Mod contains info about a mod from thunderstore API
type Mod struct {
Name string `json:"name"`
FullName string `json:"full_name"`
PackageURL string `json:"package_url"`
DateCreated string `json:"date_created"`
DateUpdated string `json:"date_updated"`
UUID4 string `json:"uuid4"`
RatingScore int `json:"rating_score"`
IsPinned bool `json:"is_pinned"`
IsDeprecated bool `json:"is_deprecated"`
HasNSFWContent bool `json:"has_nsfw_content"`
Categories []string `json:"categories"`
Versions []Version `json:"versions"`
}
// Version contains info about a specific version of a mod
type Version struct {
Name string `json:"name"`
FullName string `json:"full_name"`
Description string `json:"description"`
Icon string `json:"icon"`
VersionNumber string `json:"version_number"`
Dependencies []string `json:"dependencies"`
DownloadURL string `json:"download_url"`
Downloads int `json:"downloads"`
DateCreated string `json:"date_created"`
WebsiteURL string `json:"website_url"`
IsActive bool `json:"is_active"`
UUID4 string `json:"uuid4"`
}
// CheckAPICache checks if the cached json is expired
func CheckAPICache() int {
if !utils.PathExists(utils.SystemInfo.TmpDir + "/pkg.json") {
return 1
}
info, err := os.Stat(utils.SystemInfo.TmpDir + "/pkg.json")
utils.CheckErr(err)
lastModTime := info.ModTime()
currentTime := time.Now()
if currentTime.Sub(lastModTime).Seconds() > 7200 {
return 1
}
return 0
}
// UpdateAPICache gets a new copy of the thunderstore pkgfile
func UpdateAPICache() {
apiURL := "https://thunderstore.io/api/v1/package/"
err := utils.DownloadFile(utils.SystemInfo.TmpDir+"/pkg.json", apiURL)
utils.CheckErr(err)
}
func unpackAPI() []Mod {
pkgFile, err := os.Open(utils.SystemInfo.TmpDir + "/pkg.json")
utils.CheckErr(err)
defer pkgFile.Close()
byteValue, err := ioutil.ReadAll(pkgFile)
utils.CheckErr(err)
var mods []Mod
err = json.Unmarshal(byteValue, &mods)
utils.CheckErr(err)
return mods
}
// PkgList contains all mods in current package cache
var PkgList []Mod = unpackAPI()
// GetModData gets object of mod by depString
func GetModData(depString string) Mod {
if depString == "R2API" {
depString = "tristanmcpherson-R2API"
}
var selectedMod Mod
for i := 0; i < len(PkgList); i++ {
if PkgList[i].FullName == depString {
selectedMod = PkgList[i]
}
}
return selectedMod
}