diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 207 |
1 files changed, 77 insertions, 130 deletions
@@ -4,90 +4,16 @@ import ( "errors" "flag" "fmt" + "github.com/silvasur/startpage/reddit_background" + "github.com/silvasur/startpage/weather" "html/template" "log" "net/http" "os" "path" "strings" - "time" - "github.com/silvasur/startpage/weather" ) -var porn EarthPorn -var curWeather weather.Weather - -func trylater(ch chan<- bool) { - log.Println("Will try again later...") - time.Sleep(1 * time.Minute) - ch <- true -} - -func earthPornUpdater(ch chan bool) { - for _ = range ch { - newporn, err := GetEarthPorn() - if err != nil { - log.Print(err) - go trylater(ch) - continue - } - - porn = newporn - log.Println("New fap material!") - } -} - -var place = "" - -func setPlaceCmd(params []string) error { - if len(params) != 1 { - return errors.New("set-weather-place needs one parameter") - } - - place = params[0] - return nil -} - -func weatherUpdater(ch chan bool) { - for _ = range ch { - newW, err := weather.CurrentWeather(place) - if err != nil { - log.Printf("Failed getting latest weather data: %s", err) - go trylater(ch) - continue - } - - curWeather = newW - log.Println("New weather data") - } -} - -func intervalUpdates(d time.Duration, stopch <-chan bool, chans ...chan<- bool) { - send := func(chans ...chan<- bool) { - for _, ch := range chans { - go func(ch chan<- bool) { - ch <- true - }(ch) - } - } - - send(chans...) - - tick := time.NewTicker(d) - for { - select { - case <-tick.C: - send(chans...) - case <-stopch: - tick.Stop() - for _, ch := range chans { - close(ch) - } - return - } - } -} - var tpl *template.Template func loadTemplate() { @@ -103,23 +29,21 @@ func loadTemplate() { panic(errors.New("could not find template in $GOPATH/src/github.com/silvasur/startpage")) } -func initCmds() { - RegisterCommand("add-link", addLinkCmd) - RegisterCommand("set-earthporn-savepath", setSavepathCmd) - RegisterCommand("set-weather-place", setPlaceCmd) - RegisterCommand("set-maxdim", setMaxdimCmd) +func buildWeatherProvider(config Config) *weather.WeatherProvider { + if config.WeatherPlace == "" { + return nil + } + + return weather.NewWeatherProvider(config.WeatherPlace) } -func runConf() { - f, err := os.Open(os.ExpandEnv("$HOME/.startpagerc")) - if err != nil { - log.Fatalf("Could not open startpagerc: %s", err) +func buildRedditImageProvider(config Config) *reddit_background.RedditImageProvider { + subreddit := config.ImageSubreddit + if subreddit == "" { + subreddit = "EarthPorn" } - defer f.Close() - if err := RunCommands(f); err != nil { - log.Fatal(err) - } + return reddit_background.NewRedditImageProvider(config.GetBackgroundMaxdim(), subreddit) } func main() { @@ -127,67 +51,90 @@ func main() { flag.Parse() loadTemplate() - initCmds() - runConf() - pornch := make(chan bool) - weatherch := make(chan bool) - stopch := make(chan bool) + config, err := LoadConfig() + if err != nil { + log.Fatalf("Failed loading config: %s", err) + } + + redditImageProvider := buildRedditImageProvider(*config) - go intervalUpdates(30*time.Minute, stopch, pornch, weatherch) - go weatherUpdater(weatherch) - go earthPornUpdater(pornch) + http.HandleFunc("/", startpage(*config, redditImageProvider)) + http.HandleFunc("/bgimg", bgimg(redditImageProvider)) - defer func(stopch chan<- bool) { - stopch <- true - }(stopch) + if config.BackgroundSavepath != "" { + http.HandleFunc("/savebg", savebg(redditImageProvider, config.BackgroundSavepath)) + } - http.HandleFunc("/", startpage) - http.HandleFunc("/bgimg", bgimg) - http.HandleFunc("/savebg", savebg) log.Fatal(http.ListenAndServe(*laddr, nil)) } type TplData struct { - Porn *EarthPorn - Weather *weather.Weather - Links []Link + BgImage *reddit_background.RedditImage + Weather *weather.Weather + Links []Link + CanSaveBg bool } -func startpage(rw http.ResponseWriter, req *http.Request) { - defer req.Body.Close() +func startpage(config Config, redditImageProvider *reddit_background.RedditImageProvider) http.HandlerFunc { + weatherProvider := buildWeatherProvider(config) + + return func(rw http.ResponseWriter, req *http.Request) { + defer req.Body.Close() + + var curWeather *weather.Weather = nil + if weatherProvider != nil { + var err error + if curWeather, err = weatherProvider.CurrentWeather(); err != nil { + log.Printf("Failed getting weather: %s", err) + } + } - if err := tpl.Execute(rw, &TplData{&porn, &curWeather, links}); err != nil { - log.Printf("Failed executing template: %s\n", err) + if err := tpl.Execute(rw, &TplData{ + redditImageProvider.Image(), + curWeather, + config.Links, + config.BackgroundSavepath != "", + }); err != nil { + log.Printf("Failed executing template: %s\n", err) + } } } -func bgimg(rw http.ResponseWriter, req *http.Request) { - defer req.Body.Close() +func bgimg(redditImageProvider *reddit_background.RedditImageProvider) http.HandlerFunc { + return func(rw http.ResponseWriter, req *http.Request) { + defer req.Body.Close() - if len(porn.data) == 0 { - rw.WriteHeader(http.StatusNotFound) - } + image := redditImageProvider.Image() - rw.Header().Add("Content-Type", porn.mediatype) - if _, err := rw.Write(porn.data); err != nil { - log.Printf("Failed serving background: %s", err) + if image == nil || len(image.Data) == 0 { + rw.WriteHeader(http.StatusNotFound) + } + + rw.Header().Add("Content-Type", image.Mediatype) + if _, err := rw.Write(image.Data); err != nil { + log.Printf("Failed serving background: %s", err) + } } } -func savebg(rw http.ResponseWriter, req *http.Request) { - defer req.Body.Close() +func savebg(redditImageProvider *reddit_background.RedditImageProvider, savepath string) http.HandlerFunc { + return func(rw http.ResponseWriter, req *http.Request) { + defer req.Body.Close() - if len(porn.data) == 0 { - fmt.Fprintln(rw, "No earth porn available") - return - } + image := redditImageProvider.Image() - if err := (&porn).save(); err != nil { - log.Println(err) - fmt.Fprintln(rw, err) - } + if image == nil || len(image.Data) == 0 { + fmt.Fprintln(rw, "No background image available") + return + } - rw.Header().Add("Location", "/") - rw.WriteHeader(http.StatusFound) + if err := image.Save(savepath); err != nil { + log.Println(err) + fmt.Fprintln(rw, err) + } + + rw.Header().Add("Location", "/") + rw.WriteHeader(http.StatusFound) + } } |