GoCatFacts/main.go
2025-07-17 21:16:01 +12:00

69 lines
1.2 KiB
Go

package main
import (
"bufio"
"crypto/rand"
"io"
"log"
"math/big"
"net/http"
"os"
)
var (
port = "8080"
facts = map[int64]string{}
)
func main() {
// Set custom port if PORT environment variable is set
portOverride := os.Getenv("PORT")
if portOverride != "" {
port = portOverride
}
// Load it up
err := loadFacts()
if err != nil {
log.Fatalf("Error loading facts: %v", err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, getRandomFact()+"\n")
})
err = http.ListenAndServe(":"+port, nil)
if err != nil {
log.Fatalf("Error loading facts: %v", err)
}
}
// loadFacts loads cat facts from a file named "facts.txt"
func loadFacts() error {
file, err := os.Open("facts.txt")
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
i := 0
for scanner.Scan() {
facts[int64(i)] = scanner.Text()
i++
}
log.Println("Loaded", len(facts), "cat facts")
return scanner.Err()
}
// getRandomFact returns a random cat fact from the loaded facts
func getRandomFact() string {
if len(facts) == 0 {
return "No facts available."
}
counter := int64(len(facts) - 1)
n, _ := rand.Int(rand.Reader, big.NewInt(counter))
return facts[n.Int64()]
}