WIP: switch from global vars to methods
This commit is contained in:
parent
6a80c5fccd
commit
8e0ebb33b3
24
funcs.go
24
funcs.go
|
@ -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
|
||||
}
|
||||
|
||||
|
|
44
handlers.go
44
handlers.go
|
@ -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
29
main.go
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue