2013-09-21 03:20:19 +04:00
|
|
|
|
#!/usr/bin/env bash
|
2014-03-27 11:52:44 +04:00
|
|
|
|
# Copyright 2014 Vladimir Ivanov <ivvl82@gmail.com>
|
|
|
|
|
# Distributed under the terms of the GNU General Public License v2
|
2013-09-21 03:20:19 +04:00
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
# REPO_DIR="https://github.com/fat0troll/lorchess"
|
2014-09-03 23:48:27 +04:00
|
|
|
|
REPO_DIR=
|
2014-08-31 21:08:09 +04:00
|
|
|
|
|
|
|
|
|
# Specify the tournament here
|
|
|
|
|
TOURNAMENT=
|
2013-09-21 03:20:19 +04:00
|
|
|
|
|
2014-04-20 14:13:14 +04:00
|
|
|
|
# Version information
|
2014-09-03 23:48:27 +04:00
|
|
|
|
VERSION="0.6"
|
2014-04-20 14:13:14 +04:00
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
argv0=${0##*/}
|
2014-04-20 14:13:14 +04:00
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function usage {
|
2014-04-20 14:13:14 +04:00
|
|
|
|
cat <<EOF
|
|
|
|
|
List games on tours of tournament
|
|
|
|
|
|
|
|
|
|
Usage: $argv0 [options] [tours]
|
2014-09-03 23:48:27 +04:00
|
|
|
|
Put the script under the root directory of your repository or set
|
|
|
|
|
inner variable REPO_DIR to point to your local or remote GitHub
|
|
|
|
|
repository. If the tournament is not the last one (default), store
|
|
|
|
|
its sub-directory in inner variable TOURNAMENT.
|
|
|
|
|
|
|
|
|
|
Tournament tours are restricted to sequence 'tours' given in the
|
|
|
|
|
Bash-style syntax, i.e., 'tours' may include explicit numbers
|
2014-04-20 14:13:14 +04:00
|
|
|
|
(tours=1 3), intervals (tours={1..5}), or any combination of them.
|
2014-09-03 23:48:27 +04:00
|
|
|
|
If no tours are specified, display all started tours (use '-f' to
|
|
|
|
|
see future tours too). By default, only unaccomplished games are
|
2014-04-20 14:13:14 +04:00
|
|
|
|
listed.
|
|
|
|
|
|
|
|
|
|
Options:
|
|
|
|
|
-a List accomplished games too
|
2014-09-03 23:48:27 +04:00
|
|
|
|
-f Allow to display future tours
|
2014-04-20 20:08:12 +04:00
|
|
|
|
-p PLAYER Show game if PLAYER is a part of a player's name
|
2014-09-03 23:48:27 +04:00
|
|
|
|
-o FORMAT Specify the output format; FORMAT is 'term' (default),
|
|
|
|
|
'html', or 'lor'
|
2014-04-20 14:13:14 +04:00
|
|
|
|
-l Add the URL link to game (if accomplished)
|
|
|
|
|
-h Show this help output
|
|
|
|
|
-v Show version information
|
|
|
|
|
EOF
|
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
exit "${1:-0}"
|
2014-04-20 14:13:14 +04:00
|
|
|
|
}
|
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function version {
|
|
|
|
|
exec echo "${argv0}-${VERSION}"
|
|
|
|
|
}
|
2014-04-30 01:31:28 +04:00
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function setup_repo {
|
2014-09-03 23:48:27 +04:00
|
|
|
|
[[ -z $REPO_DIR ]] && REPO_DIR=`dirname "$0"`
|
2014-08-31 21:08:09 +04:00
|
|
|
|
CURL_OPTS="-q --fail --location --silent"
|
|
|
|
|
|
|
|
|
|
# If no tournament given, set it to the last one
|
|
|
|
|
if [[ -z $TOURNAMENT ]]; then
|
|
|
|
|
if [[ $REPO_DIR =~ ^https://github\.com/(.*) ]]; then
|
2014-09-03 00:00:56 +04:00
|
|
|
|
REPO_API="https://api.github.com/repos/${BASH_REMATCH[1]}/contents"
|
|
|
|
|
local year=$(curl $CURL_OPTS $REPO_API \
|
2014-09-04 12:15:59 +04:00
|
|
|
|
| sed -En "/\"path\":/h;/\"type\": \"dir\"/ \
|
|
|
|
|
{g;s|.*\"([0-9]{4})\".*|\1|p;}" | tail -1)
|
2014-09-03 00:00:56 +04:00
|
|
|
|
TOURNAMENT=$(curl $CURL_OPTS ${REPO_API}/${year} \
|
2014-09-04 12:15:59 +04:00
|
|
|
|
| sed -En "/\"path\":/h;/\"type\": \"dir\"/ \
|
|
|
|
|
{g;s|.*\"(${year}/[0-9]-.*)\".*|\1|p;}" | tail -1)
|
2014-08-31 21:08:09 +04:00
|
|
|
|
|
2014-09-03 00:00:56 +04:00
|
|
|
|
REPO_URL="${REPO_DIR}/raw/master"
|
|
|
|
|
else
|
2014-08-31 21:08:09 +04:00
|
|
|
|
local year_dir=$(ls -1 -d ${REPO_DIR}/[0-9][0-9][0-9][0-9]/ | tail -1)
|
|
|
|
|
TOURNAMENT=$(ls -1 -d ${year_dir}[0-9]-*/ | tail -1 \
|
|
|
|
|
| sed -E "s|${REPO_DIR}/(.*)|\1|")
|
|
|
|
|
# Remove the trailing slash
|
|
|
|
|
TOURNAMENT=${TOURNAMENT%/}
|
2014-09-03 00:00:56 +04:00
|
|
|
|
|
|
|
|
|
# Convert REPO_DIR to an absolute path
|
2014-09-03 23:48:27 +04:00
|
|
|
|
[[ ! $REPO_DIR =~ ^/ ]] && REPO_DIR=$(cd $REPO_DIR; pwd)
|
2014-09-03 00:00:56 +04:00
|
|
|
|
|
|
|
|
|
REPO_URL="file://${REPO_DIR}"
|
2014-08-31 21:08:09 +04:00
|
|
|
|
fi
|
2014-03-27 11:52:44 +04:00
|
|
|
|
fi
|
2014-04-30 01:31:28 +04:00
|
|
|
|
}
|
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function show_tour_sequence {
|
|
|
|
|
local tour_seq=$@
|
|
|
|
|
|
|
|
|
|
# If no tour sequence given, set it to all tours
|
|
|
|
|
if [[ -z $tour_seq ]]; then
|
2014-09-02 20:40:08 +04:00
|
|
|
|
if [[ $REPO_DIR =~ ^https://github\.com/ ]]; then
|
2014-09-03 00:00:56 +04:00
|
|
|
|
tour_seq=$(curl $CURL_OPTS ${REPO_API}/${TOURNAMENT}/tours \
|
2014-09-04 12:15:59 +04:00
|
|
|
|
| sed -En "/\"path\":/h;/\"type\": \"dir\"/ \
|
|
|
|
|
{g;s|.*\"${TOURNAMENT}/tours/([0-9]{2})\".*|\1|p;}")
|
2014-08-31 21:08:09 +04:00
|
|
|
|
else
|
|
|
|
|
tour_seq=$(ls -1 -d ${REPO_DIR}/${TOURNAMENT}/tours/[0-9][0-9]/ \
|
|
|
|
|
| sed -E "s|${REPO_DIR}/${TOURNAMENT}/tours/([0-9]{2})/|\1|")
|
|
|
|
|
fi
|
2014-09-03 23:48:27 +04:00
|
|
|
|
else
|
|
|
|
|
# Don't care about the begging of an explicitly specified tour
|
|
|
|
|
SHOW_FUTURE=true
|
2014-08-31 21:08:09 +04:00
|
|
|
|
fi
|
2014-04-30 01:31:28 +04:00
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
for tour in $tour_seq; do
|
|
|
|
|
# Change tour numbers: '1' -> '01', '2' -> '02', and so on
|
|
|
|
|
tour=$(printf "%02g" $tour)
|
|
|
|
|
|
|
|
|
|
# *NOTE* The incorporation of a newline at the end of
|
2014-09-03 00:00:56 +04:00
|
|
|
|
# 'tour_info' (--write-out '\n') is important and allows one
|
|
|
|
|
# to read the last line with no trailing '\n'
|
|
|
|
|
local tour_info=$(curl $CURL_OPTS --write-out '\n' \
|
|
|
|
|
${REPO_URL}/${TOURNAMENT}/tours/${tour}/tour_info)
|
|
|
|
|
[[ -n $tour_info ]] && output_tour_info
|
2014-08-31 21:08:09 +04:00
|
|
|
|
done
|
2014-04-30 01:31:28 +04:00
|
|
|
|
}
|
2013-09-21 03:20:19 +04:00
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function output_tour_info {
|
2014-09-02 20:40:08 +04:00
|
|
|
|
local date_re="([0-9?]{2})\.([0-9?]{2})\.([0-9?]{4})"
|
2014-09-03 00:00:56 +04:00
|
|
|
|
local res_re="(1-0|1/2|0-1)"
|
2014-09-03 23:48:27 +04:00
|
|
|
|
local tour_num= date_beg= date_end=
|
2014-09-02 20:40:08 +04:00
|
|
|
|
local white= black= result= game_date=
|
2014-04-30 01:31:28 +04:00
|
|
|
|
# Lines with game info
|
2014-08-31 21:08:09 +04:00
|
|
|
|
local output_lines=
|
2014-04-30 01:31:28 +04:00
|
|
|
|
|
|
|
|
|
while read line; do
|
2014-09-03 23:48:27 +04:00
|
|
|
|
# Read the number of tour
|
|
|
|
|
get_tour_num
|
|
|
|
|
# Read the begging and end of tour
|
|
|
|
|
get_tour_dates
|
2014-04-30 01:31:28 +04:00
|
|
|
|
# Keep game info if needed, and store it in variables 'white',
|
|
|
|
|
# 'black', 'result', and 'game_date'
|
2014-09-02 20:40:08 +04:00
|
|
|
|
if keep_game_info; then
|
2014-09-04 09:11:26 +04:00
|
|
|
|
output_lines+=$(sed -E "s/$date_re\ +//" <<< "$line")
|
2014-09-02 20:40:08 +04:00
|
|
|
|
# Append the link of game to the end of output line
|
2014-04-30 01:31:28 +04:00
|
|
|
|
if $SHOW_LINK; then
|
2014-09-02 20:40:08 +04:00
|
|
|
|
[[ -n $result ]] && append_game_url
|
2014-04-30 01:31:28 +04:00
|
|
|
|
fi
|
2014-09-02 20:40:08 +04:00
|
|
|
|
output_lines+="\n"
|
2014-03-27 11:52:44 +04:00
|
|
|
|
fi
|
2014-04-30 01:31:28 +04:00
|
|
|
|
done <<< "$tour_info"
|
|
|
|
|
|
2014-09-03 23:48:27 +04:00
|
|
|
|
[[ -n $output_lines ]] && eval info_output_$FORMAT
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function get_tour_num {
|
|
|
|
|
if [[ -z $tour_num ]]; then
|
2014-09-04 09:11:26 +04:00
|
|
|
|
[[ $line =~ "Тур №"([0-9]+) ]] && tour_num=${BASH_REMATCH[1]}
|
2014-09-03 23:48:27 +04:00
|
|
|
|
continue
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function get_tour_dates {
|
|
|
|
|
if [[ -z $date_beg || -z $date_end ]]; then
|
2014-09-04 09:11:26 +04:00
|
|
|
|
if [[ $line =~ "Время проведения:"\ +($date_re)\ +-\ +($date_re) ]]; then
|
2014-09-03 23:48:27 +04:00
|
|
|
|
date_beg=${BASH_REMATCH[1]} date_end=${BASH_REMATCH[5]}
|
|
|
|
|
|
|
|
|
|
if ! $SHOW_FUTURE; then
|
|
|
|
|
# Unknown beginning of tour
|
|
|
|
|
[[ $date_beg =~ \? ]] && break
|
|
|
|
|
|
|
|
|
|
# The date of tour later than today
|
|
|
|
|
local date_tour=$(sed -E "s/${date_re}/\3-\2-\1/" <<< $date_beg)
|
|
|
|
|
local date_unix=$(date -d $date_tour +%s) this_unix=$(date +%s)
|
|
|
|
|
(( date_unix > this_unix )) && break
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# Use short dates
|
|
|
|
|
date_beg=${date_beg::5} date_end=${date_end::5}
|
|
|
|
|
fi
|
|
|
|
|
continue
|
|
|
|
|
fi
|
2014-03-27 11:52:44 +04:00
|
|
|
|
}
|
2013-09-21 03:20:19 +04:00
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function keep_game_info {
|
2014-09-02 20:40:08 +04:00
|
|
|
|
local keep=1
|
2014-09-04 09:11:26 +04:00
|
|
|
|
if [[ $line =~ $date_re\ +([^\ ]+)\ +-\ +([^\ ]+)(\ +$res_re)? ]]; then
|
2014-09-03 00:00:56 +04:00
|
|
|
|
white=${BASH_REMATCH[4]} black=${BASH_REMATCH[5]} result=${BASH_REMATCH[7]}
|
2014-09-02 20:40:08 +04:00
|
|
|
|
game_date=${BASH_REMATCH[3]}-${BASH_REMATCH[2]}-${BASH_REMATCH[1]}
|
2014-03-27 11:52:44 +04:00
|
|
|
|
|
2014-04-20 20:08:12 +04:00
|
|
|
|
# If the player was passed as an argument, check if it is his game or not
|
2014-08-31 21:08:09 +04:00
|
|
|
|
if [[ -z $PLAYER || $white =~ $PLAYER || $black =~ $PLAYER ]]; then
|
2014-04-20 20:08:12 +04:00
|
|
|
|
if $SHOW_ALL; then
|
2014-03-27 11:52:44 +04:00
|
|
|
|
keep=0
|
2014-04-20 20:08:12 +04:00
|
|
|
|
else
|
|
|
|
|
# Keep line if the game is not finished
|
2014-08-31 21:08:09 +04:00
|
|
|
|
[[ -z $result ]] && keep=0
|
2014-03-27 11:52:44 +04:00
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
return $keep
|
|
|
|
|
}
|
2013-10-20 13:28:50 +04:00
|
|
|
|
|
2014-09-02 20:40:08 +04:00
|
|
|
|
function append_game_url {
|
2014-04-30 23:38:43 +04:00
|
|
|
|
local tour=$(printf "%02g" "$tour_num")
|
2014-08-31 21:08:09 +04:00
|
|
|
|
local game_dir=${game_date}-${white}-vs-${black}
|
2014-09-03 00:00:56 +04:00
|
|
|
|
local game_url=$(curl $CURL_OPTS \
|
|
|
|
|
${REPO_URL}/${TOURNAMENT}/tours/${tour}/${game_dir}/1.pgn \
|
2014-09-04 09:11:26 +04:00
|
|
|
|
| sed -En "s/\[Site \"([a-z]+:[^\"]+)\"\]/\1/p")
|
2014-09-02 20:40:08 +04:00
|
|
|
|
output_lines+=" $game_url"
|
2014-03-27 22:54:45 +04:00
|
|
|
|
}
|
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function info_output_term {
|
2014-03-27 15:26:01 +04:00
|
|
|
|
echo -n "$(tput setaf 2)${tour_num} тур "
|
2014-03-27 11:52:44 +04:00
|
|
|
|
echo "$(tput setaf 6)(${date_beg} - ${date_end})$(tput sgr0)"
|
2013-10-20 13:28:50 +04:00
|
|
|
|
|
2014-09-03 23:48:27 +04:00
|
|
|
|
for line in "$(echo -e "$output_lines")"; do
|
2014-03-27 11:52:44 +04:00
|
|
|
|
# Highlight player's name
|
2014-08-31 21:08:09 +04:00
|
|
|
|
if [[ -n $PLAYER ]]; then
|
2014-03-27 11:52:44 +04:00
|
|
|
|
players=$(grep -o "[^ ]*${PLAYER}[^ ]*" <<< "$line")
|
|
|
|
|
for name in $players; do
|
2014-04-23 01:33:13 +04:00
|
|
|
|
# PLAYER is a part of 'game_url' or 'result'
|
2014-09-03 00:00:56 +04:00
|
|
|
|
[[ $name =~ ^http:// || $name =~ ^${res_re}$ ]] && continue
|
2014-04-23 01:33:13 +04:00
|
|
|
|
|
2014-04-27 19:34:14 +04:00
|
|
|
|
line=$(sed -E "s/(${name})/$(tput setaf 1)\1$(tput sgr0)/g" <<< "$line")
|
2014-03-27 11:52:44 +04:00
|
|
|
|
done
|
|
|
|
|
fi
|
2013-10-20 13:28:50 +04:00
|
|
|
|
|
2014-03-27 11:52:44 +04:00
|
|
|
|
# Highlight result
|
2014-09-03 00:00:56 +04:00
|
|
|
|
line=$(sed -E "s~ ${res_re}( |$)~ $(tput setaf 6)\1$(tput sgr0)\2~g" <<< "$line")
|
2013-10-20 13:28:50 +04:00
|
|
|
|
|
2014-03-27 11:52:44 +04:00
|
|
|
|
echo "$line"
|
|
|
|
|
done
|
2013-10-20 13:28:50 +04:00
|
|
|
|
|
2014-03-27 11:52:44 +04:00
|
|
|
|
echo
|
|
|
|
|
}
|
2013-10-20 13:28:50 +04:00
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function info_output_lor {
|
2014-03-27 18:21:15 +04:00
|
|
|
|
echo "[b]${tour_num} тур (${date_beg} - ${date_end})[/b]"
|
2014-03-27 15:26:01 +04:00
|
|
|
|
echo "[list]"
|
|
|
|
|
|
2014-09-03 00:00:56 +04:00
|
|
|
|
echo -en "$output_lines" | while read white hyphen black result url; do
|
2014-08-31 21:08:09 +04:00
|
|
|
|
[[ -n $url ]] && result="[url=${url}]${result}[/url]"
|
2014-03-27 18:21:15 +04:00
|
|
|
|
|
2014-04-20 22:11:22 +04:00
|
|
|
|
echo " [*] [user]${white}[/user] - [user]${black}[/user] ${result}"
|
2014-03-27 15:26:01 +04:00
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
echo "[/list]"
|
|
|
|
|
echo
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function info_output_html {
|
2014-03-27 19:31:56 +04:00
|
|
|
|
echo "<div class=\"tour-info\">"
|
2014-03-27 23:52:49 +04:00
|
|
|
|
echo " <table class=\"table table-condensed\">"
|
2014-03-27 19:31:56 +04:00
|
|
|
|
echo " <caption>"
|
|
|
|
|
echo " <strong>${tour_num} тур (${date_beg} - ${date_end})</strong>"
|
|
|
|
|
echo " </caption>"
|
|
|
|
|
echo " <tbody>"
|
|
|
|
|
|
2014-09-03 00:00:56 +04:00
|
|
|
|
echo -en "$output_lines" | while read white hyphen black result url; do
|
2014-09-03 23:48:27 +04:00
|
|
|
|
[[ $result == 1/2 ]] && result=½-½
|
2014-08-31 21:08:09 +04:00
|
|
|
|
[[ -n $url ]] && result="<a href=\"${url}\">${result}</a>"
|
2014-03-27 22:54:45 +04:00
|
|
|
|
|
2014-03-27 19:31:56 +04:00
|
|
|
|
echo " <tr>"
|
2014-03-27 19:59:37 +04:00
|
|
|
|
echo " <td>${white} - ${black}</td><td class=\"result\">${result}</td>"
|
2014-03-27 19:31:56 +04:00
|
|
|
|
echo " </tr>"
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
echo " </tbody>"
|
|
|
|
|
echo " </table>"
|
|
|
|
|
echo "</div>"
|
|
|
|
|
echo
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-31 21:08:09 +04:00
|
|
|
|
function die {
|
|
|
|
|
echo "$@" 1>&2
|
|
|
|
|
exit 1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function checkargs {
|
2014-09-03 23:48:27 +04:00
|
|
|
|
[[ $OPTARG =~ ^-[afpolhv]$ ]] && die "Option -${opt}: argument not found"
|
|
|
|
|
[[ $opt == o && ! $OPTARG =~ ^(term|html|lor)$ ]] && die "Incorrect FORMAT specified"
|
2014-04-20 14:42:19 +04:00
|
|
|
|
}
|
2013-10-20 13:28:50 +04:00
|
|
|
|
|
2014-03-27 11:52:44 +04:00
|
|
|
|
FORMAT=term
|
2014-08-31 21:08:09 +04:00
|
|
|
|
SHOW_ALL=false
|
2014-09-03 23:48:27 +04:00
|
|
|
|
SHOW_FUTURE=false
|
2014-03-27 22:54:45 +04:00
|
|
|
|
SHOW_LINK=false
|
2014-03-27 11:52:44 +04:00
|
|
|
|
|
2014-09-03 23:48:27 +04:00
|
|
|
|
while getopts afp:o:lhv opt; do
|
2014-08-31 21:08:09 +04:00
|
|
|
|
case $opt in
|
2014-04-20 14:42:19 +04:00
|
|
|
|
a) SHOW_ALL=true
|
|
|
|
|
;;
|
2014-09-03 23:48:27 +04:00
|
|
|
|
f) SHOW_FUTURE=true
|
|
|
|
|
;;
|
2014-04-20 14:42:19 +04:00
|
|
|
|
p) checkargs
|
2014-08-31 21:08:09 +04:00
|
|
|
|
PLAYER=$OPTARG
|
2014-04-20 14:42:19 +04:00
|
|
|
|
;;
|
2014-09-03 23:48:27 +04:00
|
|
|
|
o) checkargs
|
2014-08-31 21:08:09 +04:00
|
|
|
|
FORMAT=$OPTARG
|
2014-04-20 14:42:19 +04:00
|
|
|
|
;;
|
|
|
|
|
l) SHOW_LINK=true
|
|
|
|
|
;;
|
2014-08-31 21:08:09 +04:00
|
|
|
|
h) usage
|
|
|
|
|
;;
|
|
|
|
|
v) version
|
2014-04-20 14:42:19 +04:00
|
|
|
|
;;
|
2014-08-31 21:08:09 +04:00
|
|
|
|
*) usage 1
|
2014-04-20 14:42:19 +04:00
|
|
|
|
;;
|
2014-03-27 11:52:44 +04:00
|
|
|
|
esac
|
2013-09-21 03:20:19 +04:00
|
|
|
|
done
|
2013-09-26 00:11:13 +04:00
|
|
|
|
|
2014-04-20 14:42:19 +04:00
|
|
|
|
shift $(($OPTIND - 1))
|
2014-08-31 21:08:09 +04:00
|
|
|
|
setup_repo
|
|
|
|
|
show_tour_sequence $@
|
2014-04-20 14:42:19 +04:00
|
|
|
|
|
2013-09-26 00:11:13 +04:00
|
|
|
|
exit 0
|