packwiz/main.go
2019-06-16 16:01:49 +01:00

218 lines
4.8 KiB
Go

package main
import (
"fmt"
"log"
"os"
"github.com/comp500/packwiz/core"
"github.com/urfave/cli"
// Modules of packwiz
_ "github.com/comp500/packwiz/curseforge"
)
func init() {
core.Commands = append(core.Commands, cli.Command{
Name: "remove",
Aliases: []string{"delete", "uninstall"},
Usage: "Remove a mod from the modpack",
Action: func(c *cli.Context) error {
return cmdDelete(core.FlagsFromContext(c), c.Args().Get(0))
},
}, cli.Command{
Name: "update",
Aliases: []string{"upgrade"},
Usage: "Update a mod (or all mods) in the modpack",
Action: func(c *cli.Context) error {
return cmdUpdate(core.FlagsFromContext(c), c.Args().Get(0))
},
}, cli.Command{
Name: "refresh",
Usage: "Refresh the index file",
Action: func(c *cli.Context) error {
return cmdRefresh(core.FlagsFromContext(c))
},
})
}
func main() {
app := cli.NewApp()
app.Commands = core.Commands
app.Flags = core.CLIFlags[:]
app.HideVersion = true
app.Usage = "A command line tool for creating Minecraft modpacks."
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
func cmdDelete(flags core.Flags, mod string) error {
if len(mod) == 0 {
return cli.NewExitError("You must specify a mod.", 1)
}
fmt.Println("Loading modpack...")
pack, err := core.LoadPack(flags)
if err != nil {
return cli.NewExitError(err, 1)
}
index, err := pack.LoadIndex()
if err != nil {
return cli.NewExitError(err, 1)
}
resolvedMod, ok := index.FindMod(mod)
if !ok {
return cli.NewExitError("You don't have this mod installed.", 1)
}
err = os.Remove(resolvedMod)
if err != nil {
return cli.NewExitError(err, 1)
}
fmt.Println("Removing mod from index...")
err = index.RemoveFile(resolvedMod)
if err != nil {
return cli.NewExitError(err, 1)
}
err = index.Write()
if err != nil {
return cli.NewExitError(err, 1)
}
err = pack.UpdateIndexHash()
if err != nil {
return cli.NewExitError(err, 1)
}
err = pack.Write()
if err != nil {
return cli.NewExitError(err, 1)
}
fmt.Printf("Mod %s removed successfully!", mod)
return nil
}
func cmdRefresh(flags core.Flags) error {
fmt.Println("Loading modpack...")
pack, err := core.LoadPack(flags)
if err != nil {
return cli.NewExitError(err, 1)
}
index, err := pack.LoadIndex()
if err != nil {
return cli.NewExitError(err, 1)
}
err = index.Refresh()
if err != nil {
return cli.NewExitError(err, 1)
}
err = index.Write()
if err != nil {
return cli.NewExitError(err, 1)
}
err = pack.UpdateIndexHash()
if err != nil {
return cli.NewExitError(err, 1)
}
err = pack.Write()
if err != nil {
return cli.NewExitError(err, 1)
}
fmt.Println("Index refreshed!")
return nil
}
func cmdUpdate(flags core.Flags, mod string) error {
fmt.Println("Loading modpack...")
pack, err := core.LoadPack(flags)
if err != nil {
return cli.NewExitError(err, 1)
}
index, err := pack.LoadIndex()
if err != nil {
return cli.NewExitError(err, 1)
}
mcVersion, err := pack.GetMCVersion()
if err != nil {
return cli.NewExitError(err, 1)
}
multiple := false
var singleUpdatedName string
if len(mod) == 0 || mod == "*" {
multiple = true
// TODO: implement
return cli.NewExitError("Not implemented yet!", 1)
} else {
modPath, ok := index.FindMod(mod)
if !ok {
return cli.NewExitError("You don't have this mod installed.", 1)
}
modData, err := core.LoadMod(modPath)
if err != nil {
return cli.NewExitError(err, 1)
}
singleUpdatedName = modData.Name
updaterFound := false
for k := range modData.Update {
updater, ok := core.Updaters[k]
if !ok {
continue
}
updaterFound = true
check, err := updater.CheckUpdate([]core.Mod{modData}, mcVersion)
if err != nil {
return cli.NewExitError(err, 1)
}
if len(check) != 1 {
return cli.NewExitError("Invalid update check response", 1)
}
if check[0].UpdateAvailable {
fmt.Printf("Update available: %s\n", check[0].UpdateString)
err = updater.DoUpdate([]*core.Mod{&modData}, []interface{}{check[0].CachedState})
if err != nil {
return cli.NewExitError(err, 1)
}
format, hash, err := modData.Write()
if err != nil {
return cli.NewExitError(err, 1)
}
err = index.RefreshFileWithHash(modPath, format, hash, true)
if err != nil {
return cli.NewExitError(err, 1)
}
} else {
fmt.Printf("\"%s\" is already up to date!\n", modData.Name)
return nil
}
break
}
if !updaterFound {
return cli.NewExitError("A supported update system for this mod cannot be found.", 1)
}
}
err = index.Write()
if err != nil {
return cli.NewExitError(err, 1)
}
err = pack.UpdateIndexHash()
if err != nil {
return cli.NewExitError(err, 1)
}
err = pack.Write()
if err != nil {
return cli.NewExitError(err, 1)
}
if multiple {
fmt.Println("Mods updated!")
} else {
fmt.Printf("\"%s\" updated!\n", singleUpdatedName)
}
return nil
}