WIP: switch from global vars to methods

This commit is contained in:
Amolith 2021-12-30 18:10:35 -05:00
parent 6a80c5fccd
commit 8e0ebb33b3
No known key found for this signature in database
GPG key ID: 5548AD9930655715
3 changed files with 47 additions and 50 deletions

View file

@ -9,18 +9,16 @@ import (
// List parses the list of members, appends the data to a slice of type list,
// then returns the slice
func parseList() *[]ring {
func (s server) parseList() {
file, err := ioutil.ReadFile(*flagMembers)
if err != nil {
log.Fatal("Error while loading list of webring members: ", err)
}
lines := strings.Split(string(file), "\n")
var r []ring
for _, line := range lines[:len(lines)-1] {
fields := strings.Fields(line)
r = append(r, ring{handle: fields[0], url: fields[1]})
s.ring = append(s.ring, ring{handle: fields[0], url: fields[1]})
}
return &r
}
// Link returns an HTML, HTTPS link of a given URI
@ -30,7 +28,7 @@ func link(l string) string {
// Modify returns true if the index and ring list have been modified since last
// read
func modify() bool {
func (s server) modify() bool {
members, err := os.Stat(*flagMembers)
if err != nil {
log.Fatalln(err)
@ -40,18 +38,18 @@ func modify() bool {
log.Fatalln(err)
}
curRTime := members.ModTime().Unix()
curITime := index.ModTime().Unix()
curRingModTime := members.ModTime().Unix()
curIndexModTime := index.ModTime().Unix()
if *rModTime == 0 {
*rModTime = curRTime
} else if *rModTime < curRTime {
if s.ringModTime == 0 {
s.ringModTime = curRingModTime
} else if s.ringModTime < curRingModTime {
return true
}
if *indexModTime == 0 {
*indexModTime = curITime
} else if *indexModTime < curITime {
if s.indexModTime == 0 {
s.indexModTime = curIndexModTime
} else if s.indexModTime < curIndexModTime {
return true
}

View file

@ -1,7 +1,6 @@
package main
import (
"fmt"
"html/template"
"log"
"math/rand"
@ -10,13 +9,12 @@ import (
)
// Serves the webpage created by createRoot()
func root(writer http.ResponseWriter, request *http.Request) {
if modify() {
r = parseList()
fmt.Println("Parsed the list again")
func (s server) root(writer http.ResponseWriter, request *http.Request) {
if s.modify() {
s.parseList()
}
var table string
for _, member := range *r {
for _, member := range s.ring {
table = table + " <tr>\n"
table = table + " <td>" + member.handle + "</td>\n"
table = table + " <td>" + link(member.url) + "</td>\n"
@ -33,21 +31,21 @@ func root(writer http.ResponseWriter, request *http.Request) {
// Redirects the visitor to the next member, wrapping around the list if the
// next would be out-of-bounds
func next(writer http.ResponseWriter, request *http.Request) {
if modify() {
r = parseList()
func (s server) next(writer http.ResponseWriter, request *http.Request) {
if s.modify() {
s.parseList()
}
host := request.URL.Query().Get("host")
dest, success := "https://", false
for i, item := range *r {
for i, item := range s.ring {
if item.url == host {
if i+1 >= len(*r) {
dest = dest + (*r)[0].url
if i+1 >= len(s.ring) {
dest = dest + s.ring[0].url
http.Redirect(writer, request, dest, 302)
success = true
break
}
dest = dest + (*r)[i+1].url
dest = dest + s.ring[i+1].url
http.Redirect(writer, request, dest, 302)
success = true
break
@ -60,20 +58,20 @@ func next(writer http.ResponseWriter, request *http.Request) {
// Redirects the visitor to the previous member, wrapping around the list if the
// next would be out-of-bounds
func previous(writer http.ResponseWriter, request *http.Request) {
if modify() {
r = parseList()
func (s server) previous(writer http.ResponseWriter, request *http.Request) {
if s.modify() {
s.parseList()
}
host := request.URL.Query().Get("host")
dest, success := "https://", false
for i, item := range *r {
for i, item := range s.ring {
if item.url == host {
if i-1 < 0 {
dest = dest + (*r)[len(*r)-1].url
dest = dest + s.ring[len(s.ring)-1].url
http.Redirect(writer, request, dest, 302)
break
}
dest = dest + (*r)[i-1].url
dest = dest + s.ring[i-1].url
http.Redirect(writer, request, dest, 302)
break
}
@ -84,11 +82,11 @@ func previous(writer http.ResponseWriter, request *http.Request) {
}
// Redirects the visitor to a random member
func random(writer http.ResponseWriter, request *http.Request) {
if modify() {
r = parseList()
func (s server) random(writer http.ResponseWriter, request *http.Request) {
if s.modify() {
s.parseList()
}
rand.Seed(time.Now().Unix())
dest := "https://" + (*r)[rand.Intn(len(*r)-1)].url
dest := "https://" + s.ring[rand.Intn(len(s.ring)-1)].url
http.Redirect(writer, request, dest, 302)
}

29
main.go
View file

@ -14,6 +14,13 @@ type ring struct {
url string
}
type server struct {
ring []ring
index string
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")
@ -24,32 +31,26 @@ var (
// flagKey *string = flag.StringP("key", "k", "cert.key", "Path to private certificate key")
)
// Declare global variables for the list, index, and modification times for each
var (
r *[]ring
index *string
rModTime *int64
indexModTime *int64
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", root)
mux.HandleFunc("/next", next)
mux.HandleFunc("/previous", previous)
mux.HandleFunc("/random", random)
server := &http.Server{
Addr: *flagListen,
Handler: mux,
}
log.Fatalln(server.ListenAndServe())
mux.HandleFunc("/", s.root)
mux.HandleFunc("/next", s.next)
mux.HandleFunc("/previous", s.previous)
mux.HandleFunc("/random", s.random)
}
func init() {
func (s server) init() {
flag.Parse()
fmt.Println("Listening on", *flagListen)
fmt.Println("Looking for members in", *flagMembers)
r = parseList()
s.parseList()
fmt.Println("Building homepage with", *flagIndex)
}