#!/bin/sh
adminport=9999
oldcount=0
oldbest=""
check="something"
donejoin=0
while true
  do
  if [[ -f "pioneers.log" ]]
      then
      # check for server badness
      check=$(grep "kicked out of the game" pioneers.log | wc -l)
      # get an idea of the number of computer players
      cplayers=$(grep "Type of computer player" pioneers.log  | wc -l)
      cslots=$(grep "slot" pioneers.log | sed 's/^.* \?- //;s/ .*$//' | sort | tail -n 1)
      bestmap=$(grep "chat .*: map" pioneers.log | sed 's/^.*chat //' | sort | uniq | uniq -f 1 -c | sort -r | head -n 1)
      joins=$(cat pioneers.log | grep "Player [0-9] is now" | wc -l)
      if [[ !( -f "nextmap.name") && -n "${bestmap}" ]]
          then
          bestcount=$(echo "${bestmap}" | colrm 8 | sed 's/^ \+//')
          bestmap=$(echo "${bestmap}" | sed 's/.*: map //')
          if [[ ("${oldcount}" != "${bestcount}") || ("${oldbest}" != "${bestmap}") ]]
              then
              oldbest="${bestmap}"
              oldcount="${bestcount}"
              echo "admin send-message ${bestcount} vote(s) for ${bestmap}" | nc -q 0 localhost ${adminport}
          fi
          hplayers=$(( $cslots - $cplayers ))
          if (( $(( ${bestcount} * 100 )) >= $(( ${hplayers} * 65 )) ))
              then
              echo "${bestmap}" > nextmap.name
              echo "attempting to change next map to ${bestmap}"
              echo "admin send-message map \"${bestmap}\" will be the next map to be played" | nc -q 0 localhost ${adminport}
              ## uncomment for instant change
              #killall pioneers-server-console
          fi
      fi
      if [[ (${joins} > 1) && ($donejoin == 0)]]
          then
          donejoin=1
          echo "admin send-message Welcome to a custom Pioneers server" | nc -q 0 localhost ${adminport}
          echo "admin send-message This server supports voting ('map <name>')" | nc -q 0 localhost ${adminport}
      fi
  fi
  if [[ "${check}" != "0" ]]
      then
      echo "badness, restarting server at $(date)"
      killall pioneers-server-console
  fi
  sleep 20
done
