summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go207
1 files changed, 77 insertions, 130 deletions
diff --git a/main.go b/main.go
index 911fd13..e1ee16c 100644
--- a/main.go
+++ b/main.go
@@ -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)
+ }
}