package main import ( "fmt" "io/ioutil" "log" "os" "r2go/api" "r2go/cli" "r2go/tools" "r2go/utils" "strings" "github.com/fatih/color" ) var version string = "0.0.1" // Init starts the CLI frontend for r2go func main() { logFile, err := os.OpenFile(utils.SystemInfo.ProgDir+"/r2mod-go.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) utils.CheckErr(err) defer logFile.Close() log.SetOutput(logFile) // Setup CLI switch var operation string if len(os.Args) >= 2 { operation = os.Args[1] } else { operation = "help" } // Color white := color.New(color.FgWhite).SprintFunc() // CLI Operations switch operation { case "help": fmt.Println("> Commands:") fmt.Println(" > info -- get info about a mod") fmt.Println(" > install, ins, i -- install mod(s)") fmt.Println(" > remove, rm, r -- remove mod(s)") fmt.Println(" > list, ls, li -- list mods") fmt.Println(" > search, s, find -- search mods") fmt.Println(" > update, upgrade, up -- update mods and API cache") fmt.Println(" > toggle, tm, togglemods -- toggle mods") fmt.Println(" > pull -- forcefully update API cache, not mods") fmt.Println(" > filter -- remove version numbers using regex from stdin") fmt.Println(" > version, ver, v -- print information about the program") case "info": api.InitAPI() if len(os.Args) <= 2 { fmt.Println("Usage: r2go info ") } else { status, selectedmod := api.GetModData(os.Args[2]) if status != 0 { fmt.Println("> Could not find the mod specified.") } color.Cyan("Mod Info: %s", os.Args[2]) fmt.Println(" Name: " + selectedmod.Versions[0].FullName) fmt.Println(" Desc: " + selectedmod.Versions[0].Description) fmt.Println(" Version: " + selectedmod.Versions[0].VersionNumber) fmt.Println(" Download URL: " + selectedmod.Versions[0].DownloadURL) } case "install", "ins", "i": api.CheckAPICache() api.InitAPI() fmt.Println("> Downloading mods...") dependencies := []string{} for _, m := range os.Args[2:] { newdeps := cli.InstallMod(m) for _, d := range newdeps { dependency := tools.ExposeModString(d) if !utils.ExistsInArray(dependencies, d) { if dependency != "bbepis-BepInExPack" && dependency != "tristanmcpherson-R2API" { dependencies = append(dependencies, d) } } } } fmt.Println("> Resolving dependencies...") for _, d := range dependencies { cli.InstallMod(d) } color.Green("> Complete!") case "remove", "rm", "r": fmt.Println("> Removing mods...") for _, m := range os.Args[2:] { cli.RemoveMod(m) } color.Green("> Complete!") case "list", "ls", "li": files, err := ioutil.ReadDir(utils.SystemInfo.PluginDir) if err != nil { log.Fatal(err) } for i, f := range files { color.Blue("%3v %s", i, white(f.Name())) } case "update", "upgrade", "up": color.Cyan("> Checking API Cache") api.InitAPI() 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) } for _, f := range files { cli.InstallMod(f.Name()) } color.Green("> Complete!") case "pull": api.InitAPI() 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() } color.Green("> Complete!") case "toggle", "tm", "togglemods": if tools.ToggleMods() { color.Cyan("> Mods Enabled") } else { color.Cyan("> Mods Disabled") } case "filter": fmt.Println(tools.ExposeModString(os.Args[2])) case "version", "ver", "v": color.Magenta("> r2go", version) fmt.Println(" > github.com/endigma442") case "search", "s", "find": api.InitAPI() query := strings.Join(os.Args[2:], "-") blue := color.New(color.FgBlue).SprintFunc() fmt.Printf("%s %s\n", "> Querying API for mods matching:", blue(query)) for _, mod := range api.SearchMods(query) { fmt.Println(" -", mod.Target) } color.Green("> Complete!") default: fmt.Println("Unknown command, use 'r2go help' for a list of commands.") } }