2016-01-13 19:25:25 +00:00
package fic
2016-01-07 17:43:02 +00:00
2016-01-18 18:40:11 +00:00
import (
2017-01-19 12:12:26 +00:00
"regexp"
2016-01-18 18:40:11 +00:00
"time"
)
2016-01-07 17:43:02 +00:00
2016-12-04 17:58:53 +00:00
var UnlockedChallenges bool
2016-01-07 17:43:02 +00:00
type Team struct {
2016-04-28 14:11:19 +00:00
Id int64 ` json:"id" `
InitialName string ` json:"initialName" `
Name string ` json:"name" `
Color uint32 ` json:"color" `
2016-01-07 17:43:02 +00:00
}
2016-12-27 20:12:17 +00:00
// Access functions
2016-01-07 17:43:02 +00:00
func GetTeams ( ) ( [ ] Team , error ) {
2016-04-28 14:11:19 +00:00
if rows , err := DBQuery ( "SELECT id_team, initial_name, name, color FROM teams" ) ; err != nil {
2016-01-07 17:43:02 +00:00
return nil , err
} else {
defer rows . Close ( )
var teams = make ( [ ] Team , 0 )
for rows . Next ( ) {
var t Team
2016-04-28 14:11:19 +00:00
if err := rows . Scan ( & t . Id , & t . InitialName , & t . Name , & t . Color ) ; err != nil {
2016-01-07 17:43:02 +00:00
return nil , err
}
teams = append ( teams , t )
}
if err := rows . Err ( ) ; err != nil {
return nil , err
}
return teams , nil
}
}
func GetTeam ( id int ) ( Team , error ) {
var t Team
2016-04-28 14:11:19 +00:00
if err := DBQueryRow ( "SELECT id_team, initial_name, name, color FROM teams WHERE id_team = ?" , id ) . Scan ( & t . Id , & t . InitialName , & t . Name , & t . Color ) ; err != nil {
return t , err
}
return t , nil
}
func GetTeamByInitialName ( initialName string ) ( Team , error ) {
var t Team
if err := DBQueryRow ( "SELECT id_team, initial_name, name, color FROM teams WHERE initial_name = ?" , initialName ) . Scan ( & t . Id , & t . InitialName , & t . Name , & t . Color ) ; err != nil {
2016-01-07 17:43:02 +00:00
return t , err
}
return t , nil
}
2016-12-27 20:12:17 +00:00
// CRUD method
2016-02-26 00:29:01 +00:00
func CreateTeam ( name string , color uint32 ) ( Team , error ) {
2017-01-19 12:12:26 +00:00
re := regexp . MustCompile ( "[^a-zA-Z0-9]+" )
initialName := re . ReplaceAllLiteralString ( name , "_" )
if res , err := DBExec ( "INSERT INTO teams (initial_name, name, color) VALUES (?, ?, ?)" , initialName , name , color ) ; err != nil {
2016-01-07 17:43:02 +00:00
return Team { } , err
} else if tid , err := res . LastInsertId ( ) ; err != nil {
return Team { } , err
} else {
2016-04-28 14:11:19 +00:00
return Team { tid , name , name , color } , nil
2016-01-07 17:43:02 +00:00
}
}
func ( t Team ) Update ( ) ( int64 , error ) {
2016-01-20 09:14:13 +00:00
if res , err := DBExec ( "UPDATE teams SET name = ?, color = ? WHERE id_team = ?" , t . Name , t . Color , t . Id ) ; err != nil {
2016-01-07 17:43:02 +00:00
return 0 , err
} else if nb , err := res . RowsAffected ( ) ; err != nil {
return 0 , err
} else {
return nb , err
}
}
func ( t Team ) Delete ( ) ( int64 , error ) {
2017-11-10 19:23:45 +00:00
if _ , err := DBExec ( "DELETE FROM team_members WHERE id_team = ?" , t . Id ) ; err != nil {
return 0 , err
} else if res , err := DBExec ( "DELETE FROM teams WHERE id_team = ?" , t . Id ) ; err != nil {
2016-01-07 17:43:02 +00:00
return 0 , err
} else if nb , err := res . RowsAffected ( ) ; err != nil {
return 0 , err
} else {
return nb , err
}
}
2016-01-15 11:57:35 +00:00
2016-01-21 00:36:58 +00:00
2016-12-27 20:12:17 +00:00
// Exercice related functions
2016-01-25 02:06:58 +00:00
2016-01-18 17:24:46 +00:00
func ( t Team ) HasAccess ( e Exercice ) bool {
2016-12-04 17:58:53 +00:00
if e . Depend == nil || UnlockedChallenges {
2016-01-18 17:24:46 +00:00
return true
} else {
ed := Exercice { }
ed . Id = * e . Depend
2016-01-18 18:40:11 +00:00
s , _ , _ := t . HasSolved ( ed )
return s
2016-01-18 17:24:46 +00:00
}
}
2016-10-13 17:52:13 +00:00
func NbTry ( t * Team , e Exercice ) int {
var cnt * int
if t != nil {
DBQueryRow ( "SELECT COUNT(*) FROM exercice_tries WHERE id_team = ? AND id_exercice = ?" , t . Id , e . Id ) . Scan ( & cnt )
} else {
DBQueryRow ( "SELECT COUNT(*) FROM exercice_tries WHERE id_exercice = ?" , e . Id ) . Scan ( & cnt )
}
if cnt == nil {
return 0
} else {
return * cnt
}
}
2016-12-04 18:15:39 +00:00
func ( t Team ) HasHint ( h EHint ) ( bool ) {
var tm * time . Time
DBQueryRow ( "SELECT MIN(time) FROM team_hints WHERE id_team = ? AND id_hint = ?" , t . Id , h . Id ) . Scan ( & tm )
return tm != nil
}
2016-12-09 10:49:29 +00:00
func ( t Team ) OpenHint ( h EHint ) ( error ) {
_ , err := DBExec ( "INSERT INTO team_hints (id_team, id_hint, time) VALUES (?, ?, ?)" , t . Id , h . Id , time . Now ( ) )
return err
}
2017-01-16 12:09:31 +00:00
func ( t Team ) CountTries ( e Exercice ) ( int64 , time . Time ) {
var nb * int64
var tm * time . Time
if DBQueryRow ( "SELECT COUNT(id_exercice), MAX(time) FROM exercice_tries WHERE id_team = ? AND id_exercice = ?" , t . Id , e . Id ) . Scan ( & nb , & tm ) ; tm == nil {
return 0 , time . Unix ( 0 , 0 )
} else if nb == nil {
return 0 , * tm
} else {
return * nb , * tm
}
}
2017-12-17 01:48:02 +00:00
func ( t Team ) LastTryDist ( e Exercice ) int64 {
var nb * int64
if DBQueryRow ( "SELECT nbdiff FROM exercice_tries WHERE id_team = ? AND id_exercice = ? ORDER BY time DESC LIMIT 1" , t . Id , e . Id ) . Scan ( & nb ) ; nb == nil {
return 0
} else {
return * nb
}
}
2016-01-18 18:40:11 +00:00
func ( t Team ) HasSolved ( e Exercice ) ( bool , time . Time , int64 ) {
2016-01-23 12:16:31 +00:00
var nb * int64
var tm * time . Time
if DBQueryRow ( "SELECT MIN(time) FROM exercice_solved WHERE id_team = ? AND id_exercice = ?" , t . Id , e . Id ) . Scan ( & tm ) ; tm == nil {
2017-01-16 12:09:31 +00:00
return false , time . Unix ( 0 , 0 ) , 0
2016-01-23 12:16:31 +00:00
} else if DBQueryRow ( "SELECT COUNT(id_exercice) FROM exercice_solved WHERE id_exercice = ? AND time < ?" , e . Id , tm ) . Scan ( & nb ) ; nb == nil {
return true , * tm , 0
2016-01-15 11:57:35 +00:00
} else {
2016-01-23 12:16:31 +00:00
return true , * tm , * nb + 1
2016-01-15 11:57:35 +00:00
}
}
2016-03-06 17:57:08 +00:00
2016-10-13 17:52:40 +00:00
func IsSolved ( e Exercice ) ( int , time . Time ) {
var nb * int
var tm * time . Time
if DBQueryRow ( "SELECT COUNT(id_exercice), MIN(time) FROM exercice_solved WHERE id_exercice = ?" , e . Id ) . Scan ( & nb , & tm ) ; nb == nil || tm == nil {
return 0 , time . Time { }
} else {
return * nb , * tm
}
}
2016-12-04 18:08:46 +00:00
func ( t Team ) HasPartiallySolved ( k Key ) ( * time . Time ) {
var tm * time . Time
DBQueryRow ( "SELECT MIN(time) FROM key_found WHERE id_team = ? AND id_key = ?" , t . Id , k . Id ) . Scan ( & tm )
return tm
}
2017-12-16 00:16:30 +00:00
func ( t Team ) HasPartiallyRespond ( m MCQ ) ( * time . Time ) {
var tm * time . Time
DBQueryRow ( "SELECT MIN(time) FROM mcq_found WHERE id_team = ? AND id_mcq = ?" , t . Id , m . Id ) . Scan ( & tm )
return tm
}