summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorLaria Carolin Chabowski <laria@laria.me>2020-10-04 22:58:03 +0200
committerLaria Carolin Chabowski <laria@laria.me>2020-10-04 22:58:03 +0200
commit5b456afb49bfa6ff1567510bc1d9362377d32216 (patch)
treee9f13973251405095dd8b0a31930ca10caa57163 /main.go
parent1f700deeb1a26ab289178b76518a33faa3f51545 (diff)
downloadstartpage-5b456afb49bfa6ff1567510bc1d9362377d32216.tar.gz
startpage-5b456afb49bfa6ff1567510bc1d9362377d32216.tar.bz2
startpage-5b456afb49bfa6ff1567510bc1d9362377d32216.zip
New config format and new features
We're now using json as a config format instead of our weird own format. The weather icon is now optional, simply don't define WeatherPlace in your config. You can now specify which subreddit to get background images from. The default is still /r/EarthPorn.
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)
+ }
}