2016-01-13 19:38:45 +00:00
package main
import (
2016-01-14 17:17:35 +00:00
"encoding/base64"
"encoding/binary"
2016-01-23 11:28:31 +00:00
"encoding/json"
"fmt"
"io/ioutil"
2016-01-13 19:38:45 +00:00
"log"
2016-01-14 17:17:35 +00:00
"math/rand"
2016-01-13 19:38:45 +00:00
"os"
"strconv"
"srs.epita.fr/fic-server/libfic"
)
2017-12-16 00:16:30 +00:00
type ResponsesUpload struct {
Keys map [ string ] string ` json:"flags" `
MCQs map [ int64 ] bool ` json:"mcqs" `
}
2016-03-06 17:57:08 +00:00
func treatSubmission ( pathname string , team fic . Team , exercice_id string ) {
2018-11-16 19:00:48 +00:00
// Generate a unique identifier to follow the request in logs
2016-01-14 17:17:35 +00:00
bid := make ( [ ] byte , 5 )
binary . LittleEndian . PutUint32 ( bid , rand . Uint32 ( ) )
id := "[" + base64 . StdEncoding . EncodeToString ( bid ) + "]"
log . Println ( id , "New submission receive" , pathname )
2016-01-13 19:38:45 +00:00
2018-11-16 19:00:48 +00:00
// Parse exercice_id argument
eid , err := strconv . Atoi ( exercice_id )
if err != nil {
log . Printf ( "%s [ERR] %s is not a valid number: %s\n" , id , exercice_id , err )
return
}
// Find the given exercice
exercice , err := fic . GetExercice ( int64 ( eid ) )
if err != nil {
log . Printf ( "%s [ERR] Unable to find exercice %d: %s" , id , eid , err )
return
}
// Find the corresponding theme
theme , err := exercice . GetTheme ( )
if err != nil {
log . Println ( "%s [ERR] Unable to retrieve theme for exercice %d: %s" , id , eid , err )
return
}
// Read received file
cnt_raw , err := ioutil . ReadFile ( pathname )
if err != nil {
log . Println ( id , "[ERR] Unable to read file;" , err )
return
}
// Parse it
2017-12-16 00:16:30 +00:00
var responses ResponsesUpload
2018-11-16 19:00:48 +00:00
err = json . Unmarshal ( cnt_raw , & responses )
if err != nil {
log . Println ( id , "[ERR] JSON parsing error:" , err )
return
}
2016-01-23 11:28:31 +00:00
2018-11-16 19:00:48 +00:00
// Ensure the team didn't already solve this exercice
s , tm := team . HasSolved ( exercice )
if s {
2016-03-06 17:57:08 +00:00
log . Printf ( "%s [WRN] Team %d ALREADY solved exercice %d (%s : %s)\n" , id , team . Id , exercice . Id , theme . Name , exercice . Title )
2018-11-16 19:00:48 +00:00
return
}
// Check given answers
solved , err := exercice . CheckResponse ( responses . Keys , responses . MCQs , team )
if err != nil {
log . Println ( id , "[ERR] Unable to CheckResponse:" , err )
genTeamMyFile ( team )
return
}
// At this point, we have treated the file, so it can be safely deleted
if err := os . Remove ( pathname ) ; err != nil {
log . Println ( id , "[ERR] Can't remove file:" , err )
}
if solved {
log . Printf ( "%s Team %d SOLVED exercice %d (%s : %s)\n" , id , team . Id , exercice . Id , theme . Name , exercice . Title )
if err := exercice . Solved ( team ) ; err != nil {
log . Println ( id , "[ERR] Unable to mark the challenge as solved:" , err )
}
// Write event
if lvl , err := exercice . GetLevel ( ) ; err != nil {
log . Println ( id , "[ERR] Unable to get exercice level:" , err )
} else if _ , err := fic . NewEvent ( fmt . Sprintf ( "L'équipe %s a résolu le <strong>%d<sup>e</sup></strong> challenge %s !" , team . Name , lvl , theme . Name ) , "alert-success" ) ; err != nil {
log . Println ( id , "[WRN] Unable to create event:" , err )
}
genTeamAll ( team )
2016-01-13 19:38:45 +00:00
} else {
2018-11-16 19:00:48 +00:00
log . Printf ( "%s Team %d submit an invalid solution for exercice %d (%s : %s)\n" , id , team . Id , exercice . Id , theme . Name , exercice . Title )
2016-01-25 02:09:22 +00:00
2018-11-16 19:00:48 +00:00
// Write event (only on first try)
if tm . Unix ( ) == 0 {
2016-01-25 02:09:22 +00:00
if lvl , err := exercice . GetLevel ( ) ; err != nil {
2018-11-16 19:00:48 +00:00
log . Println ( id , "[ERR] Unable to get exercice level:" , err )
} else if _ , err := fic . NewEvent ( fmt . Sprintf ( "L'équipe %s tente le <strong>%d<sup>e</sup></strong> challenge %s !" , team . Name , lvl , theme . Name ) , "alert-warning" ) ; err != nil {
2016-01-25 02:09:22 +00:00
log . Println ( id , "[WRN] Unable to create event:" , err )
}
2018-01-23 00:16:25 +00:00
}
2018-11-16 19:00:48 +00:00
genTeamMyFile ( team )
}
if err := genEventsFile ( ) ; err != nil {
log . Println ( "events.json generation error: " , err )
2016-01-25 02:09:22 +00:00
}
2016-01-23 11:28:31 +00:00
}