package main import ( "encoding/json" "errors" "time" ) var PongSecret = "felixfixit" func init() { router.GET("/api/students/:sid/ping", apiHandler(studentHandler(lastPing))) router.GET("/api/students/:sid/pong", apiHandler(studentHandler(func (student Student, body []byte) (interface{}, error) { return student.lastPongs() }))) router.POST("/api/students/:sid/pong", apiHandler(studentHandler(stdPong), sslOnly)) } func lastPing(student Student, body []byte) (interface{}, error) { if pongs, err := student.lastPongs(); err != nil { return nil, err } else if len(pongs) <= 0 { return false, nil } else { return pongs[0], nil } } type Pong struct { Date time.Time State bool } func (s Student) lastPongs() (pongs []Pong, err error) { if rows, errr := DBQuery("SELECT time, state FROM student_pong WHERE id_student = ? ORDER BY time DESC", s.Id); errr != nil { return nil, errr } else { defer rows.Close() for rows.Next() { var p Pong if err = rows.Scan(&p.Date, &p.State); err != nil { return } pongs = append(pongs, p) } if err = rows.Err(); err != nil { return } return } } func stdPong(student Student, body []byte) (interface{}, error) { var gt givenToken if err := json.Unmarshal(body, >); err != nil { return nil, err } if gt.Token != PongSecret { return nil, errors.New("This is not the expected token.") } if res, err := DBExec("INSERT INTO student_pong (id_student, time, state) VALUES (?, ?, ?)", student.Id, time.Now(), gt.Challenge == 0); err != nil { return false, err } else if _, err := res.LastInsertId(); err != nil { return false, err } else { return true, err } }