adventofcode2023/cron.sh

80 lines
2.0 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
# install me in your crontab!
# 0 5 1-25 12 * $HOME/adventofcode2023/cron.sh auto
year=2023
root=~/adventofcode${year}
getinput() {
curl -fsS -b "$root/cookie" -O "https://adventofcode.com/$year/day/$1/input"
}
getsamples() {
curl -fsS "https://adventofcode.com/$year/day/$1" |
awk '/<pre><code>/ {sub("<pre><code>", ""); CODE=1; IDX+=1} /<\/code>/ {CODE=0} CODE {print > sprintf("sample%d.in", IDX)}'
}
if [[ "$*" = "auto" ]]; then
# get the current day in UTC with and without zero padding.
# UTC is a few hours ahead of US Eastern time, so
# it should match the day of the current puzzle even
# if the clocks on tilde.town and AoC aren't synced exactly
day_unpadded=$(TZ=UTC date '+%-d')
day_padded=$(TZ=UTC date '+%0d')
dir=$root/day$day_padded
elif (( $# == 1 || $# == 2 )); then
day_unpadded=$(printf "%d" "$1")
day_padded=$(printf "%02d" "$1")
dir=${2:-}
else
echo >&2 "usage: $0 day [out_dir]"
echo >&2 " $0 auto"
exit 0
fi
if [[ -z "$dir" ]]; then
dir=$root/day$day_padded
fi
if test -e "$dir"; then
echo >&2 "'$dir' already exists! refusing to continue"
exit 1
fi
if ! test -e "$root/cookie"; then
echo >&2 "warning: cookiefile '$root/cookie' not found. consider creating it"
fi
cwd=${PWD:-$(pwd)}
mkdir "$dir"
cd "$dir" || exit 1
error=0
if ! getinput "$day_unpadded"; then
echo >&2 "error: failed to get input for day $day_unpadded"
error=1
fi
if ! getsamples "$day_unpadded"; then
echo >&2 "error: failed to get sample inputs for day $day_unpadded"
error=1
fi
if [[ $error -ne 0 ]]; then
# we might not have managed to grab any files
# at all. try to clean up after ourselves by removing
# the directory (if it's empty)
if cd "$cwd" && rmdir --ignore-fail-on-non-empty "$dir" >&2; then
if ! test -d "$dir"; then
echo "cleaning up '$dir'"
else
echo "not cleaning up '$dir'"
fi
fi
fi
exit $error