lorchess/schedule

243 lines
6.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# Copyright 2014 Vladimir Ivanov <ivvl82@gmail.com>
# Distributed under the terms of the GNU General Public License v2
REPO=fat0troll/lorchess
TOURNAMENT=2014/1-tabiyas
# Variables
date_re="([0-9?]{2})\\.([0-9?]{2})\\.([0-9?]{4})"
res_re="(0|1|0\\.5):(0|1|0\\.5)"
show_tour_sequence() {
local sequence info_array
# Generate the sequence of tours to search in
if [[ -z "$@" ]]; then
sequence=$(seq -f "%02g" 1 99)
else
# Change tour numbers: '1' -> '01', '2' -> '02', and so on
sequence=$(for i in "$@"; do printf "%02g " "$i"; done)
fi
for tour in $sequence; do
# Produce output only if 'tour_info' exists
if fetch_info_array "$tour"; then
for ((i=5; i<${#info_array[@]}; ++i)); do
if keep_info_line "${info_array[$i]}"; then
show_tour_info
break
fi
done
else
# If the tour numbers were not passed as arguments, exit
# once the first non-existing 'tour_info' is reached
[[ -z "$@" ]] && break
fi
done
}
fetch_info_array() {
local url="${BASEURL}/tours/${1}/tour_info"
# Store 'tour_info' in an array of lines.
# *NOTE* The incorporation of a newline at the end of 'tour_info'
# (--write-out '\n') is important and allows one to read the last
# line with no trailing '\n'
info_array=()
while read line; do
info_array+=("$line")
done <<< "$(curl -q --fail --silent --write-out '\n' $url)"
return `[[ -n $info_array ]]`
}
keep_info_line() {
local line="$1" keep=1
if $SHOW_ALL; then
keep=0
else
# Keep line if the game is not finished
if [[ -z $(egrep "$res_re" <<< "$line") ]]; then
if [[ -z "$PLAYER" ]]; then
keep=0
# In addition, if the player was passed as an argument,
# check if it is his game or not
elif [[ -n $(grep -o "$PLAYER" <<< "$line") ]]; then
keep=0
fi
fi
fi
return $keep
}
show_tour_info() {
[[ "${info_array[0]}" =~ "Тур №"([0-9]+) ]]
local tour_num="${BASH_REMATCH[1]}"
[[ "${info_array[3]}" =~ ($date_re)" "*[-—]" "*($date_re) ]]
local date_beg="${BASH_REMATCH[1]}" date_end="${BASH_REMATCH[5]}"
# Use short dates
date_beg="${date_beg:0:5}"; date_end="${date_end:0:5}"
# Lines with game info
local output_lines=""
for ((i=5; i<${#info_array[@]}; ++i)); do
local line="${info_array[$i]}"
if keep_info_line "$line"; then
[[ "$line" =~ ($date_re)" "*[-—]" "*([^" "]+)" "*($res_re)?" "*([^" "]+) ]]
local white="${BASH_REMATCH[5]}" black="${BASH_REMATCH[9]}" result="" url=""
local game_date="${BASH_REMATCH[4]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]}"
case "${BASH_REMATCH[6]}" in
1:0) result="1-0";;
0:1) result="0-1";;
0.5:0.5) result="1/2";;
esac
# Store the link of game in variable '$url'
if $SHOW_LINK; then
[[ -n "$result" ]] && store_game_url
fi
output_lines+="${white} ${black} ${result} ${url}\n"
fi
done
eval "info_output_$FORMAT \"${output_lines}\""
}
store_game_url() {
local tour=$(printf "%02g" "$tour_num")
local game_dir="${game_date}-${white}-vs-${black}"
local game_url="${BASEURL}/tours/${tour}/${game_dir}/1.pgn"
while read line; do
# Search for an URL inside PGN file
[[ "$line" =~ "[Site \""([a-z]+:[^"\""]+)"\"]" ]]
url="${BASH_REMATCH[1]}"
[[ -n "$url" ]] && break
done <<< "$(curl -q --fail --silent $game_url)"
}
info_output_term() {
echo -n "$(tput setaf 2)${tour_num} тур "
echo "$(tput setaf 6)(${date_beg} - ${date_end})$(tput sgr0)"
echo -en "$1" | column -t | while IFS= read line; do
# Highlight player's name
if [[ -n "$PLAYER" ]]; then
players=$(grep -o "[^ ]*${PLAYER}[^ ]*" <<< "$line")
for name in $players; do
line=$(sed "s/${name}/\\$(tput setaf 1)\0\\$(tput sgr0)/g" <<< "$line")
done
fi
# Highlight result
line=$(sed "s/\(1-0\|0-1\|1\\/2\)/\\$(tput setaf 6)\0\\$(tput sgr0)/g" <<< "$line")
echo "$line"
done
echo
}
info_output_lor() {
echo "[b]${tour_num} тур (${date_beg} - ${date_end})[/b]"
echo "[list]"
echo -en "$1" | while read white black result url; do
[[ -n "$url" ]] && result="[url=${url}]${result}[/url]"
local line=" [*] [user]${white}[/user] - [user]${black}[/user] ${result}"
# Highlight player's name
if [[ -n "$PLAYER" ]]; then
players=$(grep -o "\\[user\\][^ ]*${PLAYER}[^ ]*\\[/user\\]" <<< "$line")
# Escape symbols ']', '[', and '/'
players=$(sed 's/[][\/]/\\\0/g' <<< "$players")
for name in $players; do
line=$(sed "s/${name}/[b]\0[\\/b]/g" <<< "$line")
done
fi
echo "$line"
done
echo "[/list]"
echo
}
info_output_html() {
echo "<div class=\"tour-info\">"
echo " <table class=\"table table-condensed\">"
echo " <caption>"
echo " <strong>${tour_num} тур (${date_beg} - ${date_end})</strong>"
echo " </caption>"
echo " <tbody>"
echo -en "$1" | while read white black result url; do
[[ -n "$url" ]] && result="<a href=\"${url}\">${result}</a>"
# Highlight player's name
if [[ -n "$PLAYER" ]]; then
[[ "$white" =~ $PLAYER ]] && white="<strong>${white}</strong>"
[[ "$black" =~ $PLAYER ]] && black="<strong>${black}</strong>"
fi
echo " <tr>"
echo " <td>${white} - ${black}</td><td class=\"result\">${result}</td>"
echo " </tr>"
done
echo " </tbody>"
echo " </table>"
echo "</div>"
echo
}
# Note that we use '"$@"' to let each command-line parameter expand to a
# separate word. The quotes around '$@' are essential!
# We need 'opts' as the 'eval set --' would nuke the return value of getopt
opts=$(getopt --options ap:f:lh \
--longoptions all,player:,format:,link,help \
-- "$@")
# Note the quotes around '$opts': they are essential!
eval set -- "$opts"
SHOW_ALL=false
PLAYER=""
FORMAT=term
SHOW_LINK=false
BASEURL="https://raw.github.com/${REPO}/master/${TOURNAMENT}"
while true; do
case "$1" in
-a|--all)
SHOW_ALL=true
shift;;
-p|--player)
PLAYER="$2"
shift 2;;
-f|--format)
FORMAT="$2"
shift 2;;
-l|--link)
SHOW_LINK=true
shift;;
-h|--help)
usage
break;;
--)
shift
show_tour_sequence "$@"
break;;
esac
done
exit 0