Fixed a few bugs, added 'pull' command, optimized API cache, separated the client from the API more or less.
This commit is contained in:
parent
584c6cd90e
commit
ae49350a59
70
api/api.go
70
api/api.go
@ -6,9 +6,6 @@ import (
|
||||
"os"
|
||||
"r2mod-go/utils"
|
||||
"time"
|
||||
|
||||
"github.com/fatih/color"
|
||||
// TODO: eliminate this dependency
|
||||
)
|
||||
|
||||
// Mod contains info about a mod from thunderstore API
|
||||
@ -44,34 +41,25 @@ type Version struct {
|
||||
}
|
||||
|
||||
// CheckAPICache checks if the cached json is expired
|
||||
// TODO: REWRITE
|
||||
func CheckAPICache() {
|
||||
// TODO: move the printing out, add returns
|
||||
|
||||
color.Blue("> Checking API Cache")
|
||||
|
||||
func CheckAPICache() int {
|
||||
if !utils.PathExists(utils.SystemInfo.TmpDir + "/pkg.json") {
|
||||
color.Red("> API Cache is outdated")
|
||||
UpdateAPICache()
|
||||
} else {
|
||||
info, err := os.Stat(utils.SystemInfo.TmpDir + "/pkg.json")
|
||||
utils.CheckErr(err)
|
||||
|
||||
lastModTime := info.ModTime()
|
||||
currentTime := time.Now()
|
||||
|
||||
if currentTime.Sub(lastModTime).Seconds() > 7200 {
|
||||
color.Red("> API Cache is outdated")
|
||||
color.Blue("> Updating API Cache")
|
||||
UpdateAPICache()
|
||||
} else {
|
||||
color.Green("> API Cache is up to date")
|
||||
}
|
||||
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
|
||||
// TODO: ARIA2 IMPLEMENTATION
|
||||
func UpdateAPICache() {
|
||||
apiURL := "https://thunderstore.io/api/v1/package/"
|
||||
|
||||
@ -79,15 +67,12 @@ func UpdateAPICache() {
|
||||
utils.CheckErr(err)
|
||||
}
|
||||
|
||||
// GetModData gets object of mod by depString
|
||||
func GetModData(depString string) Mod {
|
||||
if depString == "R2API" {
|
||||
depString = "tristanmcpherson-R2API"
|
||||
}
|
||||
|
||||
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)
|
||||
|
||||
@ -96,15 +81,24 @@ func GetModData(depString string) 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(mods); i++ {
|
||||
if mods[i].FullName == depString {
|
||||
selectedMod = mods[i]
|
||||
for i := 0; i < len(PkgList); i++ {
|
||||
if PkgList[i].FullName == depString {
|
||||
selectedMod = PkgList[i]
|
||||
}
|
||||
}
|
||||
|
||||
defer pkgFile.Close()
|
||||
|
||||
// TODO: export this lol
|
||||
return selectedMod
|
||||
}
|
||||
|
5
go.mod
5
go.mod
@ -2,4 +2,7 @@ module r2mod-go
|
||||
|
||||
go 1.15
|
||||
|
||||
require github.com/fatih/color v1.10.0
|
||||
require (
|
||||
github.com/fatih/color v1.10.0
|
||||
github.com/ynsgnr/aria2go v0.0.0-20190317155935-c48e59783821
|
||||
)
|
||||
|
2
go.sum
2
go.sum
@ -4,6 +4,8 @@ github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ
|
||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/ynsgnr/aria2go v0.0.0-20190317155935-c48e59783821 h1:u7Ccf6Q8RHS5NRtaedudURcUt33+jieRhvi0HgHzqu0=
|
||||
github.com/ynsgnr/aria2go v0.0.0-20190317155935-c48e59783821/go.mod h1:GIZQz0e6PpgUM6AxkEFlTum/IIXQAO2YsGcj5Aer58c=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
55
main.go
55
main.go
@ -43,6 +43,7 @@ func main() {
|
||||
> list, ls, li -- list mods
|
||||
> update, upgrade, up -- update mods and API cache
|
||||
> toggle, tm, togglemods -- toggle mods
|
||||
> pull -- forcefully update API cache, not mods
|
||||
> filter -- remove version numbers using regex from stdin
|
||||
`)
|
||||
case "info":
|
||||
@ -59,14 +60,26 @@ func main() {
|
||||
case "install", "ins", "i":
|
||||
api.CheckAPICache()
|
||||
for _, m := range os.Args[2:] {
|
||||
|
||||
fmt.Println(" >", tools.ExposeModString(m))
|
||||
tools.DownloadMod(tools.ExposeModString(m))
|
||||
stat, ov := tools.DownloadMod(tools.ExposeModString(m))
|
||||
if stat == 0 {
|
||||
color.Green(" > Already installed and up to date")
|
||||
} else if stat == 1 {
|
||||
color.Magenta(" > Updating to version %s", ov)
|
||||
} else {
|
||||
color.Blue(" > Downloaded")
|
||||
}
|
||||
}
|
||||
case "remove", "rem", "r":
|
||||
api.CheckAPICache()
|
||||
for _, m := range os.Args[2:] {
|
||||
fmt.Println(" >", tools.ExposeModString(m))
|
||||
tools.RemoveMod(tools.ExposeModString(m))
|
||||
|
||||
if tools.RemoveMod(tools.ExposeModString(m)) == 1 {
|
||||
color.Red(" > Not installed")
|
||||
} else {
|
||||
color.Blue(" > Uninstalled")
|
||||
}
|
||||
}
|
||||
case "list", "ls", "li":
|
||||
files, err := ioutil.ReadDir(utils.SystemInfo.PluginDir)
|
||||
@ -78,8 +91,14 @@ func main() {
|
||||
color.Blue("%3v %s", i, white(f.Name()))
|
||||
}
|
||||
case "update", "upgrade", "up":
|
||||
color.Cyan("> Updating")
|
||||
api.CheckAPICache()
|
||||
color.Cyan("> Checking API Cache")
|
||||
if api.CheckAPICache() == 0 {
|
||||
color.Green("> API Cache is up to date!")
|
||||
} else {
|
||||
color.Red("> API Cache out of date!")
|
||||
api.UpdateAPICache()
|
||||
}
|
||||
|
||||
files, err := ioutil.ReadDir(utils.SystemInfo.PluginDir)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
@ -87,12 +106,32 @@ func main() {
|
||||
|
||||
for _, f := range files {
|
||||
fmt.Println(" >", tools.ExposeModString(f.Name()))
|
||||
tools.DownloadMod(tools.ExposeModString(f.Name()))
|
||||
stat, ov := tools.DownloadMod(tools.ExposeModString(f.Name()))
|
||||
if stat == 0 {
|
||||
color.Green(" > Already installed and up to date")
|
||||
} else if stat == 1 {
|
||||
color.Magenta(" > Updating to version %s", ov)
|
||||
} else {
|
||||
color.Blue(" > Downloaded")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
color.Green("> Complete!")
|
||||
// color.Green("> Complete!")
|
||||
case "pull":
|
||||
color.Cyan("> Checking API Cache")
|
||||
if api.CheckAPICache() == 0 {
|
||||
color.Green("> API Cache is up to date!")
|
||||
} else {
|
||||
color.Red("> API Cache out of date!")
|
||||
api.UpdateAPICache()
|
||||
}
|
||||
case "toggle", "tm", "togglemods":
|
||||
tools.ToggleMods()
|
||||
if tools.ToggleMods() {
|
||||
color.Cyan("> Mods Enabled")
|
||||
} else {
|
||||
color.Cyan("> Mods Enabled")
|
||||
}
|
||||
case "filter":
|
||||
fmt.Println(tools.ExposeModString(os.Args[2]))
|
||||
default:
|
||||
|
@ -8,8 +8,6 @@ import (
|
||||
"r2mod-go/utils"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/fatih/color"
|
||||
)
|
||||
|
||||
// ExposeModString removes user-error surrounding the mod string.
|
||||
@ -20,7 +18,7 @@ func ExposeModString(input string) string {
|
||||
}
|
||||
|
||||
// DownloadMod gets the download URL and installs the mod in the correct folder
|
||||
func DownloadMod(depString string) {
|
||||
func DownloadMod(depString string) (int, string) {
|
||||
if depString == "R2API" {
|
||||
depString = "tristanmcpherson-R2API"
|
||||
}
|
||||
@ -34,47 +32,44 @@ func DownloadMod(depString string) {
|
||||
modFolder := sysinfo.PluginDir + "/" + depString + "-" + modVersion
|
||||
|
||||
if utils.PathExists(modFolder) {
|
||||
color.Green(" > Already installed and up to date")
|
||||
} else {
|
||||
if len(api.GetModData(depString).Versions) >= 2 {
|
||||
modVersionOld := api.GetModData(depString).Versions[1].VersionNumber
|
||||
modFolderOld := sysinfo.PluginDir + "/" + depString + "-" + modVersionOld
|
||||
|
||||
if utils.PathExists(modFolderOld) {
|
||||
color.Magenta(" > Updating to version %s", modVersion)
|
||||
defer os.RemoveAll(modFolderOld)
|
||||
}
|
||||
}
|
||||
|
||||
color.Blue(" > Downloading...")
|
||||
|
||||
err := utils.DownloadFile(modName, downloadURL)
|
||||
utils.CheckErr(err)
|
||||
|
||||
color.Blue(" > Unzipping")
|
||||
|
||||
unzip, err := utils.Unzip(modName, modFolder)
|
||||
log.Println(unzip)
|
||||
utils.CheckErr(err)
|
||||
return 0, ""
|
||||
}
|
||||
|
||||
if len(api.GetModData(depString).Versions) >= 2 {
|
||||
modVersionOld := api.GetModData(depString).Versions[1].VersionNumber
|
||||
modFolderOld := sysinfo.PluginDir + "/" + depString + "-" + modVersionOld
|
||||
|
||||
if utils.PathExists(modFolderOld) {
|
||||
defer os.RemoveAll(modFolderOld)
|
||||
return 1, modVersion
|
||||
}
|
||||
}
|
||||
|
||||
err := utils.DownloadFile(modName, downloadURL)
|
||||
utils.CheckErr(err)
|
||||
|
||||
unzip, err := utils.Unzip(modName, modFolder)
|
||||
log.Println(unzip)
|
||||
utils.CheckErr(err)
|
||||
|
||||
return 2, modVersion
|
||||
}
|
||||
|
||||
// RemoveMod uninstalls a mod
|
||||
func RemoveMod(depString string) {
|
||||
func RemoveMod(depString string) int {
|
||||
modVersion := api.GetModData(depString).Versions[0].VersionNumber
|
||||
modFolder := utils.SystemInfo.PluginDir + "/" + depString + "-" + modVersion
|
||||
|
||||
if !utils.PathExists(modFolder) {
|
||||
color.Red(" > Not installed")
|
||||
} else {
|
||||
defer os.RemoveAll(modFolder)
|
||||
color.Blue(" > Uninstalled")
|
||||
return 1
|
||||
}
|
||||
defer os.RemoveAll(modFolder)
|
||||
return 0
|
||||
}
|
||||
|
||||
// ToggleMods toggles mods on or off.
|
||||
// TODO: make this not hardcoded as shit, perhaps implement a proper parser
|
||||
func ToggleMods() {
|
||||
func ToggleMods() bool {
|
||||
var configFile string = utils.SystemInfo.GameDir + "/doorstop_config.ini"
|
||||
|
||||
input, err := ioutil.ReadFile(configFile)
|
||||
@ -82,15 +77,19 @@ func ToggleMods() {
|
||||
|
||||
lines := strings.Split(string(input), "\n")
|
||||
|
||||
var status bool
|
||||
|
||||
if strings.Contains(lines[2], "true") {
|
||||
color.Cyan("> Mods Disabled")
|
||||
status = false
|
||||
lines[2] = "enabled=false"
|
||||
} else {
|
||||
color.Cyan("> Mods Enabled")
|
||||
status = true
|
||||
lines[2] = "enabled=true"
|
||||
}
|
||||
|
||||
output := strings.Join(lines, "\n")
|
||||
err = ioutil.WriteFile(configFile, []byte(output), 0644)
|
||||
utils.CheckErr(err)
|
||||
|
||||
return status
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user