go-webring/main.go
2021-12-31 12:49:26 -05:00

70 lines
1.6 KiB
Go

// SPDX-FileCopyrightText: 2021 Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: BSD-2-Clause
package main
import (
"fmt"
"html/template"
"log"
"net/http"
flag "github.com/spf13/pflag"
)
type ring struct {
handle string
url string
}
type model struct {
ring []ring
index *template.Template
ringModTime int64
indexModTime int64
}
// Pre-define all of our flags
var (
flagListen *string = flag.StringP("listen", "l", "127.0.0.1:2857", "Host and port go-webring will listen on")
flagMembers *string = flag.StringP("members", "m", "list.txt", "Path to list of webring members")
flagIndex *string = flag.StringP("index", "i", "index.html", "Path to home page template")
// These are not (and might never be) implemented, we'll see
// flagCert *string = flag.StringP("cert", "c", "cert.crt", "Path to certificate")
// flagKey *string = flag.StringP("key", "k", "cert.key", "Path to private certificate key")
)
func main() {
m := model{}
m.init()
mux := http.NewServeMux()
httpServer := &http.Server{
Addr: *flagListen,
Handler: mux,
}
mux.HandleFunc("/", m.root)
mux.HandleFunc("/next", m.next)
mux.HandleFunc("/previous", m.previous)
mux.HandleFunc("/random", m.random)
if err := httpServer.ListenAndServe(); err == http.ErrServerClosed {
log.Println("Web server closed")
} else {
log.Fatalln(err)
}
}
func (m *model) init() {
flag.Parse()
fmt.Println("Listening on", *flagListen)
fmt.Println("Looking for members in", *flagMembers)
m.parseList()
fmt.Println("Found", len(m.ring), "members")
fmt.Println("Building homepage with", *flagIndex)
m.parseIndex()
}