mirror of https://github.com/dirtbags/moth.git
download everything doc + script
This commit is contained in:
parent
63881f05fa
commit
f75286d0cf
|
@ -0,0 +1,51 @@
|
||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
url=${1%/}
|
||||||
|
teamid=$2
|
||||||
|
|
||||||
|
case "$url:$teamid" in
|
||||||
|
*:|-h*|--h*)
|
||||||
|
cat <<EOD; exit 1
|
||||||
|
Usage: $0 MOTHURL TEAMID
|
||||||
|
|
||||||
|
Downloads all content currently open,
|
||||||
|
and writes it out to a zip file.
|
||||||
|
|
||||||
|
MOTHURL URL to the instance
|
||||||
|
TEAMID Team ID you used to log in
|
||||||
|
EOD
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
tmpdir=$(mktemp -d moth-dl.XXXXXX)
|
||||||
|
bye () {
|
||||||
|
echo "bye now"
|
||||||
|
rm -rf $tmpdir
|
||||||
|
}
|
||||||
|
trap bye EXIT
|
||||||
|
|
||||||
|
fetch () {
|
||||||
|
curl -s -d id=$teamid "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "=== Fetching puzzles and attachments"
|
||||||
|
fetch $url/state > $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"
|
|
@ -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`.
|
Loading…
Reference in New Issue