159 lines
3.4 KiB
Go
159 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"os/exec"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
build()
|
|
}
|
|
|
|
// In this example `messageId` is a value that
|
|
// needs to be stored in an environment variable to be
|
|
// used by the command that's going to be executed
|
|
func build() error {
|
|
binary, err := exec.LookPath("hugo")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
modePtr := flag.String("mode", "", "set application mode to either 'serve' or 'build'")
|
|
|
|
flag.Parse()
|
|
|
|
cmd := exec.Command(binary, *modePtr)
|
|
env := os.Environ()
|
|
|
|
// lat, lon, currentLocationName := getCurrentLocation()
|
|
//env = append(env, fmt.Sprintf("HUGO_PARAMS.CurrentLat=%f", lat))
|
|
//env = append(env, fmt.Sprintf("HUGO_PARAMS.CurrentLon=%f", lon))
|
|
//env = append(env, fmt.Sprintf("HUGO_PARAMS.CurrentLocationName=%s", currentLocationName))
|
|
|
|
// TEMP!
|
|
env = append(env, fmt.Sprintf("HUGO_PARAMS.CurrentLocationName=%s", "Bellingham, WA"))
|
|
env = append(env, "HUGO_PARAMS.Subtitle=He's Very Robust")
|
|
env = append(env, "HUGO_PARAMS.Logo=img/avatar-icon.png")
|
|
env = append(env, "HUGO_PARAMS.Favicon=img/favicon.ico")
|
|
env = append(env, "HUGO_PARAMS.Rss=true")
|
|
env = append(env, "HUGO_PARAMS.ShowRelatedPosts=true")
|
|
|
|
cmd.Env = env
|
|
|
|
cmdOut, _ := cmd.StdoutPipe()
|
|
cmdErr, _ := cmd.StderrPipe()
|
|
|
|
startErr := cmd.Start()
|
|
if startErr != nil {
|
|
return startErr
|
|
}
|
|
|
|
// read stdout and stderr
|
|
stdOutput, _ := ioutil.ReadAll(cmdOut)
|
|
errOutput, _ := ioutil.ReadAll(cmdErr)
|
|
|
|
fmt.Printf("STDOUT: %s\n", stdOutput)
|
|
fmt.Printf("ERROUT: %s\n", errOutput)
|
|
|
|
err = cmd.Wait()
|
|
return err
|
|
}
|
|
|
|
type point struct {
|
|
Lat float64 `json:"lat"`
|
|
Lon float64 `json:"lon"`
|
|
}
|
|
|
|
func getCurrentLocation() (lat, lon float64, currentLocationName string) {
|
|
//{{ $.Scratch.Set "description" (printf "I'm current in %s" $place.properties.label) }}
|
|
url := "https://adriano.fyi/current_location"
|
|
|
|
client := http.Client{
|
|
Timeout: time.Second * 10, // Timeout after 2 seconds
|
|
}
|
|
|
|
req, err := http.NewRequest(http.MethodGet, url, nil)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
res, getErr := client.Do(req)
|
|
if getErr != nil {
|
|
log.Fatal(getErr)
|
|
}
|
|
|
|
if res.Body != nil {
|
|
defer res.Body.Close()
|
|
}
|
|
|
|
body, readErr := ioutil.ReadAll(res.Body)
|
|
if readErr != nil {
|
|
log.Fatal(readErr)
|
|
}
|
|
|
|
p := point{}
|
|
jsonErr := json.Unmarshal(body, &p)
|
|
if jsonErr != nil {
|
|
log.Fatal(jsonErr)
|
|
}
|
|
|
|
lat, lon = p.Lat, p.Lon
|
|
currentLocationName = getCurrentLocationName(lon, lat)
|
|
|
|
return
|
|
}
|
|
|
|
type feature struct {
|
|
PlaceName string `json:"place_name"`
|
|
}
|
|
|
|
type peliasResponse struct {
|
|
Features []feature `json:"features"`
|
|
}
|
|
|
|
func getCurrentLocationName(lon, lat float64) (locationName string) {
|
|
client := http.Client{
|
|
Timeout: time.Second * 2, // Timeout after 2 seconds
|
|
}
|
|
|
|
url := fmt.Sprintf("https://api.mapbox.com/geocoding/v5/mapbox.places/%f,%f.json?access_token=%s&types=locality,place", lon, lat, os.Getenv("HUGO_MAPBOX_API_KEY"))
|
|
req, err := http.NewRequest(http.MethodGet, url, nil)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
res, getErr := client.Do(req)
|
|
if getErr != nil {
|
|
log.Fatal(getErr)
|
|
}
|
|
|
|
if res.Body != nil {
|
|
defer res.Body.Close()
|
|
}
|
|
|
|
body, readErr := ioutil.ReadAll(res.Body)
|
|
if readErr != nil {
|
|
log.Fatal(readErr)
|
|
}
|
|
|
|
r := peliasResponse{}
|
|
jsonErr := json.Unmarshal(body, &r)
|
|
if jsonErr != nil {
|
|
log.Fatal(jsonErr)
|
|
}
|
|
|
|
if len(r.Features) == 0 {
|
|
log.Printf("Unable to fetch location for coordinates: %f,%f", lon, lat)
|
|
} else {
|
|
locationName = r.Features[0].PlaceName
|
|
}
|
|
|
|
return
|
|
}
|