#!/bin/sh

if [ $# -lt 1 ]; then
	echo "Syntax: $0 <server version> [--test] [<additional parameters for wesnothd>]" >&2
	exit 1
fi

SERVER=$1
SERVERBASE=$HOME/servers/$SERVER
if ! [ -d "$SERVERBASE" ]; then
	echo "Server '$SERVER' not found." >&2
	exit 1
fi
[ -d "$SERVERBASE/logs" ] || mkdir $SERVERBASE/logs

shift
if [ "$1" = "--test" ]; then
	shift
	PARAMETERS=$*
	cd $SERVERBASE/build || exit 1
	bin/wesnothd-$SERVER -c $SERVERBASE/wesnothd.cfg --port 15001 $PARAMETERS
	# remove the socket so it looks like we never ran the server
	rm var/run/socket
	exit 0
fi

PARAMETERS=$*
THREADS=4
PORT=15000

case $SERVER in
	1.4 )	PORT=14998
		;;
	1.5* )	PORT=14999
		;;
	trunk )	PORT=15000
		;;
	* )
esac

ulimit -Ss 2048
ulimit -c unlimited

# send the standard server message to the appropriate server when killing it with ctrl+c
trap "$HOME/bin/send_server_message $SERVER; sleep 2; echo -n 'terminated: '; date; exit 0" INT

while [ true ] 
do
	cd $SERVERBASE/build || exit 1
	if ! [ -x bin/wesnothd-$SERVER ]; then
		echo "Executable 'bin/wesnothd-$SERVER' not found." >&2
		exit 1
	fi
	DATE=$(date +"%Y%m%d-%H%M%S")
	if [ -f "$SERVERBASE/redirect.cfg" ]; then
		PORT=$(sed -re '/port=/!d;s/[ \t]*port="?([0-9]+)"?/\1/' $SERVERBASE/redirect.cfg)
	fi
	BUILDDIR=$(ls -ld $SERVERBASE/build | sed -e 's,.*\(\.\./builds/wesnothd-.*/\),\1,')
	REV=r$(echo "$BUILDDIR" | sed -re "s,.*wesnothd-svn-([0-9:SM]+)_$SERVER/$,\1,")
	LOG="wesnothd.$DATE.$REV.log"
	COMMAND="bin/wesnothd-$SERVER -c $SERVERBASE/wesnothd.cfg --port $PORT --threads $THREADS $PARAMETERS"
	$COMMAND &> "$SERVERBASE/logs/$LOG" &
	PID=$!
	echo "started $SERVER server with command: '$COMMAND' (revision: $REV, pid: $PID) at: $DATE"
	# create some convenient links
	ln -s "$SERVERBASE/logs/$LOG" "$LOG.$PID"
	rm -f $SERVERBASE/old.log
	mv $SERVERBASE/current.log $SERVERBASE/old.log &> /dev/null
	ln -s "logs/$LOG" $SERVERBASE/current.log
	# wait for the server to terminate
	wait $PID
	EXIT_CODE=$?
	echo "wesnothd exited with code: $EXIT_CODE"
	# need to use the recorded path since the build/ symlink might have changed
	mv "$SERVERBASE/$BUILDDIR/gmon.out" "$SERVERBASE/$BUILDDIR/gmon.$DATE.$REV.out" &> /dev/null
	# check for return code if not zero or 98 (port in use) the server should be restarted
	if [ "$EXIT_CODE" = "0" ] || [ "$EXIT_CODE" = "98" ]; then
		echo "run_server script shutting down."
		exit 0
	fi
done
