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
 |