From be7a15981566cb44bf5ff5a093c3f3a79bbb342e Mon Sep 17 00:00:00 2001 From: nemunaire Date: Fri, 17 Aug 2018 21:13:13 +0200 Subject: [PATCH] sync: Perfers content from challenge.txt to import hints --- admin/sync/exercice_hints.go | 99 +++++++++++++++++------------------- 1 file changed, 47 insertions(+), 52 deletions(-) diff --git a/admin/sync/exercice_hints.go b/admin/sync/exercice_hints.go index e95f12a7..c95fb1f0 100644 --- a/admin/sync/exercice_hints.go +++ b/admin/sync/exercice_hints.go @@ -24,67 +24,62 @@ func SyncExerciceHints(i Importer, exercice fic.Exercice) (errs []string) { if _, err := exercice.WipeHints(); err != nil { errs = append(errs, err.Error()) - } else if ! i.exists(path.Join(exercice.Path, "hints")) { - return - } else if hints, err := i.listDir(path.Join(exercice.Path, "hints")); err != nil { - errs = append(errs, err.Error()) } else { - for n, hfile := range hints { - // Find corresponding parameters - var hint_title = fmt.Sprintf("Astuce #%d", n + 1) - var hint_cost = exercice.Gain / 4 - for _, hp := range params.Hints { - if hp.Filename == hfile { - if hp.Cost > 0 { - hint_cost = hp.Cost + for n, hint := range params.Hints { + if hint.Title != "" { + hint.Title = fmt.Sprintf("Astuce #%d", n+1) + } + if hint.Cost <= 0 { + hint.Cost = exercice.Gain / 4 + } + + if hint.Filename != "" { + if hint.Content != "" { + errs = append(errs, fmt.Sprintf("%q: challenge.txt: hint %s (%d): content and filename can't be filled at the same time", path.Base(exercice.Path), hint.Title, n+1)) + continue + } else if !i.exists(path.Join(exercice.Path, "hints", hint.Filename)) { + errs = append(errs, fmt.Sprintf("%q: challenge.txt: hint %s (%d): %s: File not found", path.Base(exercice.Path), hint.Title, n+1, hint.Filename)) + continue + } else { + // Handle files as downloadable content + if res, err := i.importFile(path.Join(exercice.Path, "hints", hint.Filename), func(filePath string, origin string) (interface{}, error) { + // Calculate hash + hash512 := crypto.BLAKE2b_512.New() + if fd, err := os.Open(filePath); err != nil { + return nil, err + } else { + defer fd.Close() + + reader := bufio.NewReader(fd) + if _, err := io.Copy(hash512, reader); err != nil { + return nil, err + } + } + result512 := hash512.Sum(nil) + + // Special format for downloadable hints: $FILES + hexhash + path from FILES/ + return "$FILES" + hex.EncodeToString(result512) + strings.TrimPrefix(filePath, fic.FilesDir), nil + }); err != nil { + errs = append(errs, fmt.Sprintf("%q: unable to import hint file %q: %s", path.Base(exercice.Path), hint.Filename, err)) + continue + } else if s, ok := res.(string); !ok { + errs = append(errs, fmt.Sprintf("%q: unable to import hint file %q: invalid string returned as filename", path.Base(exercice.Path), hint.Filename)) + continue + } else { + hint.Content = s } - if hp.Title != "" { - hint_title = hp.Title - } - break } } - // Extract hint content - var hint_cnt string - - if fi, err := i.stat(path.Join(exercice.Path, "hints", hfile)); err != nil { - errs = append(errs, fmt.Sprintf("%q: unable to add hint %q: %s", path.Base(exercice.Path), hfile, err)) - } else if ! fi.IsDir() && fi.Size() > 512 { - // Handle big files as downloadable content - if res, err := i.importFile(path.Join(exercice.Path, "hints", hfile), func(filePath string, origin string) (interface{}, error) { - // Calculate hash - hash512 := crypto.BLAKE2b_512.New() - if fd, err := os.Open(filePath); err != nil { - return nil, err - } else { - defer fd.Close() - - reader := bufio.NewReader(fd) - if _, err := io.Copy(hash512, reader); err != nil { - return nil, err - } - } - result512 := hash512.Sum(nil) - - return "$FILES" + hex.EncodeToString(result512) + strings.TrimPrefix(filePath, fic.FilesDir), nil - }); err != nil { - errs = append(errs, fmt.Sprintf("%q: unable to import hint file %q: %s", path.Base(exercice.Path), hfile, err)) - continue - } else if s, ok := res.(string); !ok { - errs = append(errs, fmt.Sprintf("%q: unable to import hint file %q: invalid string returned as filename", path.Base(exercice.Path), hfile)) - continue - } else { - hint_cnt = s - } - } else if hint_cnt, err = getFileContent(i, path.Join(exercice.Path, "hints", hfile)); err != nil { - errs = append(errs, fmt.Sprintf("%q: unable to read hint file %q: %s", path.Base(exercice.Path), hfile, err)) + // At this point, filename should have been replaced by Content if filled, so let's ensure that + if hint.Content == "" { + errs = append(errs, fmt.Sprintf("%q: challenge.txt: hint %s (%d): content and filename can't be empty at the same time", path.Base(exercice.Path), hint.Title, n+1)) continue } // Import hint - if _, err := exercice.AddHint(hint_title, hint_cnt, hint_cost); err != nil { - errs = append(errs, fmt.Sprintf("%q: unable to add hint %q: %s", path.Base(exercice.Path), hfile, err)) + if _, err := exercice.AddHint(hint.Title, hint.Content, hint.Cost); err != nil { + errs = append(errs, fmt.Sprintf("%q: challenge.txt: hint %s (%d): %s", path.Base(exercice.Path), hint.Title, n+1, err)) } } }