diff --git a/contrib/download-everything.sh b/contrib/download-everything.sh new file mode 100755 index 0000000..ad6e5e0 --- /dev/null +++ b/contrib/download-everything.sh @@ -0,0 +1,51 @@ +#! /bin/sh + +url=${1%/} +teamid=$2 + +case "$url:$teamid" in + *:|-h*|--h*) + cat < $tmpdir/state.json +cat $tmpdir/state.json \ +| jq -r '.Puzzles | to_entries[] | .key as $k | .value[] | select (. > 0) | "\($k) \(.)"' \ +| while read cat points; do + echo " + $cat $points" + dir=$tmpdir/$cat/$points + mkdir -p $dir + fetch $url/content/$cat/$points/puzzle.json > $dir/puzzle.json + cat $dir/puzzle.json | jq .Body > $dir/puzzle.html + cat $dir/puzzle.json | jq -r '.Attachments[]?' | while read attachment; do + echo " - $attachment" + fetch $url/content/$cat/$points/$attachment > $dir/$attachment + done +done + +zipfile=$(echo $url | grep -o '[a-z]*\.[a-z.]*').zip +echo "=== Writing $zipfile" +(cd $tmpdir && zip -r - .) > $zipfile + +echo "=== Wrote $zipfile" diff --git a/docs/download-everything.md b/docs/download-everything.md new file mode 100644 index 0000000..62334b0 --- /dev/null +++ b/docs/download-everything.md @@ -0,0 +1,26 @@ +Download All Unlocked Puzzles +======================== + +We get a lot of requests to "download everything" from an event. +Here's how you could do that: + +What You Need +------------ + +* The URL to your puzzle server. We will call this `$url`. +* Your Team ID. We will call this `$teamid`. +* A way to POST `$teamid` to a URL, and save the result. We will call this procedure "Fetch". +* A way to parse JSON files + +Steps +----- + +1. Fetch `$url/state`. This is the State object. +2. In the State object, `Puzzles` maps category name to a list of open puzzle point values. +3. For each category (we will call this `$category`): + 1. For each point value: + 1. If the point value is 0, skip it. 0 indicates all puzzles in this category are unlocked. + 2. Fetch `$url/content/$category/$points/index.json`. This is the Puzzle object. + 3. In the Puzzle object, `Body` contains the HTML body of the puzzle. + 4. For each file listed in `Attachments` (we will call this `$attachment`): + 1. Fetch `$url/content/$category/$points/$attachment`.