Usage: ./scripts/announce.sh "message" [channel_name] Fetches the bot token from barge, resolves channel by name, and posts via the Discord API. Defaults to #general. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
64 lines
1.8 KiB
Bash
64 lines
1.8 KiB
Bash
#!/usr/bin/env bash
|
|
# Post an announcement to a Discord channel using the bot's token.
|
|
# Usage: ./scripts/announce.sh "Your message here" [channel_name]
|
|
# Default channel: general
|
|
|
|
set -euo pipefail
|
|
|
|
MESSAGE="${1:?Usage: announce.sh \"message\" [channel_name]}"
|
|
CHANNEL_NAME="${2:-general}"
|
|
|
|
# Fetch bot token from barge
|
|
TOKEN=$(ssh aj@barge.lan "grep DISCORD_BOT_TOKEN /mnt/docker/breehavior-monitor/.env" | cut -d= -f2-)
|
|
|
|
if [[ -z "$TOKEN" ]]; then
|
|
echo "ERROR: Could not read bot token from barge." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Get guilds the bot is in
|
|
GUILDS=$(curl -s -H "Authorization: Bot $TOKEN" "https://discord.com/api/v10/users/@me/guilds")
|
|
GUILD_ID=$(echo "$GUILDS" | python -c "import sys,json; print(json.load(sys.stdin)[0]['id'])")
|
|
|
|
if [[ -z "$GUILD_ID" ]]; then
|
|
echo "ERROR: Could not find guild." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Get channels and find the target by name
|
|
CHANNEL_ID=$(curl -s -H "Authorization: Bot $TOKEN" "https://discord.com/api/v10/guilds/$GUILD_ID/channels" \
|
|
| python -c "
|
|
import sys, json
|
|
channels = json.load(sys.stdin)
|
|
for ch in channels:
|
|
if ch['name'] == sys.argv[1] and ch['type'] == 0:
|
|
print(ch['id'])
|
|
break
|
|
" "$CHANNEL_NAME")
|
|
|
|
if [[ -z "$CHANNEL_ID" ]]; then
|
|
echo "ERROR: Channel #$CHANNEL_NAME not found." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Build JSON payload safely
|
|
PAYLOAD=$(python -c "import json,sys; print(json.dumps({'content': sys.argv[1]}))" "$MESSAGE")
|
|
|
|
# Post the message
|
|
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST \
|
|
-H "Authorization: Bot $TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$PAYLOAD" \
|
|
"https://discord.com/api/v10/channels/$CHANNEL_ID/messages")
|
|
|
|
HTTP_CODE=$(echo "$RESPONSE" | tail -1)
|
|
|
|
if [[ "$HTTP_CODE" == "200" ]]; then
|
|
echo "Posted to #$CHANNEL_NAME"
|
|
else
|
|
BODY=$(echo "$RESPONSE" | sed '$d')
|
|
echo "ERROR: HTTP $HTTP_CODE" >&2
|
|
echo "$BODY" >&2
|
|
exit 1
|
|
fi
|