Files
mc-connect/mc

158 lines
4.6 KiB
Bash
Executable File

#!/usr/bin/env bash
args=("$@")
readonly base_url="https://api.my-mc.link/"
readonly headers=( -H "Accept: application/json" -H "Content-Type: application/json" -H "x-my-mc-auth: ${MY_MC_API_KEY}" )
# command format: '<endpoint> <method> [options]'
declare -rA commands=(
[hello]='hello GET'
[time]='time GET'
[stats]='stats GET'
[log]='log GET'
[start]='start GET'
[stop]='stop GET'
[restart]='restart GET'
[my-link]='my-link GET'
[my-geyser-link]='my-geyser-link GET'
[my-sftp]='my-sftp GET'
[my-hash]='my-hash GET'
[my-geyser-hash]='my-geyser-hash GET'
[my-hash-sftp]='my-hash-sftp GET'
[list-players]='list-players GET'
[website]='website GET'
[map]='map GET'
[status-minecraft]='status/Minecraft GET'
[status-bedrock]='status/Bedrock GET'
[status-sftp]='status/SFTP GET'
[ban]='ban POST {"username":"%s"}'
[unban]='unban POST {"username":"%s"}'
[say]='say POST {"message":"%s"}'
[tell]='tell POST {"username":"%s","message":"%s"}'
[console]='console POST {"command":"%s"}'
[give]='give POST {"username":"%s","item":"%s","amount":"%s"}'
[install]='install POST {"mod":"%s"}'
[uninstall]='uninstall POST {"mod":"%s"}'
[search]='search POST {"mod":"%s"}'
[mod-list]='mod-list GET'
[backup]='backup FUNC'
[connect]='connect FUNC'
)
function connect() {
if [[ ! $(which docker) ]]; then echo "docker is required"; exit 1; fi
docker run --rm \
-e MODE=my-mc \
-e PORT=25565 \
-e HOST=0.0.0.0 \
-e PUBLIC=false \
-e MY_MC_API_KEY=$MY_MC_API_KEY \
-p 25565:25565 anaxios/holesail:testing
echo ""
}
function backup() {
if [[ ! $(which lftp) ]]; then echo "lftp is required"; exit 1; fi
local sftp_credentials="$(mc my-sftp)"
if [[ "$(jq -r '.success' <<<"${sftp_credentials}" )" != "true" ]]; then
echo "ERROR: failed to get sftp login info";
exit 1;
fi
local host="$(jq -r '.hostname' <<<"${sftp_credentials}")"
local username="$(jq -r '.user' <<<"${sftp_credentials}")"
local port="$(jq -r '.port' <<<"${sftp_credentials}")"
local password="$(jq -r '.password' <<<"${sftp_credentials}")"
local localdir="${MY_MC_BACKUP_DIR:-${HOME}/my-mc_backup/}"
if [[ ! -d ${localdir} ]]; then mkdir -p ${localdir}; fi
pushd "${localdir}"
lftp -u "${username}","${password}" "${host}":"${port}" \
-e "set sftp:connect-program 'ssh -o StrictHostKeyChecking=no'; mirror -c --use-pget minecraft/ minecraft/; quit"
popd
}
function first() {
echo "$1"
}
function second() {
first $(rest "${@}")
}
function rest() {
drop 1 "$@"
}
function drop() {
if (( 1 == "$#" )); then
return 0
fi
if (( "$#" < 1 )); then
return 1
fi
shift $(( 1 + $1 ))
echo "$@"
}
function usage() {
printf "API key for my-mc must be exported using 'export MY_MC_API_KEY=<my-mc api key>'\n\n"
printf "Backup directory can be changed from default ~/mc-mc_backup/ by using 'export MY_MC_BACKUP_DIR=</path/to/dir/>'\n\n"
printf "Positional arguments will fill the JSON objects with values from left to right.\n\n"
printf "COMMANDS:\n"
for command in "${!commands[@]}"; do
echo -e "\t ${command} $(rest $(rest ${commands[${command}]}))" | sed 's/[":]//g' |sed 's/%s//g'| sed 's/[,]/ /g'
done
printf "\n"
}
function main() {
# remove command from arg list while preserving quoted strings.
args=("${args[@]:1}")
if [[ ! $(which jq) ]]; then echo "jq is required"; exit 1; fi
for command in "${!commands[@]}"; do
if [[ "$1" == "${command}" ]]; then
case "$(second ${commands[$1]})" in
"POST")
curl -sS "${headers[@]}" -X "$(second ${commands[$1]})" "${base_url}$(first ${commands[$1]})" \
-d "$(printf "$(drop 2 ${commands[$1]})\n" "${args[@]}")"
echo ""
;;
"GET")
curl -sS "${headers[@]}" -X "$(second ${commands[$1]})" "${base_url}$(first ${commands[$1]})"
echo ""
;;
"FUNC")
eval "$(first ${commands[$1]})" "${args[@]}"
;;
*)
echo "ERROR: Invalid state. Check for typo in command array."
;;
esac
exit 0
fi
done
printf "${0}: invalid option -- $1\n"
usage
exit 1
}
if [[ "$(basename "$0")" == "mc" ]]; then
main "${args[@]}"
fi