94 lines
1.8 KiB
Go
94 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"bufio"
|
|
"strconv"
|
|
"strings"
|
|
"net/url"
|
|
"path/filepath"
|
|
|
|
"git.sr.ht/~adnano/go-gemini"
|
|
)
|
|
|
|
var perrors map[string]PError
|
|
|
|
type PError struct {
|
|
Code gemini.Status
|
|
Message string
|
|
}
|
|
|
|
func populatePErrors() error {
|
|
file, err := os.OpenFile(filepath.Join(xdgDataHome(), "konbata", "perrors"), os.O_RDONLY|os.O_CREATE, 0600)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
scanner := bufio.NewScanner(file)
|
|
perrors = make(map[string]PError)
|
|
unescaper := strings.NewReplacer("\\n", "\n", "\\\\", "\\")
|
|
for scanner.Scan() {
|
|
values := strings.SplitN(scanner.Text(), " ", 3)
|
|
if len(values) != 3 {
|
|
continue
|
|
}
|
|
url, err := url.Parse(values[0])
|
|
if err != nil {
|
|
continue
|
|
}
|
|
if url.Scheme != "gemini" {
|
|
continue
|
|
}
|
|
code, err := strconv.Atoi(values[1])
|
|
if err != nil {
|
|
continue
|
|
}
|
|
perrors[url.String()] = PError{
|
|
Code: gemini.Status(code),
|
|
Message: unescaper.Replace(values[2]),
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func savePErrors() error {
|
|
file, err := os.OpenFile(filepath.Join(xdgDataHome(), "konbata", "perrors"), os.O_WRONLY|os.O_CREATE, 0600)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
err = file.Truncate(0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
writer := bufio.NewWriter(file)
|
|
escaper := strings.NewReplacer("\\", "\\\\", "\n", "\\n")
|
|
for url, perror := range perrors {
|
|
_, err = writer.WriteString(url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = writer.WriteRune(' ')
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = writer.WriteString(strconv.Itoa(int(perror.Code)))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = writer.WriteRune(' ')
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = escaper.WriteString(writer, perror.Message)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = writer.WriteRune('\n')
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return writer.Flush()
|
|
}
|