2014-05-08 17:46:57 +04:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
# Copyright 2014 Vladimir Ivanov <ivvl82@gmail.com>
|
|
|
|
# Distributed under the terms of the GNU General Public License v2
|
|
|
|
|
2014-05-09 14:30:22 +04:00
|
|
|
REPODIR="`dirname $0`"
|
|
|
|
TOURNAMENT="2014/2-summertime"
|
2014-05-08 17:46:57 +04:00
|
|
|
|
|
|
|
# Config file for players
|
2014-05-09 14:30:22 +04:00
|
|
|
ply_ini="${REPODIR}/${TOURNAMENT}/players.ini"
|
2014-05-08 17:46:57 +04:00
|
|
|
|
|
|
|
get_game_players() {
|
|
|
|
# Extract players on Lichess
|
|
|
|
local w_lichess=$(sed -En "s/\[White \"([^\"]*)\"\]/\1/p" < "$tmp_pgn")
|
|
|
|
local b_lichess=$(sed -En "s/\[Black \"([^\"]*)\"\]/\1/p" < "$tmp_pgn")
|
|
|
|
|
|
|
|
# Get names of white and black players
|
|
|
|
local counter=1 players=()
|
|
|
|
parse_config
|
|
|
|
while eval "config_section_player${counter}" 2>/dev/null; do
|
|
|
|
players+=("$name")
|
|
|
|
[[ "$lichess" == "$w_lichess" ]] && white="$name"
|
|
|
|
[[ "$lichess" == "$b_lichess" ]] && black="$name"
|
|
|
|
counter=$((counter+1))
|
|
|
|
done
|
|
|
|
[[ -z "$white" ]] && fix_white_player
|
|
|
|
[[ -z "$black" ]] && fix_black_player
|
|
|
|
}
|
|
|
|
|
|
|
|
parse_config() {
|
|
|
|
# Copy player INI file to the temporary location
|
2014-05-08 20:06:57 +04:00
|
|
|
# NOTE: an empty line is added to the file beginning in order to
|
|
|
|
# match the only first occurrence for non-GNU sed
|
|
|
|
echo > "$tmp_ini"
|
|
|
|
cat "$ply_ini" >> "$tmp_ini"
|
2014-05-08 17:46:57 +04:00
|
|
|
|
|
|
|
# Remove tabs or spaces around the `='
|
2014-05-08 20:06:57 +04:00
|
|
|
sed -i".prev" -E "s/[[:blank:]]*=[[:blank:]]*/=/g" "$tmp_ini"
|
2014-05-08 17:46:57 +04:00
|
|
|
|
|
|
|
# Transform section labels into function declaration
|
2014-05-08 20:06:57 +04:00
|
|
|
sed -i".prev" -E "1,/^\[.*\]/s/^\[([^]]*)\]/config_section_\1() {/g" "$tmp_ini"
|
|
|
|
sed -i".prev" -E "s/^\[([^]]*)\]/}\\"$'\n'"config_section_\1() {/g" "$tmp_ini"
|
2014-05-08 17:46:57 +04:00
|
|
|
echo -e "\n}" >> "$tmp_ini"
|
|
|
|
|
|
|
|
# Load the file
|
|
|
|
source "$tmp_ini"
|
|
|
|
}
|
|
|
|
|
|
|
|
fix_white_player() {
|
|
|
|
local number
|
2014-05-08 20:06:57 +04:00
|
|
|
echo "Lichess player '${w_lichess}' not found."
|
2014-05-08 17:46:57 +04:00
|
|
|
choose_player
|
|
|
|
white="${players[$number]}"
|
|
|
|
}
|
|
|
|
|
|
|
|
fix_black_player() {
|
|
|
|
local number
|
2014-05-08 20:06:57 +04:00
|
|
|
echo "Lichess player '${b_lichess}' not found."
|
2014-05-08 17:46:57 +04:00
|
|
|
choose_player
|
|
|
|
black="${players[$number]}"
|
|
|
|
}
|
|
|
|
|
|
|
|
choose_player() {
|
|
|
|
local answer
|
|
|
|
echo -n "Would you like to choose a name? (Y/n)> "
|
|
|
|
read answer
|
2014-05-08 20:06:57 +04:00
|
|
|
[[ "$answer" =~ ^(Y|y|Yes|yes)$ ]] || exit 1
|
|
|
|
|
2014-05-08 17:46:57 +04:00
|
|
|
for ((i=0; i<${#players[@]}; ++i)); do
|
|
|
|
echo "$((i+1)) ${players[$i]}"
|
|
|
|
done \
|
|
|
|
| column -t \
|
|
|
|
| sed -E "s/^([0-9]*)/$(tput setaf 6)\1$(tput sgr0)/g" # highlight number
|
|
|
|
echo -n "Put number> "
|
|
|
|
read number
|
2014-05-08 20:06:57 +04:00
|
|
|
|
|
|
|
if (( "$number" < 1 || "$number" > ${#players[@]} )); then
|
|
|
|
die "Incorrect player number."
|
|
|
|
fi
|
2014-05-08 17:46:57 +04:00
|
|
|
number=$((number-1))
|
|
|
|
}
|
|
|
|
|
2014-05-09 15:38:59 +04:00
|
|
|
update_tour_info() {
|
|
|
|
local date_re="[0-9?]{2}\.[0-9?]{2}\.[0-9?]{4}"
|
|
|
|
|
|
|
|
local tour_info="${REPODIR}/${TOURNAMENT}/tours/${TOUR}/tour_info"
|
|
|
|
[[ ! -f "$tour_info" ]] && die "Tour_info not found in ${REPODIR}/${TOURNAMENT}/tours/${TOUR}."
|
|
|
|
|
|
|
|
local game_date="${date:8:2}.${date:5:2}.${date::4}"
|
|
|
|
local result=$(sed -En "s/\[Result \"([^\"]*)\"\]/\1/p" < "$tmp_pgn")
|
|
|
|
case "$result" in
|
|
|
|
"1-0") result="1:0" ;;
|
|
|
|
"0-1") result="0:1" ;;
|
|
|
|
"1/2-1/2") result="0.5:0.5" ;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
sed -i".orig" \
|
|
|
|
-E "s/${date_re}( *[-—] *)${white} *${black}/${game_date}\1${white} ${result} ${black}/g" \
|
|
|
|
"$tour_info"
|
|
|
|
rm "${tour_info}.orig"
|
|
|
|
}
|
|
|
|
|
2014-05-08 17:46:57 +04:00
|
|
|
die() {
|
|
|
|
echo "$@" 1>&2
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
checkargs() {
|
|
|
|
if [[ "$opt" == t && ! "$OPTARG" =~ ^[0-9]+$ ]]; then
|
|
|
|
echo "Incorrect tour number" 1>&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
TOUR=""
|
|
|
|
|
|
|
|
while getopts "t:hv" opt; do
|
|
|
|
case "$opt" in
|
|
|
|
t) checkargs
|
|
|
|
TOUR=$(printf "%02g" "$OPTARG")
|
|
|
|
;;
|
|
|
|
h) usage && exit 0
|
|
|
|
;;
|
|
|
|
v) version && exit 0
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
shift $(($OPTIND - 1))
|
|
|
|
|
|
|
|
# For now, tour number should be given explicitly
|
|
|
|
[[ -z "$TOUR" ]] && die "Tour number not specified."
|
|
|
|
|
|
|
|
# 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://[^/]*)/([^/]*) ]]
|
|
|
|
pgn_url="${BASH_REMATCH[1]}/${BASH_REMATCH[2]:0:8}/pgn"
|
|
|
|
curl -q --fail --location --silent "$pgn_url" > "$tmp_pgn" \
|
|
|
|
|| die "PGN file not found."
|
|
|
|
|
|
|
|
white="" black=""
|
|
|
|
get_game_players
|
|
|
|
|
|
|
|
# Extract the game date
|
|
|
|
date=$(sed -En "s/\[Date \"([^\"]*)\"\]/\1/p" < "$tmp_pgn")
|
|
|
|
date=$(tr '.' '-' <<< "$date")
|
|
|
|
|
2014-05-09 14:30:22 +04:00
|
|
|
pgn_dir="${REPODIR}/${TOURNAMENT}/tours/${TOUR}/${date}-${white}-vs-${black}"
|
2014-05-08 20:06:57 +04:00
|
|
|
[[ -d "$pgn_dir" ]] && die "Directory ${pgn_dir} already exist."
|
2014-05-08 17:46:57 +04:00
|
|
|
|
2014-05-08 20:06:57 +04:00
|
|
|
echo "Creating directory ${pgn_dir}..."
|
2014-05-08 17:46:57 +04:00
|
|
|
mkdir -p "$pgn_dir"
|
|
|
|
echo "Storing PGN file..."
|
2014-05-08 20:06:57 +04:00
|
|
|
cp "$tmp_pgn" "${pgn_dir}/1.pgn"
|
2014-05-09 15:38:59 +04:00
|
|
|
echo "Updating tour_info..."
|
|
|
|
update_tour_info
|
2014-05-08 17:46:57 +04:00
|
|
|
|
|
|
|
exit 0
|