package main
import (
"html/template"
"log"
"net/http"
"net/url"
"strconv"
"strings"
)
type Resp struct {
Entries *[]Entry
Err error
Stats *Stats
URL string
Offset int
User string
Guild string
Channel string
}
var funcMap = template.FuncMap{
"add": add,
"subtract": subtract,
"setQuery": setQuery,
"intToStr": intToStr,
}
const index = `
Keep
{{- .Err -}}
{{- .Stats.URLs -}} URLs,
{{- .Stats.Users -}} users,
{{- .Stats.Guilds -}} guilds,
{{- .Stats.Channels -}} channels
{{- if or (ne .User "") (ne .Guild "") (ne .Channel "") -}}
Entries filtered by:
{{- end -}}
{{- if ne .User "" }} User ({{ .User -}}){{- end -}}
{{- if ne .Guild "" }} Guild ({{ .Guild -}}){{- end -}}
{{- if ne .Channel "" }} Channel ({{ .Channel -}}){{- end -}}
{{- if gt .Offset 0 -}}
Previous
{{- end -}}
Home
{{- if ge (len .Entries) 100 -}}
Next
{{- end -}}
ID |
HTTP |
URL |
{{- range $e := .Entries -}}
{{- $e.ID -}} |
{{- if eq $e.Status 0 -}}PEND{{- else -}}{{ $e.Status }}{{- end -}} |
{{ $e.Message.URL }} |
{{- end -}}
{{- if gt .Offset 0 -}}
Previous
{{- end -}}
Home
{{- if ge (len .Entries) 100 -}}
Next
{{- end -}}
`
var indexTmp = template.Must(template.New("").Funcs(funcMap).Parse(index))
func add(a int, b int) int {
return a + b
}
func subtract(a int, b int) int {
return a - b
}
func intToStr(a int) string {
return strconv.Itoa(a)
}
func setQuery(urlStr string, query string, value string) string {
u, _ := url.Parse(urlStr)
q := u.Query()
q.Set(query, value)
u.RawQuery = q.Encode()
return strings.TrimLeft(u.String(), "/")
}
func (db *SqliteDB) IndexHandler(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
resp := Resp{}
resp.Stats, resp.Err = db.Stats()
if resp.Err != nil {
log.Println(resp.Err)
indexTmp.Execute(w, &resp)
return
}
resp.URL = r.URL.String()
query := r.URL.Query()
var err error
resp.Offset, err = strconv.Atoi(query.Get("offset"))
if err != nil {
resp.Offset = 0
}
resp.User = query.Get("user")
resp.Guild = query.Get("guild")
resp.Channel = query.Get("channel")
resp.Entries, resp.Err = db.ListEntries(100, resp.Offset, resp.User,
resp.Guild, resp.Channel)
if resp.Err != nil {
log.Println(resp.Err)
}
indexTmp.Execute(w, &resp)
}