package main import ( "flag" "fmt" "log" "math/rand" "net/http" "os" "sync" "time" "github.com/gorilla/mux" "riedstra.dev/mitch/steam-export/steam" ) var ( Logger = log.New(os.Stderr, "", log.LstdFlags) Listen = ":8899" libMu = &sync.RWMutex{} Lib *steam.Library ) func reloadLib() { Logger.Println("Starting library reload") libMu.Lock() defer libMu.Unlock() var err error l2, err := steam.NewLibrary(DefaultLib) if err != nil { Logger.Printf("Error reopening library: %s", err) return } Lib = l2 Logger.Println("Done reloading library") } func setLibHandler(w http.ResponseWriter, r *http.Request) { err := r.ParseForm() if err != nil { Logger.Printf("Setlib: While parsing form: %s", err) http.Error(w, fmt.Sprintf("Invalid form: %s", err), 400) return } DefaultLib = r.Form.Get("path") reloadLib() http.Redirect(w, r, "/", 302) } func quitHandler(w http.ResponseWriter, r *http.Request) { Logger.Println("Quit was called, exiting") w.Header().Add("Content-type", "text/plain") w.Write([]byte("Shutting down...")) go func() { time.Sleep(time.Second*2) os.Exit(0) }() return } func main() { fl := flag.NewFlagSet("steam-export", flag.ExitOnError) debug := fl.Bool("d", false, "Print line numbers in log") fl.StringVar(&Listen, "l", Listen, "What address do we listen on?") fl.StringVar(&DefaultLib, "L", DefaultLib, "Full path to default library") fl.Parse(os.Args[1:]) if *debug { Logger.SetFlags(log.LstdFlags | log.Llongfile) } var err error Lib, err = steam.NewLibrary(DefaultLib) if err != nil { Logger.Fatalf("While opening library path: %s", err) } go installer(getPath) r := mux.NewRouter() r.HandleFunc("/quit", quitHandler) r.HandleFunc("/setLib", setLibHandler) r.HandleFunc("/delete", gameDelete) r.HandleFunc("/install", gameInstaller) r.HandleFunc("/download/{game}", gameDownloader) r.HandleFunc("/style.css", cssHandler) r.HandleFunc("/", index) s := http.Server{ Handler: r, Addr: Listen, } go startBrowser() for i := 0; i < 5; i++ { err = s.ListenAndServe() if err != nil { Logger.Printf("Encountered: %s", err) rand.Seed(time.Now().UnixNano()) Listen = fmt.Sprintf(":%d", rand.Intn(63000)+1024) Logger.Printf("Trying: %s", Listen) s.Addr = Listen } } }