husk.sh (1255B)
1 #!/bin/sh 2 PROGNAME="$(basename "$0")" 3 NC_TIMEOUT=1 4 5 notify() { echo "$PROGNAME: $@"; } 6 warn() { echo "$PROGNAME: $@" >&2; } 7 fatal() { 8 trap "exit 1" TERM 9 echo "$PROGNAME: $@" >&2 10 kill $$ 11 } 12 clean() { true; } 13 trap "clean" EXIT TERM INT 14 15 fetch() { 16 typeset TARGET PORT 17 PORT=7717 18 if [ $# -lt 1 ]; then fatal "usage: fetch server_name [port]"; exit 1; fi 19 TARGET="$1"; shift 20 if [ ! -z "$1" ]; then PORT="$1"; fi 21 22 echo '\info\' | nc -w "$NC_TIMEOUT" -u "$TARGET" "$PORT" | awk -v RS='\\' \ 23 'NR==1 { next } # empty field from leading \ 24 /^final$/ { exit } 25 (NR%2) == 0 { key=$0; next } 26 { print key" "$0 }' 27 } 28 29 format() { 30 typeset FMT 31 if [ $# -lt 1 ]; then fatal "usage: format format_string [string ...]"; exit 1; fi 32 FMT="$1"; shift 33 34 awk '{ key=$1; $1=""; $0=substr($0,2); pairs[key]=$0 } END { '"$(gen_printf "$FMT" $*)"' }' 35 echo 36 } 37 38 gen_printf() { 39 typeset FMT STRINGS 40 if [ $# -lt 1 ]; then fatal "usage: format format_string [string ...]"; exit 1; fi 41 FMT="$1"; shift 42 43 while [ $# -ge 1 ]; do 44 STRINGS="$STRINGS,pairs[\"$1\"]" 45 shift 46 done 47 48 echo "printf(\"$FMT\"$STRINGS)" 49 } 50 51 if [ $# -lt 1 ]; then fatal "usage: $PROGNAME server_name port"; fi 52 fetch $* | format "%s on %s [%s/%s]" hostname mapname numplayers maxplayers