go-webring/funcs.go
2023-12-04 14:19:56 +00:00

100 lines
2.3 KiB
Go

// SPDX-FileCopyrightText: 2021 Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: BSD-2-Clause
package main
import (
"html"
"html/template"
"io"
"log"
"net/http"
"net/url"
"os"
"strings"
)
// Link returns an HTML, HTTPS link of a given URI
func link(l string) string {
l = html.EscapeString(l)
return "<a href='" + l + "'>" + l + "</a>"
}
// parseIndex parses the index template and returns a template struct.
func (m *Ring) parseIndex() {
m.index = nil
tmpl, err := template.ParseFiles(*flagIndex)
if err != nil {
log.Fatal(err)
}
m.index = tmpl
tmplStat, err := os.Stat(*flagIndex)
if err != nil {
log.Fatalln(err)
}
m.indexModTime = tmplStat.ModTime().Unix()
}
// List parses the list of members, appends the data to a slice of type list,
// then returns the slice
func (m *Ring) parseList() {
m.ring = nil
file, err := os.ReadFile(*flagMembers)
if err != nil {
log.Fatal("Error while loading list of webring members: ", err)
}
lines := strings.Split(string(file), "\n")
for _, line := range lines[:len(lines)-1] {
fields := strings.Fields(line)
m.ring = append(m.ring, RingMember{id: fields[0], url: fields[1]})
}
fileStat, err := os.Stat(*flagMembers)
if err != nil {
log.Fatalln(err)
}
m.ringModTime = fileStat.ModTime().Unix()
}
// Modify takes arguments "index" or "ring" and returns true if either have been
// modified since last read
func (m *Ring) modify(a string) bool {
if a == "ring" {
ringStat, err := os.Stat(*flagMembers)
if err != nil {
log.Fatalln(err)
}
curRingModTime := ringStat.ModTime().Unix()
return m.ringModTime < curRingModTime
} else if a == "index" {
indexStat, err := os.Stat(*flagIndex)
if err != nil {
log.Fatalln(err)
}
curIndexModTime := indexStat.ModTime().Unix()
return m.indexModTime < curIndexModTime
} else {
log.Fatalln("Please call modify() with argument of either \"index\" or \"ring\"")
}
return true
}
func isTargetValid(my_url *url.URL, site string) bool {
resp, err := http.Get(site)
if err != nil {
log.Println(err)
return false
}
if !(200 <= resp.StatusCode && resp.StatusCode < 300) {
return false
}
bodyb, err := io.ReadAll(resp.Body)
if err != nil {
log.Printf("error while reading target http body: %v", err)
return false
}
body := string(bodyb)
return strings.Contains(body, my_url.Host)
}