#!/bin/bash # Minecraft Java serverdir builder function fail(){ >&2 echo $@ exit 1 } function perror() { echo $@ } >&2 # 1: file 2: attribute function serverprop_get() { sed -n "s/$2=\(.*\)$/\1/p" "$1" } # 1: file 2: attribute 3: value function serverprop_set() { if grep -s "^$2=.*$" "$1"; then sed -i "s/$2=.*$/$2=$3/g" "$1" else echo "$2=$3" >> "$1" fi } function confirm() { [ -z "$NO_INTERACTIVE" ] || return 1 read -p "$@ [y/N] " choice case $choice in [yY]*) return 0;; *) return 1 esac } # Sub Commands ## world function world() { local CMD="$1" case $CMD in list) ;& create) ;& clone) ;& backup) ;& delete) ;& assign) shift eval 'world_$CMD "$@"' ;; *) fail "world: Unknown argument $CMD" esac exit $? } function world_exists() { [ -d "$WORLDS/$1" ] return $? } function world_list() { for WORLD in $WORLDS/*/; do WORLD=$(basename $WORLD) [ -e "$WORLDS/$WORLD.lock" ] && source "$WORLDS/$WORLD.lock" [ -z "$ASSIGNED_TO" ] || WORLD="$WORLD (-> $ASSIGNED_TO)" echo $WORLD done } # 1: world 2: instance function world_assign() { local WORLD="$1" local INSTANCE="$2" world_exists "$WORLD" \ || ( confirm "World not found. Create?" \ && world_create "$WORLD" \ || fail "World $WORLD not found." ) [ -f "$WORLDS/$WORLD.lock" ] && fail "$WORLD is already used by another instance." echo "ASSIGNED_TO=\"$INSTANCE\"" > "$WORLDS/$WORLD.lock" # TODO check?!? ln -s "$WORLDS/$WORLD" "$INSTANCES/$INSTANCE" serverprop_set "$INSTANCES/$INSTANCE/server.properties" level-name "$WORLD" } # 1: name function world_create() { world_exists "$1" && fail "World already exists" mkdir "$WORLDS/$1" } ## instance function instance() { local CMD="$1" case $CMD in list) ;& create) ;& delete) ;& start) ;& stop) ;& status) shift eval 'instance_$CMD "$@"' ;; *) fail "instance: Unknown argument $CMD" esac exit $? } function instance_list() { for INSTANCE in $INSTANCES/*/; do INSTANCE="$(basename "$INSTANCE")" instance_status "$INSTANCE" > /dev/null 2>&1 && INSTANCE+=" (RUNNING)" echo "$INSTANCE" done return 0 } function instance_status() { instance_exists "$1" || fail "instance $1 not found." local PWD="$(pwd)" cd "$INSTANCES/$1" $RUNNER status local RET=$? cd "$PWD" return $RET } function instance_exists() { [ -d "$INSTANCES/$1" ] return $? } # 1: name function instance_create() { local NAME="$1" instance_exists "$NAME" && fail "$NAME already exists." mkdir "$INSTANCES/$NAME" confirm "Accept minecraft EULA?" && serverprop_set "$INSTANCES/$NAME/eula.txt" eula true } function instance_start() { instance_exists "$1" || fail "instance $1 not found." # TODO } ## version function version() { local CMD="$1" case $CMD in list) ;& install) ;& uninstall) shift eval 'version_$CMD "$@"' ;; *) fail "version: Unknown argument $CMD" esac exit $? } function version_exists() { [ -f "$VERSIONS/$1.jar" ] return $? } function version_list() { for VERSION in $VERSIONS/*.jar; do VERSION="$(basename "$VERSION")" echo "${VERSION%%.jar}" done return 0 } # 1: version 2: instance function version_install() { local VERSION="$1" local INSTANCE="$2" instance_exists "$INSTANCE" || fail "instance $1 not found." version_exists "$VERSION" || fail "version $2 not found." local PWD=$(pwd) cd "$INSTANCES/$INSTANCE" [ -e "$VERSION.jar" ] && rm "$VERSION.jar" ln -s "$VERSIONS/$VERSION.jar" "$VERSION.jar" serverprop_set settings.sh MCJAR "$VERSION.jar" cd "$PWD" } # NO_INTERACTIVE=1 PREFIX=$(pwd) VERSIONS="$PREFIX/versions" WORLDS="$PREFIX/worlds" INSTANCES="$PREFIX/instances" RUNNER="$PREFIX/runner.sh" [ -e ./settings.sh ] || fail "settings.sh not found." source ./settings.sh CMD="$1" case $CMD in world) ;& instance) ;& version) shift eval '$CMD "$@"' ;; *) fail "Unknown option $1" esac