#!/usr/bin/env bash # Copyright 2014 Vladimir Ivanov # Distributed under the terms of the GNU General Public License v2 # REPO_DIR="https://github.com/fat0troll/lorchess" REPO_DIR= # Specify the tournament here TOURNAMENT= # Version information VERSION="0.6" argv0=${0##*/} function usage { cat < '01', '2' -> '02', and so on tour=$(printf "%02g" $tour) # *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' local tour_info=$(curl $CURL_OPTS --write-out '\n' \ ${REPO_URL}/${TOURNAMENT}/tours/${tour}/tour_info) [[ -n $tour_info ]] && output_tour_info done } function output_tour_info { local date_re="([0-9?]{2})\.([0-9?]{2})\.([0-9?]{4})" local score_re="(1|½|0|\+|−)" local res_re="${score_re}-${score_re}" local tour_num= date_beg= date_end= local white= black= result= game_date= # Lines with game info local output_lines= while read line; do # Read the number of tour get_tour_num # Read the begging and end of tour get_tour_dates # Keep game info if needed, and store it in variables 'white', # 'black', 'result', and 'game_date' if keep_game_info; then output_lines+=$(sed -E "s/$date_re +//" <<< "$line") # Append the link of game to the end of output line if $SHOW_LINK; then [[ $result =~ ^(\+|-)*$ ]] || append_game_url fi output_lines+="\n" fi done <<< "$tour_info" [[ -n $output_lines ]] && eval info_output_$FORMAT } function get_tour_num { if [[ -z $tour_num ]]; then [[ $line =~ "Тур №"([0-9]+) ]] && tour_num=${BASH_REMATCH[1]} fi } function get_tour_dates { if [[ -z $date_beg || -z $date_end ]]; then if [[ $line =~ "Время проведения:"\ +($date_re)\ +-\ +($date_re) ]]; then date_beg=${BASH_REMATCH[1]} date_end=${BASH_REMATCH[5]} if ! $SHOW_FUTURE; then # Unknown beginning of tour [[ $date_beg =~ \? ]] && exit 0 if date --version >/dev/null 2>&1; then local date_beg_gnu=$(sed -E "s/${date_re}/\3-\2-\1/" <<< $date_beg) local date_tour=$(date -d $date_beg_gnu +%s) else local date_beg_bsd=$(sed -E "s/${date_re}/-v\3y -v\2m -v\1d/" <<< $date_beg) local date_tour=$(date $date_beg_bsd +%s) fi local date_this=$(date +%s) # The date of tour later than today (( date_tour > date_this )) && exit 0 fi # Use short dates date_beg=${date_beg::5} date_end=${date_end::5} fi fi } function keep_game_info { local keep=1 if [[ $line =~ $date_re\ +([^\ ]+)\ +-\ +([^\ ]+)(\ +$res_re)? ]]; then white=${BASH_REMATCH[4]} black=${BASH_REMATCH[5]} result=${BASH_REMATCH[7]}-${BASH_REMATCH[8]} game_date=${BASH_REMATCH[3]}-${BASH_REMATCH[2]}-${BASH_REMATCH[1]} # If the player was passed as an argument, check if it is his game or not if [[ -z $PLAYER || $white =~ $PLAYER || $black =~ $PLAYER ]]; then if $SHOW_ALL; then keep=0 else # Keep line if the game is not finished [[ $result == "-" ]] && keep=0 fi fi fi return $keep } function append_game_url { local tour=$(printf "%02g" "$tour_num") local game_dir=${game_date}-${white}-vs-${black} local game_url=$(curl $CURL_OPTS \ ${REPO_URL}/${TOURNAMENT}/tours/${tour}/${game_dir}/1.pgn \ | sed -En "s/\[Site \"([a-z]+:[^\"]+)\"\]/\1/p") output_lines+=" $game_url" } function info_output_term { echo -n "$(tput setaf 2)${tour_num} тур " echo "$(tput setaf 6)(${date_beg} - ${date_end})$(tput sgr0)" for line in "$(echo -e "$output_lines")"; do # Highlight player's name if [[ -n $PLAYER ]]; then players=$(grep -o "[^ ]*${PLAYER}[^ ]*" <<< "$line") for name in $players; do # PLAYER is a part of 'game_url' or 'result' [[ $name =~ ^http:// || $name =~ ^${res_re}$ ]] && continue line=$(sed -E "s/(${name})/$(tput setaf 1)\1$(tput sgr0)/" <<< "$line") done fi # Highlight result line=$(sed -E "s/ ${res_re}( |$)/ $(tput setaf 6)\1-\2$(tput sgr0)\3/" <<< "$line") echo "$line" done echo } function info_output_lor { echo "[b]${tour_num} тур (${date_beg} - ${date_end})[/b]" echo "[list]" echo -en "$output_lines" | while read white hyphen black result url; do [[ -n $url ]] && result="[url=${url}]${result}[/url]" echo " [*] [user]${white}[/user] - [user]${black}[/user] ${result}" done echo "[/list]" echo } function info_output_html { echo "
" echo " " echo " " echo " " echo -en "$output_lines" | while read white hyphen black result url; do [[ -n $url ]] && result="${result}" echo " " echo " " echo " " done echo " " echo "
" echo " ${tour_num} тур (${date_beg} - ${date_end})" echo "
${white} - ${black}${result}
" echo "
" echo } function die { echo "$@" 1>&2 exit 1 } function checkargs { [[ $OPTARG =~ ^-[afpolhv]$ ]] && die "Option -${opt}: argument not found" [[ $opt == o && ! $OPTARG =~ ^(term|html|lor)$ ]] && die "Incorrect FORMAT specified" } FORMAT=term SHOW_ALL=false SHOW_FUTURE=false SHOW_LINK=false while getopts afp:o:lhv opt; do case $opt in a) SHOW_ALL=true ;; f) SHOW_FUTURE=true ;; p) checkargs PLAYER=$OPTARG ;; o) checkargs FORMAT=$OPTARG ;; l) SHOW_LINK=true ;; h) usage ;; v) version ;; *) usage 1 ;; esac done shift $(($OPTIND - 1)) setup_repo show_tour_sequence $@ exit 0