2020-02-14 10:42:38 +00:00
|
|
|
package webserver
|
|
|
|
|
|
|
|
import (
|
2020-02-14 14:56:10 +00:00
|
|
|
"math/rand"
|
|
|
|
|
|
|
|
irc "git.martyn.berlin/martyn/karaokards/internal/irc"
|
2020-02-14 10:42:38 +00:00
|
|
|
"github.com/gorilla/handlers"
|
|
|
|
"github.com/gorilla/mux"
|
|
|
|
|
|
|
|
"fmt"
|
|
|
|
"html/template"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
//var store = sessions.NewCookieStore(os.Getenv("SESSION_KEY"))
|
|
|
|
|
2020-02-14 14:56:10 +00:00
|
|
|
var ircBot irc.KardBot
|
2020-02-14 10:42:38 +00:00
|
|
|
|
|
|
|
func HealthHandler(response http.ResponseWriter, request *http.Request) {
|
|
|
|
response.Header().Add("Content-type", "text/plain")
|
|
|
|
fmt.Fprint(response, "I'm okay jack!")
|
|
|
|
}
|
|
|
|
|
|
|
|
func NotFoundHandler(response http.ResponseWriter, request *http.Request) {
|
|
|
|
response.Header().Add("X-Template-File", "html"+request.URL.Path)
|
2020-02-21 19:52:19 +00:00
|
|
|
response.WriteHeader(404)
|
2020-02-14 10:42:38 +00:00
|
|
|
tmpl := template.Must(template.ParseFiles("web/404.html"))
|
|
|
|
tmpl.Execute(response, nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func CSSHandler(response http.ResponseWriter, request *http.Request) {
|
|
|
|
response.Header().Add("Content-type", "text/css")
|
|
|
|
tmpl := template.Must(template.ParseFiles("web/cover.css"))
|
|
|
|
tmpl.Execute(response, nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
func RootHandler(response http.ResponseWriter, request *http.Request) {
|
|
|
|
request.URL.Path = "/index.html"
|
|
|
|
TemplateHandler(response, request)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TemplateHandler(response http.ResponseWriter, request *http.Request) {
|
|
|
|
response.Header().Add("X-Template-File", "web"+request.URL.Path)
|
|
|
|
type TemplateData struct {
|
2020-02-14 14:56:10 +00:00
|
|
|
Prompt string
|
|
|
|
AvailCount int
|
|
|
|
ChannelCount int
|
|
|
|
MessageCount int
|
2020-02-14 10:42:38 +00:00
|
|
|
}
|
|
|
|
// tmpl, err := template.New("html"+request.URL.Path).Funcs(template.FuncMap{
|
|
|
|
// "ToUpper": strings.ToUpper,
|
|
|
|
// "ToLower": strings.ToLower,
|
|
|
|
// }).ParseFiles("html"+request.URL.Path)
|
|
|
|
_ = strings.ToLower("Hello")
|
|
|
|
if strings.Index(request.URL.Path, "/") < 0 {
|
|
|
|
http.Error(response, "No slashes wat - "+request.URL.Path, http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
basenameSlice := strings.Split(request.URL.Path, "/")
|
|
|
|
basename := basenameSlice[len(basenameSlice)-1]
|
|
|
|
//fmt.Fprintf(response, "%q", basenameSlice)
|
|
|
|
tmpl, err := template.New(basename).Funcs(template.FuncMap{
|
|
|
|
"ToUpper": strings.ToUpper,
|
|
|
|
"ToLower": strings.ToLower,
|
|
|
|
}).ParseFiles("web" + request.URL.Path)
|
|
|
|
if err != nil {
|
|
|
|
http.Error(response, err.Error(), http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
// NotFoundHandler(response, request)
|
|
|
|
// return
|
|
|
|
}
|
2020-02-21 19:52:19 +00:00
|
|
|
var td = TemplateData{ircBot.Prompts[rand.Intn(len(ircBot.Prompts))], len(ircBot.Prompts), 0, 0}
|
2020-02-14 10:42:38 +00:00
|
|
|
err = tmpl.Execute(response, td)
|
|
|
|
if err != nil {
|
|
|
|
http.Error(response, err.Error(), http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-21 19:52:19 +00:00
|
|
|
func AdminHandler(response http.ResponseWriter, request *http.Request) {
|
|
|
|
request.URL.Path = "/index.html"
|
|
|
|
TemplateHandler(response, request)
|
|
|
|
}
|
|
|
|
|
2020-02-14 14:56:10 +00:00
|
|
|
func HandleHTTP(passedIrcBot irc.KardBot) {
|
|
|
|
ircBot = passedIrcBot
|
2020-02-14 10:42:38 +00:00
|
|
|
r := mux.NewRouter()
|
|
|
|
loggedRouter := handlers.LoggingHandler(os.Stdout, r)
|
|
|
|
r.NotFoundHandler = http.HandlerFunc(NotFoundHandler)
|
|
|
|
r.HandleFunc("/", RootHandler)
|
|
|
|
r.HandleFunc("/healthz", HealthHandler)
|
|
|
|
r.HandleFunc("/example/{.*}", TemplateHandler)
|
|
|
|
r.HandleFunc("/cover.css", CSSHandler)
|
2020-02-21 19:52:19 +00:00
|
|
|
r.HandleFunc("/admin/{channel}/{key}", AdminHandler)
|
2020-02-14 10:42:38 +00:00
|
|
|
http.Handle("/", r)
|
|
|
|
srv := &http.Server{
|
|
|
|
Handler: loggedRouter,
|
|
|
|
Addr: "0.0.0.0:5353",
|
|
|
|
WriteTimeout: 15 * time.Second,
|
|
|
|
ReadTimeout: 15 * time.Second,
|
|
|
|
}
|
|
|
|
fmt.Println("Listening on 0.0.0.0:5353")
|
|
|
|
srv.ListenAndServe()
|
|
|
|
}
|