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 ) {
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
2017-12-16 00:16:30 +00:00
var responses ResponsesUpload
2016-01-23 11:28:31 +00:00
2016-03-06 17:57:08 +00:00
if cnt_raw , err := ioutil . ReadFile ( pathname ) ; err != nil {
2016-01-23 11:28:31 +00:00
log . Println ( id , "[ERR]" , err )
2017-12-16 00:16:30 +00:00
} else if err := json . Unmarshal ( cnt_raw , & responses ) ; err != nil {
2016-01-14 17:17:35 +00:00
log . Println ( id , "[ERR]" , err )
2016-01-24 10:42:58 +00:00
} else if eid , err := strconv . Atoi ( exercice_id ) ; err != nil {
log . Println ( id , "[ERR]" , err )
2016-01-25 02:09:22 +00:00
} else if exercice , err := fic . GetExercice ( int64 ( eid ) ) ; err != nil {
2016-01-24 10:42:58 +00:00
log . Println ( id , "[ERR]" , err )
} else if theme , err := exercice . GetTheme ( ) ; err != nil {
log . Println ( id , "[ERR]" , err )
2016-02-26 00:27:08 +00:00
} else if s , tm , _ := team . HasSolved ( exercice ) ; 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 )
2016-01-13 19:38:45 +00:00
} else {
2017-12-16 00:16:30 +00:00
if solved , err := exercice . CheckResponse ( responses . Keys , responses . MCQs , team ) ; err != nil {
2016-01-15 11:57:35 +00:00
log . Println ( id , "[ERR]" , err )
2016-03-06 17:57:08 +00:00
genTeamMyFile ( team )
2016-01-15 11:57:35 +00:00
} else if solved {
exercice . Solved ( team )
2016-01-23 11:28:31 +00:00
log . Printf ( "%s Team %d SOLVED exercice %d (%s : %s)\n" , id , team . Id , exercice . Id , theme . Name , exercice . Title )
2016-01-15 12:03:34 +00:00
if err := os . Remove ( pathname ) ; err != nil {
log . Println ( id , "[ERR]" , err )
}
2016-01-25 02:09:22 +00:00
// Write event
if lvl , err := exercice . GetLevel ( ) ; err != nil {
log . Println ( id , "[ERR]" , 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 )
}
2016-03-06 17:57:08 +00:00
genTeamAll ( team )
2016-01-15 11:57:35 +00:00
} else {
2016-01-23 11:28:31 +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-15 12:03:34 +00:00
if err := os . Remove ( pathname ) ; err != nil {
log . Println ( id , "[ERR]" , err )
}
2016-01-25 02:09:22 +00:00
2016-02-26 00:27:08 +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 {
log . Println ( id , "[ERR]" , 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 {
log . Println ( id , "[WRN] Unable to create event:" , err )
}
}
2016-03-06 17:57:08 +00:00
genTeamMyFile ( team )
2016-01-25 02:09:22 +00:00
}
}
2016-01-23 11:28:31 +00:00
}