diff options
author | Freya Murphy <freya@freyacat.org> | 2024-05-03 13:59:07 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-05-03 13:59:07 -0400 |
commit | 3276b3d2d44f6506f9384776516f7b5aedbeba7d (patch) | |
tree | 0e4e75b2dc259a4802b4e4efa184be29e6dd0e45 /mcjar | |
download | scripts-3276b3d2d44f6506f9384776516f7b5aedbeba7d.tar.gz scripts-3276b3d2d44f6506f9384776516f7b5aedbeba7d.tar.bz2 scripts-3276b3d2d44f6506f9384776516f7b5aedbeba7d.zip |
scripts
Diffstat (limited to 'mcjar')
-rwxr-xr-x | mcjar | 255 |
1 files changed, 255 insertions, 0 deletions
@@ -0,0 +1,255 @@ +#!/bin/sh + +set -e + +lower() { + echo "$1" | tr '[:upper:]' '[:lower:]' +} + +upper() { + echo "$1" | tr '[:lower:]' '[:upper:]' +} + +# global +MC_TYPE="$(lower "${MC_TYPE:-vanilla}")" +MC_VERSION="$(lower "${MC_VERSION:-latest}")" + +# papermc +PAPERMC_BUILD="$(lower "${PAPERMC_BUILD:-latest}")" + +# fabric +FABRIC_LOADER="$(lower "${FABRIC_LOADER:-latest}")" +FABRIC_INSTALLER="$(lower "${FABRIC_INSTALLER:-latest}")" + +# other +QUIET=1 + +req() { + res=$(curl --fail --silent "$1") + code=$? + + if [ $code -ne 0 ]; then + echo "null"; + else + echo "$res"; + fi +} + +error() { + printf '\x1b[31m[ERROR]\t\x1b[0m%s\n' "$*" > /dev/stderr + exit 1; +} + +log() { + if [ "$QUIET" -eq 0 ]; then + printf '\x1b[0m[LOG]\t%s\n' "$*" > /dev/stdout + fi +} + +index_array() { + array="$1" + key="$2" + type="$3" + + if [ "$key" = "latest" ]; then + index=$(echo "$array" | jq ". | index( last )"); + else + index=$(echo "$array" | jq ". | index( \"$key\" )"); + fi + + if [ "$index" = "null" ]; then + error "Invalid $type: $key" + else + echo "$array" | jq -r ".[$index]"; + fi +} + +#https://api.papermc.io/v2/projects/velocity/versions/3.3.0-SNAPSHOT/ + +papermc() { + api="https://api.papermc.io/v2/projects" + + log "Using papermc api v2" + + get_version() { + log "Getting VERSION for '$MC_TYPE'" + versions=$(req "$api/$MC_TYPE" | jq -r '.versions') + if [ "$versions" = "null" ]; then + error "Invalid TYPE: $MC_TYPE (no versions)" + fi + MC_VERSION=$(index_array "$versions" "$MC_VERSION" "VERSION") + log "VERSION: $MC_VERSION" + } + + get_build() { + log "Getting BUILD for '$MC_TYPE@$MC_VERSION'" + builds=$(req "$api/$MC_TYPE/versions/$MC_VERSION" | jq -r ".builds") + if [ "$builds" = "null" ]; then + error "Invalid VERSION: $MC_TYPE@$MC_TYPE (no builds)" + fi + PAPERMC_BUILD=$(index_array "$builds" "$PAPERMC_BUILD" "BUILD") + log "BUILD: $PAPERMC_BUILD" + } + + get_version + get_build + + echo "$api/$MC_TYPE/versions/$MC_VERSION/builds/$PAPERMC_BUILD/downloads/$MC_TYPE-$MC_VERSION-$PAPERMC_BUILD.jar" +} + +fabric() { + api="https://meta.fabricmc.net/v2/versions" + + log "Using fabric api v2" + + get_fabric_impl() { + type="$1" + value="$2" + res="" + if [ "$value" = "latest" ]; then + res=$(req "$api/$type" | jq -r 'map(select(.stable == true) | .version) | reverse') + else + res=$(req "$api/$type" | jq -r 'map(.version) | reverse') + fi; + echo $res; + } + + get_game() { + log "Getting VERSION for '$MC_TYPE'" + games=$(get_fabric_impl "game" "$MC_VERSION") + MC_VERSION=$(index_array "$games" "$MC_VERSION" "VERSION") + log "VERSION: $MC_VERSION" + } + + get_loader() { + log "Getting LOADER for '$MC_TYPE'" + loaders=$(get_fabric_impl "loader" "$FABRIC_LOADER") + FABRIC_LOADER=$(index_array "$loaders" "$FABRIC_LOADER" "LOADER") + log "LOADER: $FABRIC_LOADER" + } + + get_installer() { + log "Getting INSTALLER for '$MC_TYPE'" + installers=$(get_fabric_impl "installer" "$FABRIC_INSTALLER") + FABRIC_INSTALLER=$(index_array "$installers" "$FABRIC_INSTALLER" "INSTALLER") + log "INSTALLER: $FABRIC_INSTALLER" + } + + get_game + get_loader + get_installer + + echo "$api/loader/$MC_VERSION/$FABRIC_LOADER/$FABRIC_INSTALLER/server/jar" +} + +vanilla() { + versions=$(req 'https://launchermeta.mojang.com/mc/game/version_manifest.json' | jq '.versions | map({ "id": .id, "type": .type, "url": .url }) | reverse'); + + map_type_impl() { + type="$1" + echo "$versions" | jq -r "map(select(.type == \"$type\"))" + } + + get_version() { + log "Getting VERSION for '$MC_TYPE'" + version="" + case "$MC_VERSION" in + "latest") + version=$(map_type_impl "release" | jq -r 'last') + ;; + "snapshot") + version=$(map_type_impl "snapshot" | jq -r 'last') + ;; + *) + version=$(echo "$versions" | jq ".[] | select(.id == \"$MC_VERSION\")") + ;; + esac + + if [ "$version" = "null" ] || [ "$version" = "" ]; then + error "Invalid VERSION: $MC_VERSION" + fi + + log "VERSION: $(echo "$version" | jq -r '.id')" + + json=$(echo "$version" | jq -r '.url') + url=$(req "$json" | jq -r '.downloads.server.url') + + if [ "$url" = "null" ]; then + error "Cannot get server jar for VERSION: $MC_VERSION" + fi + + echo "$url" + } + + get_version +} + +get_url() { + + log "TYPE: $MC_TYPE" + + case "$MC_TYPE" in + "vanilla") + vanilla + ;; + "paper" | "waterfall" | "velocity" | "folia") + papermc + ;; + "fabric") + fabric + ;; + *) + error "Invalid TYPE: $MC_TYPE" + ;; + esac +} + +usage() { + printf "usage: mcjar [options]\n" +} + +help() { + printf "usage: mcjar [options]\n\n" + printf "options:\n" + printf "\t-h\tshow this message\n" + printf "\t-l\tshow logging (verbose)\n\n" + + printf "\t-t TYPE\t\tset the mc server type\n" + printf "\t [vanilla,fabric,paper,folia,velocity,waterfall]\n\n" + printf "\t-v VERSION\tset the mc server version\n" + printf "\t [latest,snapshot,<version>]\n\n" + + printf "environment:\n" + printf "\tMC_TYPE\t\tsets the mc server type (same as -t TYPE)\n" + printf "\tMC_VERSION\tsets the mc server version (same as -v VERSION)\n\n" + + printf "\tPAPERMC_BUILD\tsets the papermc build\n\n" + + printf "\tFABRIC_LOADER\t\tsets the fabric loder version\n" + printf "\tFABRIC_INSTALLER\tsets the fabric installer version\n\n" +} + + +while getopts "hlt:v:" arg > /dev/null; do + case $arg in + h) + help + exit 0 + ;; + l) + QUIET=0 + ;; + t) + MC_TYPE=${OPTARG} + ;; + v) + MC_VERSION=${OPTARG} + ;; + ?) + error "unknown option" + exit 1 + ;; + esac; +done; + +get_url |