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"
"errors"
"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"
2016-01-23 11:28:31 +00:00
"path"
2016-01-24 13:23:04 +00:00
"regexp"
2016-01-13 19:38:45 +00:00
"strconv"
"srs.epita.fr/fic-server/libfic"
)
2016-01-14 17:17:35 +00:00
func treatSubmission ( pathname string , team_id string , exercice_id string ) {
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
2016-01-23 11:28:31 +00:00
var keys map [ string ] string
2016-01-13 19:38:45 +00:00
if tid , err := strconv . Atoi ( team_id ) ; err != nil {
2016-01-14 17:17:35 +00:00
log . Println ( id , "[ERR]" , err )
2016-01-13 19:38:45 +00:00
} else if team , err := fic . GetTeam ( tid ) ; err != nil {
2016-01-14 17:17:35 +00:00
log . Println ( id , "[ERR]" , err )
2016-01-23 11:28:31 +00:00
} else if cnt_raw , err := ioutil . ReadFile ( pathname ) ; err != nil {
log . Println ( id , "[ERR]" , err )
} else if err := json . Unmarshal ( cnt_raw , & keys ) ; 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 exercice_id == "name" {
2016-01-24 13:23:04 +00:00
if match , err := regexp . MatchString ( "^[A-Za-z0-9 àéèêëîïôùûü_-]{1,32}$" , keys [ "newName" ] ) ; err == nil && match {
team . Name = keys [ "newName" ]
if _ , err := team . Update ( ) ; err != nil {
log . Println ( id , "[WRN] Unable to change team name:" , err )
}
genTeamMyFile ( team )
2016-01-25 02:09:22 +00:00
if _ , err := fic . NewEvent ( fmt . Sprintf ( "Souhaitons bonne chance à l'équipe <strong>%s</strong> qui vient de nous rejoindre !" , team . Name ) , "alert-info" ) ; err != nil {
log . Println ( id , "[WRN] Unable to create event:" , err )
}
2016-01-24 13:23:04 +00:00
}
if err := os . Remove ( pathname ) ; err != nil {
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 {
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 {
2016-02-26 00:27:08 +00:00
if solved , err := exercice . CheckResponse ( keys , team ) ; err != nil {
2016-01-15 11:57:35 +00:00
log . Println ( id , "[ERR]" , err )
} 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-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-01-15 11:57:35 +00:00
}
2016-01-23 11:28:31 +00:00
genTeamMyFile ( team )
2016-01-13 19:38:45 +00:00
}
}
2016-01-23 11:28:31 +00:00
func genTeamMyFile ( team fic . Team ) error {
dirPath := path . Join ( TeamsDir , fmt . Sprintf ( "%d" , team . Id ) )
2016-01-25 02:09:22 +00:00
started := true
if _ , err := os . Stat ( path . Join ( TeamsDir , "started" ) ) ; os . IsNotExist ( err ) {
started = false
}
2016-01-23 11:28:31 +00:00
if s , err := os . Stat ( dirPath ) ; os . IsNotExist ( err ) {
os . MkdirAll ( dirPath , 0777 )
2016-01-23 12:19:28 +00:00
} else if ! s . IsDir ( ) {
2016-01-23 11:28:31 +00:00
return errors . New ( "dirPath is not a directory" )
}
if my , err := fic . MyJSONTeam ( & team , true ) ; err != nil {
return err
} else if j , err := json . Marshal ( my ) ; err != nil {
return err
} else if err := ioutil . WriteFile ( path . Join ( dirPath , "my.json" ) , j , 0666 ) ; err != nil {
return err
}
2016-01-25 02:09:22 +00:00
if ! started {
if my , err := fic . MyJSONTeam ( & team , false ) ; err != nil {
return err
} else if j , err := json . Marshal ( my ) ; err != nil {
return err
} else if err := ioutil . WriteFile ( path . Join ( dirPath , "wait.json" ) , j , 0666 ) ; err != nil {
return err
}
}
2016-01-23 11:28:31 +00:00
return nil
}