#!/usr/bin/env bash REPO=fat0troll/lorchess TOURNEY=autumn2013 # Variables date="[0-9]\{2\}\.[0-9]\{2\}\.[0-9]\{4\}" result="\(0\|1\|0\.5\):\(0\|1\|0\.5\)" # Colors restore="\033[00m" red="\033[01;31m" green="\033[01;32m" yellow="\033[01;33m" cyan="\033[01;36m" # Highlight output highlight () { line=$1 # Highlight the tour heading line=$(sed "s/Тур/\\${green}\0\\${restore}/g" <<< "$line") line=$(sed "s/№[0-9]\+/\\${cyan}\0\\${restore}/g" <<< "$line") line=$(sed "s/^=*$/\\${green}\0\\${restore}/g" <<< "$line") # Highlight the tour duration line=$(sed "s/\(^.*\):/\\${green}\1\\${restore}:/g" <<< "$line") # Highlight date line=$(sed "s/${date}/\\${cyan}\0\\${restore}/g" <<< "$line") echo -e "$line" } # 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 p: --longoptions player: -- "$@") # Note the quotes around '$opts': they are essential! eval set -- "$opts" name="" if [[ $1 == -p || $1 == --player ]]; then name=$2 shift 2 fi shift # Generate the sequence of tours to search in if [[ -z "$@" ]]; then seq=$(seq -f "%02g" 1 99) else # Change tour numbers: '1' -> '01', '2' -> '02', and so on seq=$(for num in "$@"; do printf "%02g " "$num"; done) fi for num in $seq; do # Store 'tour_info' in an array of lines url="https://raw.github.com/${REPO}/master/${TOURNEY}/tour_${num}/tour_info" lines=() while read line; do lines+=("$line") done <<< "$(curl --fail -q --silent --write-out '\n' $url)" # Produce output only if 'tour_info' exists if [[ -n $lines ]]; then # Decide to skip the tour or not unskip=""; player="" for ((i=5; i<${#lines[@]}; ++i)); do line="${lines[$i]}" # Don't skip if an unfinished game exists if [[ -z $(grep "$result" <<< "$line") ]]; then if [[ -z "$name" ]]; then unskip="yes" # In addition, if the player was passed as an # argument, check if this is his game or not elif [[ -n $(grep -o "$name" <<< "$line") ]]; then unskip="yes" # Complete player's name player=$(grep -o "[^ ]*${name}[^ ]*" <<< "$line") fi fi done if [[ -n "$unskip" ]]; then # The separator between tours echo -en "$yellow" for i in {1..41}; do echo -n "-"; done echo -e "$restore" # Output the tour heading as is for ((i=0; i<5; ++i)); do highlight "${lines[$i]}"; done # Lines with game info for ((i=5; i<${#lines[@]}; ++i)); do line="${lines[$i]}" # Output only unfinished games if [[ -z $(grep "$result" <<< "$line") ]]; then if [[ -z "$player" ]]; then highlight "$line" # If the player was passed as an argument, # highlight his name elif [[ -n $(grep -o "${player}" <<< "$line") ]]; then line=$(sed "s/${player}/\\${red}\0\\${restore}/g" <<< "$line") highlight "$line" fi fi done fi else # If the tour numbers were not passed as arguments, exit once # the first non-existing 'tour_info' is reached [[ -z "$@" ]] && break fi done exit 0