#! /bin/sh

BASE=$CTF_BASE/state/teams

esc () {
    printf '%s' "$*" | sed 's/[^-0-9A-Za-z ]/_/g; s/ /+/g'
}

newteam () {
    echo '== Team Creation =='
    echo
    echo -n 'What would you like your team to be called (3-12 chars)? '
    read -r name
    echo
    namelen=$(printf "%s" "$name" | wc -c)
    if [ $namelen -lt 3 ] || [ $namelen -gt 12 ]; then
        echo 'Invalid name length'
        return
    fi
    hash=$(printf '%s %s' "$salt" "$name" | md5sum | cut -b 1-8)

    if [ -f $BASE/names/$hash ]; then
        echo "That name is already in use.  Try another one."
        return
    fi

    printf '%s' "$name" > $BASE/names/$hash

    cat <<EOD
Your team hash is $hash.  Write that down somewhere and don't lose it.
If you forget your hash, you'll have to start over from the beginning
with a new team and everybody will laugh at you.
EOD
}

fini () {
    echo
    echo "Press [Enter] to clear the screen."
    read
    exit 0
}

log () {
    awk -v H=$1 '($2 == H) { print($3, $4); }' $CTF_BASE/points.log
}


clear
read salt < $BASE/salt

printf '\017Team hash ("new" to create a new team): '
read -r hash
echo
if [ -z "$hash" ]; then
    exit 0
elif [ "$hash" = "new" ]; then
    newteam
    fini
elif [ "$hash" = 58 ]; then
    name='Thumper Bumper'
elif ! [ -f $BASE/names/$hash ]; then
    echo "No such team, fool."
    echo "Is this when everybody laughs at you for forgetting your hash?"
    fini
else
    read -r name < $BASE/names/$hash
fi

clear


printf 'Welcome back, %s.\n' "$name"

while true; do
    printf "p2> "
    read -r answer

    case "$answer" in
        \?|help)
            cat <<EOD
                         Help
----------------------------------------------------------

Type quit to leave the p2 shell.
Type log to show answered puzzles.

Any other string is checked as an answer.  If the answer
is correct, you are awarded points and the scoreboard will
update within 10 seconds.  Check the puzzles overview to
see if your answer unlocked a new puzzle.
EOD
            continue
            ;;
        log)
            cat <<EOD
Puzzles Answered By $name
---------------------------------------
EOD
            log $hash
            continue
            ;;
        quit)
            break
            ;;
    esac

    clear
    matches=0
    for fn in /opt/*/answers.txt; do
    	cat=$(basename ${fn%/answers.txt})
    	while read points ans; do
    	    if [ "$ans" = "$answer" ]; then
    	    	if log $hash | grep -wq "$cat $points"; then
    	    		echo "You've already received points for this answer."
    	    	elif /opt/p2/bin/pointscli $hash $cat $points p2console; then
		        echo "You get $points more points in the $cat category."
		        matches=$(expr $matches + 1)
	        else
		        echo "Error recording points.  Tell the officials!"
		fi
	    fi
	done < $fn
    done
    
    if [ "$matches" -eq 0 ]; then
    	echo 'That is not a correct answer.  Type "help" for help.'
    fi
    if [ "$matches" -gt 1 ]; then
    	echo "Holy shit!  Double word score!"
    fi
done