adriano.fyi/build_site.go
2023-01-07 08:52:17 -08:00

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
}