#!/usr/bin/env bash # A word from the keeper in a table's talk, signed as the keeper, whether or # not the host lets the gallery talk: the answer to a call that came too late, # or anything else the table should hear from the keeper. Runs ON the droplet, # through the game server's keeper door. # __SLUG__-say.sh ROOM "text" set -euo pipefail ROOM="${1:?usage: __SLUG__-say.sh ROOM \"text\"}" TEXT="${2:?usage: __SLUG__-say.sh ROOM \"text\"}" DOOR="http://127.0.0.1:__PORT__/keeper/rooms/${ROOM^^}" [ -s /etc/__SLUG__/keeper.key ] || { echo "No keeper's key at /etc/__SLUG__/keeper.key; a deploy makes it." >&2; exit 1; } # The key goes as a header read from a file descriptor, never on a command line another user could see. KEY="@/dev/fd/3" exec 3< <(printf 'x-keeper-key: %s\n' "$(cat /etc/__SLUG__/keeper.key)") BODY=$(TEXT="$TEXT" python3 -c 'import json, os; print(json.dumps({"text": os.environ["TEXT"]}))') CODE=$(curl -s -o /tmp/__SLUG__-say.$$ -w '%{http_code}' -X POST -H "$KEY" -H 'content-type: application/json' -d "$BODY" "$DOOR/say") if [ "$CODE" = 204 ]; then echo "said at ${ROOM^^}"; else cat /tmp/__SLUG__-say.$$ >&2; echo >&2; rm -f /tmp/__SLUG__-say.$$; exit 1; fi rm -f /tmp/__SLUG__-say.$$