#!/bin/ksh

grey="\033[01;30m"
red="\033[01;31m"
green="\033[01;32m"
yellow="\033[01;33m"
blue="\033[01;34m"
magenta="\033[01;35m"
cyan="\033[01;35m"
bold="\033[01;39m"

white="\033[0m"

PREFIX="/usr/local"

INITIAL=true
CONF_FILE=~/.minecraftrc
CONF_DIR=~/minecraft
MC_URL="https://s3.amazonaws.com/Minecraft.Download/launcher/Minecraft.jar"

function msg {
    echo "${bold}${1}${white}"
}

function error {
    echo "${red}${1}${white}"
    exit 1
}

function set_ulimit {
    DATASIZE="1572864" #1.5G
    
    if [ $(ulimit -Sd) -lt ${DATASIZE} ]; then
	ulimit -Sd ${DATASIZE} || error "Cannot increase datasize-cur to at least ${DATASIZE}"
    fi
}

function about {
	 cat <<EOF
This script downloads and launches Minecraft for you, there is an initial
configuration that will be saved in ${CONF_FILE}. This file tells the 
OpenBSD launcher where to find Minecraft.jar and the fixes required to make 
Minecraft run on OpenBSD. You will only see this message once unless you
remove ${CONF_FILE}.

EOF
}

function get_conf_var {
    [ -f "$CONF_FILE" ] || return
    sed "/^$1:/!d;s///;q" "$CONF_FILE" | grep .
}

function fetch {
    ftp "$@"
}


if [ ! -d $CONF_DIR ] || [ ! -f $CONF_FILE ]; then
   mkdir -p $CONF_DIR || error "Can't make $CONF_DIR"

   about
   FULL_PATH=$(get_conf_var "FULL_PATH")
   USERID=$(get_conf_var "USERID")

   if [ -z "$FULL_PATH" ]; then
      msg "Directory to download Minecraft.jar to? : "
       
      read FETCH_TO
       
      cd -- "$FETCH_TO" || error "Path doesn't exist!"
      FULL_PATH="${PWD}/Minecraft.jar"
   fi

   msg "Downloading Minecraft.jar to ${FULL_PATH}"
   fetch -o "$FULL_PATH" "$MC_URL"
   
   while [ -z "$USERID" ]; do
       msg "Please enter your minecraft user id: "
       
       read USERID
   done
      
   cat <<EOF > $CONF_DIR/launcher_profiles.json
{
  "profiles": {
    "${USERID}": {
      "name": "${USERID}",
      "javaDir": "${PREFIX}/bin/minecraft"
    }
  }
}
EOF
   touch $CONF_FILE
   echo "USERID:${USERID}" > $CONF_FILE
   echo "FULL_PATH:${FULL_PATH}" >> $CONF_FILE

   msg "${CONF_FILE} written, now you can now just run 'minecraft' to start the game!"
else
  WORKDIR="${PREFIX}/share/lwjgl"
  LWJGL_JLP_OVRD="$WORKDIR/"
  LWJGL_OVRD="$WORKDIR/lwjgl.jar"
  LWJGL_UTIL_OVRD="$WORKDIR/lwjgl_util.jar"

  FULL_PATH=$(get_conf_var "FULL_PATH")

  if [ ! -e $FULL_PATH ]; then
      ftp -o $FULL_PATH $MC_URL
  fi

  build_classpath() {
    j=0
    ocp=`echo ${1} | sed 's/:/ /g'`
    for p in ${ocp}
    do
        if [[ $p == *lwjgl-* ]]
        then
            ncp[$j]=${LWJGL_OVRD}
        elif [[ $p == *lwjgl_util* ]]
        then
            ncp[$j]=${LWJGL_UTIL_OVRD}
        else
            ncp[$j]=${p}
        fi
        j=$(( j + 1 ))
    done

    cp=`echo ${ncp[@]} | sed 's/ /:/g'`
  }

  # check for the huge list of args, if we don't have them
  # we were launched by the user. if we do we were launched
  # by the mc launcher
  TARGS=$(echo -n ${@})
  REV=$(uname -r)
  if [ "${TARGS}X" == "X" ]; then
      # Starting Minecraft.jar here
      set_ulimit
      $(${PREFIX}/bin/javaPathHelper -c minecraft) -jar ${FULL_PATH}
  else
      i=0
      for var in "${@}"
      do
	  if [[ "$var" == -Djava.library* ]]
	  then
              args[$i]="-Djava.library.path=${LWJGL_JLP_OVRD} -Dos.version=OpenBSD_${REV}"
	  elif [[ "$var" == *lwjgl_util* ]]
	  then
              build_classpath "${var}"
              args[$i]="$cp"
	  else
              args[$i]=$var
	  fi
          i=$(( i + 1 ))
      done
      # This is sent to the minecraft launcher
      set_ulimit
      $(${PREFIX}/bin/javaPathHelper -c minecraft) ${args[@]} -jar ${FULL_PATH}
  fi
fi
