package main import ( "encoding/json" "fmt" "github.com/gorilla/sessions" "log" "math/rand" "net/http" "strconv" ) type prob struct { Operation string First int Second int Score int } type solution struct { Status bool Score int } type JsonHandler func(http.ResponseWriter, *http.Request) func (h JsonHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") h(w, req) } func getScore(session *sessions.Session) int { score := session.Values["Score"] var parsed_score int if score == nil { parsed_score = 0 } else { parsed_score = score.(int) } return parsed_score } func problem(w http.ResponseWriter, req *http.Request) { operation := "+" if r := rand.Intn(2); r == 0 { operation = "-" } first := rand.Intn(MAX) var second int if operation == "-" { if first == 0 { second = 0 } else { second = rand.Intn(first) } } else { second = rand.Intn(MAX) } session, _ := store.Get(req, "Score") score := getScore(session) r := prob{operation, first, second, score} b, err := json.Marshal(r) if err != nil { log.Fatal("issue with json marshalling", err) } j := string(b) fmt.Println("problem", j) fmt.Fprintf(w, j) } func attempt(w http.ResponseWriter, req *http.Request) { first, err := strconv.Atoi(req.FormValue("first")) if err != nil { log.Fatal("cannot parse first", err) } operation := req.FormValue("operation") second, err := strconv.Atoi(req.FormValue("second")) if err != nil { log.Fatal("cannot parse second", err) } var guess int answer := req.FormValue("answer") if answer == "" { guess = 0 } else { guess, err = strconv.Atoi(answer) if err != nil { log.Fatal("cannot parser answer", err) } } var result bool if operation == "+" { result = first+second == guess } else if operation == "-" { result = first-second == guess } session, _ := store.Get(req, "Score") score := getScore(session) if result { score += 1 } else { score -= 1 } session.Values["Score"] = score session.Save(req, w) b, err := json.Marshal(solution{result, score}) if err != nil { log.Fatal("cannot marshal solution", err) } j := string(b) fmt.Println("attempt", j) fmt.Fprintf(w, j) }