-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfuncs.go
124 lines (116 loc) · 3.23 KB
/
funcs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: BSD-2-Clause
package main
import (
"html/template"
"io/ioutil"
"log/slog"
"net/http"
"net/url"
"os"
"strings"
)
// Link returns an HTML, HTTPS link of a given URI
func link(l string) string {
return "<a href='https://" + l + "'>" + l + "</a>"
}
// parseIndex parses the index template and returns a template struct.
func (m *model) parseIndex() {
m.index = nil
tmpl, err := template.ParseFiles(*flagIndex)
if err != nil {
slog.Error("Error parsing index template", "file", *flagIndex, "error", err)
os.Exit(1)
}
m.index = tmpl
tmplStat, err := os.Stat(*flagIndex)
if err != nil {
slog.Error("Error getting file metadata", "file", *flagIndex, "error", err)
os.Exit(1)
}
m.indexModTime = tmplStat.ModTime()
}
func (m *model) parse404() {
stat, err := os.Stat(*flag404)
if err != nil && os.IsNotExist(err) {
slog.Warn("404 template not found. Falling back to empty body.", "file", *flag404)
m.notFoundHtml = nil
return
} else if err != nil {
slog.Error("Error getting file metadata", "file", *flag404, "error", err)
os.Exit(1)
}
body, err := os.ReadFile(*flag404)
if err != nil {
slog.Error("Error reading 404 template", "file", *flag404, "error", err)
os.Exit(1)
}
bodyStr := string(body)
m.notFoundHtml = &bodyStr
m.notFoundModTime = stat.ModTime()
}
// List parses the list of members, appends the data to a slice of type list,
// then returns the slice
func (m *model) parseList() {
m.ring = nil
file, err := ioutil.ReadFile(*flagMembers)
if err != nil {
slog.Error("Error loading webring member list", "error", err)
}
lines := strings.Split(string(file), "\n")
for _, line := range lines[:len(lines)-1] {
fields := strings.Fields(line)
handle, err := url.QueryUnescape(fields[0])
if err == nil {
m.ring = append(m.ring, ring{handle: handle, discordUserId: fields[1], url: fields[2]})
}
}
fileStat, err := os.Stat(*flagMembers)
if err != nil {
slog.Error("Error getting file metadata", "file", *flagIndex, "error", err)
os.Exit(1)
}
m.ringModTime = fileStat.ModTime()
}
// Modify takes arguments "index" or "ring" and returns true if either have been
// modified since last read
func (m *model) modify(a string) bool {
if a == "ring" {
ringStat, err := os.Stat(*flagMembers)
if err != nil {
slog.Error("Error getting file metadata", "file", *flagIndex, "error", err)
os.Exit(1)
}
return ringStat.ModTime().After(m.ringModTime)
} else if a == "index" {
indexStat, err := os.Stat(*flagIndex)
if err != nil {
slog.Error("Error getting file metadata", "file", *flagIndex, "error", err)
os.Exit(1)
}
return indexStat.ModTime().After(m.indexModTime)
} else if a == "404" {
stat, err := os.Stat(*flag404)
if err != nil {
slog.Error("Error getting file metadata", "file", *flagIndex, "error", err)
os.Exit(1)
}
return stat.ModTime().After(m.notFoundModTime)
} else {
slog.Error("modify() called with invalid argument", "arg", a)
os.Exit(1)
}
return true
}
func is200(site string) bool {
resp, err := http.Get(site)
if err != nil {
slog.Error("HTTP request failed", "site", site, "error", err)
return false
}
if resp.StatusCode == http.StatusOK {
return true
}
return false
}