package main import ( "bytes" "fmt" "html/template" "log" "net/http" "os" "strings" "github.com/gofiber/fiber/v2" "github.com/gofiber/template/html/v2" "github.com/yuin/goldmark" "lmika.dev/web/isknow/models" ) func main() { questions := models.Game prefix, _ := os.LookupEnv("PATH_PREFIX") engine := html.New("./views", ".html") engine.AddFunc("prefix", func() string { return prefix }) engine.AddFunc("markdown", func(s string) template.HTML { if s == "" { return "" } var buf bytes.Buffer if err := goldmark.Convert([]byte(strings.TrimSpace(s)), &buf); err != nil { return "" } return template.HTML(buf.String()) }) app := fiber.New(fiber.Config{ Views: engine, ViewsLayout: "layout", PassLocalsToViews: true, }) app.Get("/", func(c *fiber.Ctx) error { c.Locals("fadeIn", true) return c.Render("index", fiber.Map{}) }) app.Get("/results", func(c *fiber.Ctx) error { c.Locals("fadeIn", true) return c.Render("results", fiber.Map{}) }) app.Get("/end", func(c *fiber.Ctx) error { c.Locals("fadeIn", true) return c.Render("end", fiber.Map{}) }) app.Get("/:qid", func(c *fiber.Ctx) error { qID, err := c.ParamsInt("qid") if err != nil { return c.SendStatus(http.StatusBadRequest) } idx := qID - 1 if idx < 0 || idx >= len(questions.Questions) { return c.SendStatus(http.StatusBadRequest) } rq, err := questions.Questions[idx].Render() if err != nil { return err } nextURL := prefix + "/results" reachedEnd := true if idx+1 < len(questions.Questions) { nextURL = fmt.Sprintf("%v/%d", prefix, idx+2) reachedEnd = true } c.Locals("fadeIn", idx == 0) return c.Render("question", fiber.Map{ "q": rq, "qIdx": qID, "nextURL": nextURL, "reachedEnd": reachedEnd, }) }) app.Static("/assets", "./public") log.Fatal(app.Listen(":3000")) }