#!/bin/bash # Minecraft Java serverdir builder function fail(){ >&2 echo $@ exit 1 } # 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 $? } # 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" 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_exists() { [ -d "$INSTANCES/$1" ] return $? } # 1: name 2: world 3: version function instance_create() { local NAME="$1" local WORLD="$2" local VERSION="$3" instance_exists "$NAME" && fail "$NAME already exists." mkdir "$INSTANCES/$NAME" version_install "$NAME" "$VERSION" confirm "Accept minecraft EULA?" && serverprop_set "$INSTANCES/$NAME/eula.txt" eula true world_assign "$WORLD" "$NAME" } function instance_start() { instance_exists "$1" || fail "instance $1 not found." # TODO } ## version function version() { fail "not implemented" } function version_exists() { [ -f "$VERSIONS/$1.jar" ] return $? } # 1: instance 2: version function version_install() { instance_exists "$1" || fail "instance $1 not found." version_exists "$2" || fail "version $2 not found." local PWD=$(pwd) cd "$INSTANCES/$1" [ -e "$2.jar" ] && rm "$2.jar" ln -s "$VERSIONS/$2.jar" "$2.jar" serverprop_set settings.sh MCJAR "$2.jar" cd "$PWD" } # NO_INTERACTIVE=1 PREFIX=$(pwd) VERSIONS="$PREFIX/versions" WORLDS="$PREFIX/worlds" INSTANCES="$PREFIX/instances" RUNNER="$PREFIX/runner.sh" [ -x ./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