#!/usr/bin/env bash # Constants # port of the server in standalone mode, aka the open port STANDALONE_PORT=25565 # port of the server in proxy mode, aka the internal port PROXY_PORT=25566 # installs ViaVersion on BungeeCord and standalone mode, removes it in Velocity mode MANAGE_VIA_VERSION=true # installs ViaBackwards on BungeeCord and standalone mode, removes it in Velocity mode MANAGE_VIA_BACKWARDS=$MANAGE_VIA_VERSION # Prefix of the ViaVersion jar VIA_VERSION_NAME="ViaVersion" # Prefix of the ViaBackwards jar VIA_BACKWARDS_NAME="ViaBackwards" # Github repo of ViaVersion project VIA_VERSION_REPO="ViaVersion/ViaVersion" # Github repo of ViaBackwards project VIA_BACKWARDS_REPO="ViaVersion/ViaBackwards" # Runtime variables quiet=false function main { # parse arguments local velocity=false local bungeecord=false local standalone=false local fetch=false local help=false for arg in "$@"; do case "$arg" in "velocity") velocity=true if $bungeecord || $standalone; then err "argument velocity can't be used together with bungeecord or standalone" fi ;; "bungeecord") bungeecord=true if $velocity || $standalone; then err "argument bungeecord can't be used together with velocity or standalone" fi ;; "standalone") standalone=true if $bungeecord || $velocity; then err "argument standalone can't be used together with bungeecord or velocity" fi ;; "--fetch") fetch=true quiet=true ;; "--quiet" | "-q") quiet=true ;; "--help") help=true ;; *) err "Unknown argument: $arg" ;; esac done if $help; then echo "Configure the server to be used with BungeeCord, Velcity or in standalone mode." echo "" echo "Usage: $0 [OPTIONS] " echo "" echo "mode:" echo " velocity" echo " bungeecord" echo " standalone" echo "" echo "OPTIONS:" echo " --fetch - print the current mode before reconfiguring the server. Nothing else will be printed." echo " --help - show this message" echo " -q --quiet - Dont print any output, except for output which is caused by --fetch" exit 0 fi # fetch current configuration if $fetch; then if [ "$(yq '.proxies.velocity.enabled // false' config/paper-global.yml)" = "true" ]; then echo "velocity" elif [ "$(yq '.settings.bungeecord // false' spigot.yml)" = "true" ]; then echo "bungeecord" else echo "standalone" fi fi # Do the actual configuration # Velocity if $velocity; then enable_online_mode false set_port "$PROXY_PORT" enable_velocity true enable_bungeecord false if $MANAGE_VIA_VERSION; then remove_plugin "$VIA_VERSION_NAME" fi if $MANAGE_VIA_BACKWARDS; then remove_plugin "$VIA_BACKWARDS_NAME" fi # BungeeCord elif $bungeecord; then enable_online_mode false set_port "$PROXY_PORT" enable_velocity false enable_bungeecord true if $MANAGE_VIA_VERSION; then update_plugin "$VIA_VERSION_NAME" "$VIA_VERSION_REPO" fi if $MANAGE_VIA_BACKWARDS; then update_plugin "$VIA_BACKWARDS_NAME" "$VIA_BACKWARDS_REPO" fi # standalone elif $standalone; then enable_online_mode true set_port "$STANDALONE_PORT" enable_velocity false enable_bungeecord false if $MANAGE_VIA_VERSION; then update_plugin "$VIA_VERSION_NAME" "$VIA_VERSION_REPO" fi if $MANAGE_VIA_BACKWARDS; then update_plugin "$VIA_BACKWARDS_NAME" "$VIA_BACKWARDS_REPO" fi fi } # Enables or disables online mode # # Usage: enable_online_mode function enable_online_mode { sed -ie "/online-mode/c\online-mode=$1" server.properties } # Set the port of the server # # Usage: set_port function set_port { sed -ie "/server-port/c\server-port=$1" server.properties } # Enables or disables velocity in the paper config. # Does NOT configure the forwarding secret! # # Usage: enable_velocity function enable_velocity { yq -iy ".proxies.velocity.enabled = $1" config/paper-global.yml } # Enables or disables bungeecord in spigot.yml. # # Usage: enable_bungeecord function enable_bungeecord { yq -iy ".settings.bungeecord = $1" spigot.yml } # Removes a plugin # # Usage: remove_plugin function remove_plugin { local plugin_name=$1 rm plugins/"$plugin_name"*.jar 2>/dev/null } # Update the latest release of a plugin from github # # Usage: update_plugin function update_plugin { local plugin_name=$1 local repo=$2 remove_plugin $plugin_name download_jar_from_github $repo "plugins/" } # Download the jar files from the latest release of a github repo # # Usage: download_jar_from_github function download_jar_from_github { local repo=$1 local dst=$2 local url=$(curl -s "https://api.github.com/repos/$repo/releases/latest" | jq -r '.assets[] | select(.name | endswith(".jar")) | .browser_download_url') if $quiet; then wget -qP "$dst" "$url" else wget -P "$dst" "$url" fi } # Shows ans error message and exits the program with code 1 # # Usage: err function err { echo "$1" exit 1 } main "$@"