diff --git a/src/utils.go b/src/utils.go index 28091b2..6c692e4 100644 --- a/src/utils.go +++ b/src/utils.go @@ -1,12 +1,26 @@ package ss13 import ( + "html/template" "log" "time" ) var ( now = time.Now() + + funcmap = template.FuncMap{ + // safe_href let's us use URLs with custom protocols + "safe_href": func(s string) template.HTMLAttr { + return template.HTMLAttr(`href="` + s + `"`) + }, + "inms": func(t time.Time) int64 { + return t.Unix() * 1000 + }, + "year": func() int { + return time.Now().Year() + }, + } ) func LogError(err error) bool { diff --git a/src/web.go b/src/web.go index ed3cb13..9ca87ac 100644 --- a/src/web.go +++ b/src/web.go @@ -5,6 +5,7 @@ import ( "html/template" "mime" "net/http" + "path" "path/filepath" "strconv" "time" @@ -13,6 +14,20 @@ import ( ) func New(debug bool, path string) (*Instance, error) { + // WHen in debug mode we load the assets from disk instead of the + // embedded ones. + SetRawAssets(debug) + + tmpl := template.New("AllTemplates").Funcs(funcmap) + tmplfiles, err := AssetDir("templates/") + if err != nil { + panic(err) + } + for p, b := range tmplfiles { + name := filepath.Base(p) + template.Must(tmpl.New(name).Parse(string(b))) + } + c, e := LoadConfig(path) if e != nil { return nil, e @@ -28,9 +43,19 @@ func New(debug bool, path string) (*Instance, error) { Config: c, Debug: debug, - db: db, + db: db, + router: mux.NewRouter().StrictSlash(true), + tmpls: tmpl, } + i.router.HandleFunc("/", i.page_index) + i.router.HandleFunc("/about", i.page_about) + i.router.HandleFunc("/r/ver", i.page_apollo) + i.router.HandleFunc("/server/{id}", i.page_server) + i.router.HandleFunc("/server/{id}/{slug}", i.page_server) + i.router.HandleFunc("/static/{file:.*}", i.page_static) + i.router.NotFoundHandler = http.HandlerFunc(i.page_404) + return &i, nil } @@ -47,65 +72,6 @@ func (i *Instance) Run() error { time.Sleep(td) } }() - - i.router = mux.NewRouter().StrictSlash(true) - i.router.NotFoundHandler = http.HandlerFunc(i.page_404) - - // Custom template functions - funcmap := template.FuncMap{ - // safe_href let's us use URLs with custom protocols - "safe_href": func(s string) template.HTMLAttr { - return template.HTMLAttr(`href="` + s + `"`) - }, - "inms": func(t time.Time) int64 { - return t.Unix() * 1000 - }, - "year": func() int { - return time.Now().Year() - }, - } - - // WHen in debug mode we load the assets from disk instead of the - // embedded ones. - SetRawAssets(i.Debug) - - // Load templates - tmpl := template.New("AllTemplates").Funcs(funcmap) - tmplfiles, err := AssetDir("templates/") - if err != nil { - panic(err) - } - for p, b := range tmplfiles { - name := filepath.Base(p) - template.Must(tmpl.New(name).Parse(string(b))) - } - i.tmpls = tmpl - - // Load static files - staticfiles, e := AssetDir("static/") - if e != nil { - panic(e) - } - for p, _ := range staticfiles { - // Need to make a local copy of the var or else all files will - // return the content of a single file (quirk with range). - b := staticfiles[p] - ctype := mime.TypeByExtension(filepath.Ext(p)) - i.router.HandleFunc(fmt.Sprintf("/%s", p), - func(w http.ResponseWriter, r *http.Request) { - w.Header().Add("Content-Type", ctype) - _, e := w.Write(b) - LogError(e) - }) - } - - // Setup all URLS - i.router.HandleFunc("/", i.page_index) - i.router.HandleFunc("/about", i.page_about) - i.router.HandleFunc("/r/ver", i.page_apollo) - i.router.HandleFunc("/server/{id}", i.page_server) - i.router.HandleFunc("/server/{id}/{slug}", i.page_server) - return http.ListenAndServe(i.Config.ListenAddr, i.router) } @@ -114,6 +80,20 @@ func (i *Instance) page_404(w http.ResponseWriter, r *http.Request) { i.tmpls.ExecuteTemplate(w, "page_404.html", nil) } +func (i *Instance) page_static(w http.ResponseWriter, r *http.Request) { + p := path.Join("static", mux.Vars(r)["file"]) + b, e := Asset(p) + if LogError(e) { + i.page_404(w, r) + return + } + + ctype := mime.TypeByExtension(filepath.Ext(p)) + w.Header().Add("Content-Type", ctype) + _, e = w.Write(b) + LogError(e) +} + func (i *Instance) page_index(w http.ResponseWriter, r *http.Request) { servers := i.db.AllServers() i.tmpls.ExecuteTemplate(w, "page_index.html", D{