Skip to content

Instantly share code, notes, and snippets.

@Aries0d0f
Created May 26, 2021 00:48
Show Gist options
  • Save Aries0d0f/a136710adf5357fe20a2b09ef2d389ab to your computer and use it in GitHub Desktop.
Save Aries0d0f/a136710adf5357fe20a2b09ef2d389ab to your computer and use it in GitHub Desktop.
Minecraft Server Manager Utility
#!/bin/zsh
welcome_menu () {
clear -x;
echo "\e[1;37m[Minecraft Server Util]\e[0m";
echo "version: \e[1;37mv0.0.1\e[0m";
echo "by \e[1;4;37m@Aries0d0f\e[0m | \e[1;4;36mhttps://aries0d0f.me\e[0m";
echo "\r";
echo "Press \e[1;37m[ENTER]\e[0m to start this util";
echo "Press \e[1;37m'q'\e[0m to exit";
printf "\e[1;32m> \e[0m";
read "KEY?";
if [[ "$KEY" =~ ^[Qq]$ ]];
then
echo "\e[3;36mBye!\e[0m";
sleep 1;
clear -x;
exit;
elif [[ "$KEY" = "" ]];
then
main_menu;
else
echo "\e[3;31mInvalid command.\e[0m\n";
sleep 1;
welcome_menu;
fi
}
main_menu () {
clear -x;
echo "\e[1;37m[Minecraft Server Sessions]\e[0m";
tput sc;
printf "\e[3;36mLoading...\e[0m";
sleep 1;
SERVER_SESSIONS=("${(@f)$(tmux ls | sed -En "s/mc-server-(.*)\: (.*)/\1/p")}");
tput rc;
tput el;
echo "\r";
count=1;
for SESSION in $SERVER_SESSIONS;
do
echo "\e[1;37m$count\e[0m - \e[1;33m$SESSION\e[0m";
count=$((count + 1));
done
echo "\r";
echo "\e[3;36mChoose one to continue...\e[0m";
printf "\e[1;32m> \e[0m";
while read "KEY?";
do
if [[ "$KEY" =~ ^[Qq] ]];
then
echo "\e[3;36mBye!\e[0m";
sleep 1;
clear -x;
exit;
elif [[ "$KEY" =~ ^([0-9])+ ]]
then
server_handler $SERVER_SESSIONS[$KEY];
break;
else
echo "\e[3;31mInvalid command.\e[0m\n";
sleep 1;
main_menu;
break;
fi
done
}
server_handler () {
clear -x;
SERVER=$1;
echo "\e[1;37m[ Server: \e[1;33m$SERVER\e[1;37m ]\e[0m";
tput sc;
echo "\e[3;36mLoading server...\e[0m";
sleep 1;
SERVER_PATH="$HOME/Minecraft/Servers/$SERVER";
SERVER_ENGINE=`basename $(readlink -f "$SERVER_PATH/server.jar") | sed -En "s/minecraft_server.(.*).jar/\1/p"`;
tput rc;
echo "Location: \e[1;37m$SERVER_PATH\e[0m";
echo "Minecraft Server Engine: \e[1;37m$SERVER_ENGINE\e[0m";
sleep 1;
server_menu $SERVER;
}
server_menu () {
SERVER=$1;
tput sc;
echo "\e[3;36mAttach to Minecraft Server Shell...\e[0m";
sleep 2;
tput rc;
tput el;
server_manual;
printf "\e[1;37mMC\e[0m@\e[1;33m$SERVER\e[0m \e[0;32m>\e[0m ";
while read "KEY?";
do
if [[ "$KEY" =~ ^[Bb] ]];
then
broadcaster $SERVER;
printf "\e[1;37mMC\e[0m@\e[1;33m$SERVER\e[0m \e[0;32m>\e[0m ";
elif [[ "$KEY" =~ ^[Mm] ]];
then
broadcaster $SERVER "Maintenance work needs to be performed on this Minecraft server.";
broadcaster $SERVER "You will be automatically logged off after 30 min."
printf "\e[1;37mMC\e[0m@\e[1;33m$SERVER\e[0m \e[0;32m>\e[0m ";
elif [[ "$KEY" =~ ^[Ss] ]];
then
shutdown $SERVER;
echo "\r\e[3;36mBack to main menu\e[0m";
sleep 1;
clear -x;
main_menu;
break;
elif [[ "$KEY" =~ ^[Rr] ]];
then
shutdown $SERVER;
sleep 5;
tput sc;
printf "\r\e[3;36mServer \e[0m\e[1;33m$SERVER\e[0m\e[3;36m preparing to restart...\e[0m";
$HOME/Minecraft/Scripts/startup.sh > /dev/null 2>&1;
tput rc;
tput el;
echo "\r\e[3;36mServer \e[0m\e[1;33m$SERVER\e[0m\e[3;36m is start.\e[0m";
sleep 2;
echo "\r\e[3;36mBack to main menu\e[0m";
sleep 1;
clear -x;
main_menu;
break;
elif [[ "$KEY" =~ ^[Ll] ]];
then
command_dispatcher $SERVER "/list";
sleep 5;
PLAYERS=`cat "/tmp/stdout_mc-server-$SERVER.log" | sed -En "s/.*\]\: (.*)/\1/p"`;
echo "\r$PLAYERS";
printf "\e[1;37mMC\e[0m@\e[1;33m$SERVER\e[0m \e[0;32m>\e[0m ";
elif [[ "$KEY" =~ ^[Qq] ]];
then
echo "\e[3;36mBye!\e[0m";
sleep 1;
clear -x;
exit 0;
elif [[ "$KEY" =~ ^[Xx] ]];
then
clear -x;
main_menu;
elif [[ "$KEY" =~ ^[Hh] ]];
then
server_manual;
printf "\e[1;37mMC\e[0m@\e[1;33m$SERVER\e[0m \e[0;32m>\e[0m ";
else
echo "\e[3;31mInvalid command. help for manual\e[0m".
printf "\e[1;37mMC\e[0m@\e[1;33m$SERVER\e[0m \e[0;32m>\e[0m ";
fi
done
}
server_manual () {
echo "---------------------------------------------------"
echo "B, b, broadcast Broadcast custom message";
echo "M, m, maintenance Send maintenance message";
echo "S, s, shutdown Shutdown Minecraft Server";
echo "R, r, restart Restart Minecraft Server";
echo "L, l, list List online player";
echo "X, x Back to main menu";
echo "Q, q, quit Exit this util";
echo "H, h, help Show this manual";
echo "---------------------------------------------------";
}
broadcaster () {
SERVER_NAME=$1;
MESSAGE=$2;
command_dispatcher $1 "/say $2";
}
shutdown () {
SERVER=$1;
tput ed;
tput el;
tput sc;
printf "\r\e[3;36mSaving all data...\e[0m";
command_dispatcher $SERVER "/save-all";
sleep 10;
tput rc;
tput el;
tput sc;
printf "\r\e[3;36mShutdown \e[0m\e[1;33m$SERVER\e[0m\e[3;36m...\e[0m";
command_dispatcher $SERVER "/stop";
sleep 5;
tput rc;
tput el;
echo "\r\e[3;36mServer \e[0m\e[1;33m$SERVER\e[0m\e[3;36m is shutdown.\e[0m";
sleep 1;
}
command_dispatcher () {
TMUX_SERVER_SESSION="mc-server-$1";
COMMAND=$2;
LOG="/tmp/stdout_$TMUX_SERVER_SESSION.log";
touch LOG;
tmux attach -t $TMUX_SERVER_SESSION -d \;\
set-buffer "$2" \;\
paste-buffer \;\
send-keys Enter \;\
pipe-pane -o "cat > $LOG" \;\
detach-client 1> /dev/null;
blackhole_buffer;
}
blackhole_buffer () {
tput sc;
read -s -k 8;
echo "\r";
tput rc;
}
welcome_menu;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment