Script 'game-add': a primary support of multiple PGN files added.

This commit is contained in:
vonavi 2014-09-29 13:18:47 +04:00
parent 42167effaa
commit 068b32de98

View File

@ -17,10 +17,10 @@ argv0=${0##*/}
function usage {
cat <<EOF
Store a chess game played on lichess.org
Store chess games played on lichess.org
Usage:
$argv0 -t <num> <url>
$argv0 -t <num> [-u] [<url>]
$argv0 -h
$argv0 -v
@ -28,10 +28,17 @@ Usage:
inner variable REPO_DIR to it. If the tournament is not the last one
(default), store its sub-directory in inner variable TOURNAMENT.
The first form fills the result of a chess game and stores its PGN
file, assuming that the game is available at <url> (lichess.org) and
corresponds to tournament tour <num>. The second form shows this
help output. The third form shows version information.
The first form fills the results of chess games and stores its PGN
files, assuming that all the games were played by the same pair of
players on tour <num> of the tournament. The PGN files are sorted by
their timestamps, unless '-u' is set. Each game should be available
at the corresponding <url> (lichess.org).
The second form shows this help output. The third form shows version
information.
Options:
-u Don't sort games by their timestamps
EOF
exit "${1:-0}"
@ -59,6 +66,36 @@ function game_setup {
ply_ini=${REPO_DIR}/${TOURNAMENT}/players.ini
}
function game_mktemp {
# Don't sort just one game
[[ $# == 1 ]] && SORT_GAMES=false
for url in $@; do
local pgn_template="pgn"
[[ $url =~ ^(http://[^/]*)/([^/]*) ]]
# Link to annotated game PGN
local game_url=${BASH_REMATCH[1]}/game/export/${BASH_REMATCH[2]::8}.pgn
# Append the timestamp of game for sorting
if $SORT_GAMES; then
local game_api=${BASH_REMATCH[1]}/api/game/${BASH_REMATCH[2]::8}
local api_response=$(curl -q --fail --location --silent "$game_api")
[[ -z $api_response ]] && die "Unreachable game API ${game_api}"
local game_time=$(sed -En "s/.*\"timestamp\":([0-9]+).*/\1/p" <<< "$api_response")
pgn_template+="-${game_time}"
fi
# Store PGN file in a temporal location
local tmp_pgn=$(mktemp -t ${pgn_template}.XXXXXX)
TMP_PGN_FILES+=" $tmp_pgn"
trap "rm $TMP_INI_FILES $TMP_PGN_FILES" EXIT
wget -q -U "$FIREFOX_UA" -O $tmp_pgn "$game_url" \
|| die "Unreachable game PGN ${game_url}"
done
$SORT_GAMES && TMP_PGN_FILES=$(echo "$TMP_PGN_FILES" | xargs -n1 | sort | xargs)
}
function game_get_players {
# Extract players on Lichess
local wt_lichess=$(sed -En "s/\[White \"([^\"]*)\"\]/\1/p" $tmp_pgn)
@ -195,28 +232,31 @@ function game_git_commit {
}
function die {
echo "$@" 1>&2
echo "$@" >&2
exit 1
}
function checkargs {
if [[ $opt == t && $OPTARG =~ ^[0-9]+$ ]]; then
if [[ $opt == t ]]; then
[[ ! $OPTARG =~ ^[0-9]+$ ]] && die "Incorrect tour number."
TOUR=$(printf "%02g" $OPTARG)
fi
}
while getopts t:hv opt; do
SORT_GAMES=true
while getopts t:uhv opt; do
case $opt in
t) checkargs ;;
h) usage ;;
v) version ;;
*) usage 1 ;;
t) checkargs ;;
u) SORT_GAMES=false ;;
h) usage ;;
v) version ;;
*) usage 1 ;;
esac
done
shift $(($OPTIND - 1))
# For now, tour number should be given explicitly
[[ -z $TOUR || -z $1 ]] && usage 1
[[ -z $TOUR || $# == 0 ]] && usage 1
game_setup
tour_info=${REPO_DIR}/${TOURNAMENT}/tours/${TOUR}/tour_info
@ -227,15 +267,9 @@ git pull
# Temporary files
tmp_ini=$(mktemp -t `basename $ply_ini`.XXXXXX)
tmp_pgn=$(mktemp -t pgn.XXXXXX)
trap "rm ${tmp_ini} ${tmp_ini}.prev ${tmp_pgn}" EXIT
# Download PGN file
[[ $1 =~ ^(http://[^/]*)/([^/]*) ]]
# Link to annotated PGN
pgn_url=${BASH_REMATCH[1]}/game/export/${BASH_REMATCH[2]::8}.pgn
wget -q -U "$FIREFOX_UA" -O $tmp_pgn "$pgn_url" \
|| die "PGN file at $pgn_url not found."
TMP_INI_FILES="${tmp_ini} ${tmp_ini}.prev"
TMP_PGN_FILES=
game_mktemp $@
game_get_players
game_add_to_repo