#!/bin/bash # ============================================================================ # Type a command at the running bot on its own behalf. # # Signal never delivers an account its own sends, so this is the only way to # exercise a command end-to-end without a second Signal account. It posts for # real, into a real group -- SELFTEST_GROUPS decides which. # # scripts/selftest.sh testbot '!papież' 5 # ============================================================================ set -euo pipefail SCRIPT_NAME="$(basename "$0")" readonly SCRIPT_NAME readonly BOT="http://127.0.0.1:${BIND_PORT:-8137}" GROUP="${1:-}" TEXT="${2:-}" TIMES="${3:-1}" usage() { echo "Usage: $SCRIPT_NAME [times]" echo " The group must be listed in SELFTEST_GROUPS, or the bot refuses." exit 0 } validate_requirements() { if [[ -z "$GROUP" || -z "$TEXT" ]]; then echo "Error: group and text are required" >&2 usage fi if ! command -v jq >/dev/null; then echo "Error: jq is required" >&2 exit 1 fi if ! curl -sf "${BOT}/healthz" >/dev/null; then echo "Error: no healthy bot at ${BOT}" >&2 exit 1 fi } main() { validate_requirements local reply status for ((i = 1; i <= TIMES; i++)); do reply="$(curl -s -X POST "${BOT}/_selftest" \ -H 'Content-Type: application/json' \ --data "$(jq -nc --arg g "$GROUP" --arg t "$TEXT" '{group:$g,text:$t}')")" status="$(jq -r '.status' <<<"$reply")" if [[ "$status" != "delivered" ]]; then echo " ${i}/${TIMES} ${status}: $(jq -r '.reason // "?"' <<<"$reply")" >&2 exit 1 fi echo " ${i}/${TIMES} delivered ${TEXT} to ${GROUP}" # The cooldown is per user per command, and the self-test is always # the same user, so a tighter loop just proves the cooldown works. [[ $i -lt $TIMES ]] && sleep "${SELFTEST_INTERVAL:-11}" done echo "== done; look at ${GROUP} in Signal" } main "$@"