130 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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 i in "$@"; do printf "%02g " "$i"; done)
 | ||
| fi
 | ||
| 
 | ||
| for i in $seq; do
 | ||
| 
 | ||
|     url="https://raw.github.com/${REPO}/master/${TOURNEY}/tour_${i}/tour_info"
 | ||
| 
 | ||
|     # Store 'tour_info' in an array of lines.
 | ||
|     # *NOTE* The incorporation of newline at the end of 'tour_info'
 | ||
|     # (--write-out '\n') is important and allows one to read the last
 | ||
|     # line without trailing '\n'
 | ||
|     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 ((j=5; j<${#lines[@]}; ++j)); do
 | ||
|             line="${lines[$j]}"
 | ||
| 
 | ||
|             # 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 j in {1..41}; do echo -n "-"; done
 | ||
|             echo -e "$restore"
 | ||
| 
 | ||
|             # Output the tour heading as is
 | ||
|             for ((j=0; j<5; ++j)); do highlight "${lines[$j]}"; done
 | ||
| 
 | ||
|             # Lines with game info
 | ||
|             for ((j=5; j<${#lines[@]}; ++j)); do
 | ||
|                 line="${lines[$j]}"
 | ||
| 
 | ||
|                 # 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
 |