diff --git a/webserver.go b/webserver.go index df7daf66..fe54fdcb 100644 --- a/webserver.go +++ b/webserver.go @@ -2,11 +2,24 @@ package main import ( "html/template" + "io/ioutil" "log" "net/http" "strconv" ) +type Page struct { + Title string + StaticStylesheet template.HTML + Body []byte + Error string +} + +const ( + coverCSS = `` + dashboardCSS = `` +) + func GetWebserverHost() string { host := SplitStrings(bot.config.Webserver.ListenAddress, ":")[0] if host == "" { @@ -22,6 +35,8 @@ func GetWebserverPort() int { } func StartWebserver() error { + fs := http.FileServer(http.Dir("web")) + http.Handle("/web/", http.StripPrefix("/web/", fs)) http.HandleFunc("/", index) var err error go func() { @@ -39,16 +54,62 @@ func ServerHTTPError(w http.ResponseWriter, err error) { func index(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") - tmpl, err := template.ParseFiles("web/index.html", "web/header.html", "web/footer.html") - if err != nil { - ServerHTTPError(w, err) - return - } - - tmplValues := map[string]interface{}{"title": "Home"} - tmpl.Execute(w, tmplValues) - if err != nil { - ServerHTTPError(w, err) - return + switch r.URL.Path { + case "/": + renderTemplate(w, "index.html", readPage("/index")) + case "/login": + renderTemplate(w, "login.html", readPage(r.URL.Path)) + case "/logout": + renderTemplate(w, "index.html", readPage("/index")) + case "/dashboard-marketdepth": + renderTemplate(w, "dashboard-marketdepth.html", readPage(r.URL.Path)) + case "/dashboard-ordermanagement": + renderTemplate(w, "dashboard-ordermanagement.html", readPage(r.URL.Path)) + case "/dashboard-contact": + renderTemplate(w, "dashboard-contact.html", readPage(r.URL.Path)) + case "/dashboard-settings": + renderTemplate(w, "dashboard-settings.html", readPage(r.URL.Path)) + case "/dashboard-reports": + renderTemplate(w, "dashboard-reports.html", readPage(r.URL.Path)) + default: + w.WriteHeader(http.StatusNotFound) + renderTemplate(w, "error.html", readPage("/error")) + } +} + +func readPage(client string) *Page { + filename := "web/" + client[1:] + ".html" + body, err := ioutil.ReadFile(filename) + if err != nil { + log.Println("Webserver: Failed to open file -- ", err, "client string is: ", client) + return nil + } + stylesheet := setStylesheet(client) + return &Page{Title: client[1:], StaticStylesheet: stylesheet, Body: body} +} + +func setStylesheet(client string) template.HTML { + if len(client) >= 10 { + if client[:10] == "/dashboard" { + return template.HTML(dashboardCSS) + } + } + return template.HTML(coverCSS) +} + +func renderTemplate(w http.ResponseWriter, pageName string, p *Page) { + tmpl, err := template.ParseFiles("web/index.html", "web/header.html", + "web/footer.html", "web/dashboard-marketdepth.html", "web/login.html", + "web/dashboard-ordermanagement.html", "web/dashboard-reports.html", + "web/dashboard-settings.html", "web/dashboard-contact.html", "web/error.html") + + if err != nil { + log.Println("Webserver: Could not parsefile -- ", err) + ServerHTTPError(w, err) + return + } + err = tmpl.ExecuteTemplate(w, pageName, p) + if err != nil { + log.Println("Webserver: Could not execute template -- ", err) } }