diff --git a/admin/api/theme.go b/admin/api/theme.go index 80c499c9..e225a040 100644 --- a/admin/api/theme.go +++ b/admin/api/theme.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "path" "strconv" "strings" @@ -18,6 +19,13 @@ func init() { router.GET("/api/themes", apiHandler(listThemes)) router.POST("/api/themes", apiHandler(createTheme)) router.GET("/api/themes.json", apiHandler(exportThemes)) + router.GET("/api/session-forensic.yaml", apiHandler(func(_ httprouter.Params, _ []byte) (interface{}, error) { + if s, err := settings.ReadSettings(path.Join(settings.SettingsDir, settings.SettingsFile)); err != nil { + return nil, err + } else { + return fic.GenZQDSSessionFile(s) + } + })) router.GET("/api/files-bindings", apiHandler(bindingFiles)) router.GET("/api/themes/:thid", apiHandler(themeHandler(showTheme))) diff --git a/libfic/zqsd.go b/libfic/zqsd.go new file mode 100644 index 00000000..6afe4bde --- /dev/null +++ b/libfic/zqsd.go @@ -0,0 +1,70 @@ +package fic + +import ( + "time" + + "srs.epita.fr/fic-server/settings" +) + +type ChallengeZQDS struct { + Name string `json:"name"` + Type string `json:"type,omitempty"` + Category string `json:"category"` + Points int64 `json:"points"` + State string `json:"state"` + FirstBloodBonus []float64 `json:"first_blood_bonus,omitempty"` + Description string `json:"description"` + Flags []string `json:"flags,omitempty"` +} + +type SessionZQDS struct { + Name string `json:"name"` + Description string `json:"description"` + Scenario string `json:"scenario"` + YourMission string `json:"your_mission"` + Rules string `json:"rules"` + Start time.Time `json:"start"` + End time.Time `json:"end"` + Challenges []*ChallengeZQDS `json:"challenges"` +} + +func GenZQDSSessionFile(s *settings.FICSettings) (*SessionZQDS, error) { + themes, err := GetThemes() + if err != nil { + return nil, err + } + + var challenges []*ChallengeZQDS + + for _, th := range themes { + exos, err := th.GetExercices() + if err != nil { + return nil, err + } + + for _, ex := range exos { + challenges = append(challenges, &ChallengeZQDS{ + Name: ex.Title, + Type: "first_blood", + Category: th.Name, + Points: ex.Gain, + State: "visible", + FirstBloodBonus: []float64{ + float64(ex.Gain) * (1 + s.FirstBlood), + }, + Description: ex.Overview, + }) + } + } + + return &SessionZQDS{ + Name: "Challenge Forensic", + Description: "", + Scenario: "", + YourMission: "", + Rules: "", + Start: s.Start, + End: s.End, + Challenges: challenges, + }, nil +}