From 2ac685be9f87cf1a8a6af5018667798e1fa917b5 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Thu, 5 Jan 2017 02:21:32 +0100 Subject: [PATCH] Hints can something else than text --- admin/api/exercice.go | 30 +++++++++++++++++++++++---- admin/api/file.go | 12 +++-------- admin/fill_exercices.sh | 35 ++++++++++++++++++++++++-------- frontend/static/views/theme.html | 4 +++- libfic/file.go | 3 +-- libfic/hint.go | 10 +++++++++ 6 files changed, 69 insertions(+), 25 deletions(-) diff --git a/admin/api/exercice.go b/admin/api/exercice.go index e00772e7..309a0d71 100644 --- a/admin/api/exercice.go +++ b/admin/api/exercice.go @@ -3,6 +3,7 @@ package api import ( "encoding/json" "errors" + "strings" "srs.epita.fr/fic-server/libfic" @@ -119,17 +120,29 @@ func createExerciceKey(exercice fic.Exercice, body []byte) (interface{}, error) return exercice.AddRawKey(uk.Type, uk.Key) } +type uploadedHint struct { + Title string + Content string + Cost int64 + Path string +} + func createExerciceHint(exercice fic.Exercice, body []byte) (interface{}, error) { - var uh fic.EHint + var uh uploadedHint if err := json.Unmarshal(body, &uh); err != nil { return nil, err } - if len(uh.Content) == 0 { + if len(uh.Content) != 0 { + return exercice.AddHint(uh.Title, uh.Content, uh.Cost) + } else if len(uh.Path) != 0 { + return importFile(uploadedFile{Path: uh.Path}, + func(filePath string, origin string, digest []byte) (interface{}, error) { + return exercice.AddHint(uh.Title, "$FILES" + strings.TrimPrefix(filePath, fic.FilesDir), uh.Cost) + }) + } else { return nil, errors.New("Hint's content not filled") } - - return exercice.AddHint(uh.Title, uh.Content, uh.Cost) } func showExerciceHint(hint fic.EHint, body []byte) (interface{}, error) { @@ -189,6 +202,15 @@ func deleteExerciceKey(key fic.Key, _ fic.Exercice, _ []byte) (interface{}, erro } +func createExerciceFile(exercice fic.Exercice, body []byte) (interface{}, error) { + var uf uploadedFile + if err := json.Unmarshal(body, &uf); err != nil { + return nil, err + } + + return importFile(uf, exercice.ImportFile) +} + func showExerciceFile(file fic.EFile, body []byte) (interface{}, error) { return file, nil } diff --git a/admin/api/file.go b/admin/api/file.go index f7bd1634..f9614a26 100644 --- a/admin/api/file.go +++ b/admin/api/file.go @@ -5,7 +5,6 @@ import ( "crypto/sha512" "encoding/base32" "encoding/hex" - "encoding/json" "errors" "fmt" "log" @@ -29,12 +28,7 @@ type uploadedFile struct { Parts []string } -func createExerciceFile(exercice fic.Exercice, body []byte) (interface{}, error) { - var uf uploadedFile - if err := json.Unmarshal(body, &uf); err != nil { - return nil, err - } - +func importFile(uf uploadedFile, next func(string, string, []byte) (interface{}, error)) (interface{}, error) { var hash [sha512.Size]byte var logStr string var fromURI string @@ -80,7 +74,7 @@ func createExerciceFile(exercice fic.Exercice, body []byte) (interface{}, error) pathname := path.Join(fic.FilesDir, strings.ToLower(base32.StdEncoding.EncodeToString(hash[:])), path.Base(fromURI)) // Remove the file if it exists - if _, err := os.Stat(pathname); os.IsExist(err) && !RapidImport { + if _, err := os.Stat(pathname); !os.IsNotExist(err) && !RapidImport { if err := os.Remove(pathname); err != nil { return nil, err } @@ -98,7 +92,7 @@ func createExerciceFile(exercice fic.Exercice, body []byte) (interface{}, error) if digest, err := hex.DecodeString(uf.Digest); err != nil { return nil, err } else { - return exercice.ImportFile(pathname, fromURI, digest) + return next(pathname, fromURI, digest) } } diff --git a/admin/fill_exercices.sh b/admin/fill_exercices.sh index 149fad64..b57756b6 100755 --- a/admin/fill_exercices.sh +++ b/admin/fill_exercices.sh @@ -59,8 +59,12 @@ new_hint() { TITLE=`echo "$3" | sed 's/"/\\\\"/g'` CONTENT=`echo "$4" | sed 's/"/\\\\"/g' | sed ':a;N;$!ba;s/\n/
/g'` COST="$5" + URI="$6" - curl -f -s -d "{\"title\": \"$TITLE\", \"content\": \"$CONTENT\", \"cost\": $COST}" "${BASEURL}/api/themes/$THEME/exercices/$EXERCICE/hints" | + [ -n "${CONTENT}" ] && CONTENT=", \"content\": \"${CONTENT}\"" + [ -n "${URI}" ] && URI=", \"path\": \"${BASEFILE}${URI}\"" + + curl -f -s -d "{\"title\": \"$TITLE\"$CONTENT$URI, \"cost\": $COST}" "${BASEURL}/api/themes/$THEME/exercices/$EXERCICE/hints" | grep -Eo '"id":[0-9]+,' | grep -Eo "[0-9]+" } @@ -191,15 +195,28 @@ do # Hints - EXO_HINT=$(get_file "${THM_BASEURI}${EXO_BASEURI}/hint.txt") - if [ -n "$EXO_HINT" ]; then - HINT_ID=`new_hint "${THEME_ID}" "${EXO_ID}" "Astuce #1" "${EXO_HINT}" "${HINT_COST}"` - if [ -z "$HINT_ID" ]; then - echo -e "\e[31;01m!!! An error occured during hint import!\e[00m (title=Astuce #1;content=${EXO_HINT};cost=${HINT_COST})" - else - echo -e "\e[32m>>> New hint added:\e[00m $HINT_ID - Astuce #1" + HINTS=$(get_dir "${THM_BASEURI}${EXO_BASEURI}/hints/" | sed -E 's#(.*)#hints/\1#') + [ -z "${HINTS}" ] && HINTS=$(get_dir "${THM_BASEURI}${EXO_BASEURI}/" | grep ^hint.) + [ -z "${HINTS}" ] && HINTS="hint.txt" + HINT_COUNT=1 + echo "${HINTS}" | while read HINT + do + EXO_HINT=$(get_file "${THM_BASEURI}${EXO_BASEURI}/${HINT}") + if [ -n "$EXO_HINT" ]; then + if echo "${EXO_HINT}" | file --mime-type -b - | grep text/ && [ $(echo "${EXO_HINT}" | wc -l) -lt 25 ]; then + HINT_ID=`new_hint "${THEME_ID}" "${EXO_ID}" "Astuce #${HINT_COUNT}" "${EXO_HINT}" "${HINT_COST}"` + else + HINT_ID=`new_hint "${THEME_ID}" "${EXO_ID}" "Astuce #${HINT_COUNT}" "" "${HINT_COST}" "${THM_BASEURI}${EXO_BASEURI}/${HINT}"` + fi + + if [ -z "$HINT_ID" ]; then + echo -e "\e[31;01m!!! An error occured during hint import!\e[00m (title=Astuce #${HINT_COUNT};content=${EXO_HINT};cost=${HINT_COST})" + else + echo -e "\e[32m>>> New hint added:\e[00m $HINT_ID - Astuce #${HINT_COUNT}" + fi fi - fi + HINT_COUNT=$(($HINT_COUNT + 1)) + done # Files: splited diff --git a/frontend/static/views/theme.html b/frontend/static/views/theme.html index 792cf571..af62f802 100644 --- a/frontend/static/views/theme.html +++ b/frontend/static/views/theme.html @@ -35,8 +35,10 @@
+ Télécharger

{{ hint.title }}

-

+

+

Utilisez le bouton pour télécharger l'indice.

Débloquer cet indice vous coûtera .

diff --git a/libfic/file.go b/libfic/file.go index 5b3e74ed..658f7a22 100644 --- a/libfic/file.go +++ b/libfic/file.go @@ -69,7 +69,7 @@ func (e Exercice) GetFiles() ([]EFile, error) { } } -func (e Exercice) ImportFile(filePath string, origin string, digest []byte) (EFile, error) { +func (e Exercice) ImportFile(filePath string, origin string, digest []byte) (interface{}, error) { if digest == nil && !OptionalDigest { return EFile{}, errors.New("No digest given.") } else if fi, err := os.Stat(filePath); err != nil { @@ -84,7 +84,6 @@ func (e Exercice) ImportFile(filePath string, origin string, digest []byte) (EFi if _, err := io.Copy(hash, reader); err != nil { return EFile{}, err } - result := hash.Sum(nil) if len(digest) != len(result) { diff --git a/libfic/hint.go b/libfic/hint.go index 123d4a02..6dab02b6 100644 --- a/libfic/hint.go +++ b/libfic/hint.go @@ -1,6 +1,8 @@ package fic import ( + "path" + "strings" ) type EHint struct { @@ -11,11 +13,18 @@ type EHint struct { Cost int64 `json:"cost"` } +func treatHintContent(content *string) { + if strings.HasPrefix(*content, "$FILES") { + *content = "$FILES" + path.Join(FilesDir, strings.TrimPrefix(*content, "$FILES")) + } +} + func GetHint(id int64) (EHint, error) { var h EHint if err := DBQueryRow("SELECT id_hint, id_exercice, title, content, cost FROM exercice_hints WHERE id_hint = ?", id).Scan(&h.Id, &h.IdExercice, &h.Title, &h.Content, &h.Cost); err != nil { return h, err } + treatHintContent(&h.Content) return h, nil } @@ -33,6 +42,7 @@ func (e Exercice) GetHints() ([]EHint, error) { if err := rows.Scan(&h.Id, &h.Title, &h.Content, &h.Cost); err != nil { return nil, err } + treatHintContent(&h.Content) hints = append(hints, h) } if err := rows.Err(); err != nil {