119 lines
3.1 KiB
Bash
Executable File
119 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Fetches a user's follow list (kind 3) from public relays,
|
|
# then fetches metadata (kind 0) for all followed pubkeys,
|
|
# and republishes everything to local dev relays.
|
|
#
|
|
# Usage:
|
|
# ./scripts/seed_test_follows.sh <npub or hex pubkey>
|
|
#
|
|
set -euo pipefail
|
|
|
|
if [ $# -lt 1 ]; then
|
|
echo "Usage: $0 <npub or hex pubkey>"
|
|
exit 1
|
|
fi
|
|
|
|
INPUT="$1"
|
|
|
|
# Detect format and normalize to both npub and hex
|
|
if [[ "$INPUT" == npub1* ]]; then
|
|
NPUB="$INPUT"
|
|
HEX=$(nak decode "$INPUT" 2>/dev/null) || {
|
|
echo "ERROR: Invalid npub"
|
|
exit 1
|
|
}
|
|
else
|
|
HEX="$INPUT"
|
|
NPUB=$(nak encode npub "$INPUT" 2>/dev/null) || {
|
|
echo "ERROR: Invalid hex pubkey"
|
|
exit 1
|
|
}
|
|
fi
|
|
|
|
SOURCE_RELAYS="wss://relay.primal.net wss://relay.damus.io wss://purplepag.es wss://nos.lol"
|
|
LOCAL_RELAYS=(ws://localhost:8080 ws://localhost:7777)
|
|
BATCH_SIZE=20
|
|
|
|
echo "Pubkey: $HEX"
|
|
echo "Npub: $NPUB"
|
|
echo ""
|
|
|
|
# Publish a single event to all local relays, tolerating per-relay failures
|
|
publish() {
|
|
local event="$1"
|
|
for relay in "${LOCAL_RELAYS[@]}"; do
|
|
echo "$event" | nak event "$relay" 2>&1 | sed "s/^/ /" || true
|
|
done
|
|
}
|
|
|
|
echo "=== Fetching follow list (kind 3) ==="
|
|
FOLLOW_EVENT=$(nak req -k 3 -l 1 -a "$HEX" $SOURCE_RELAYS 2>/dev/null | head -1)
|
|
|
|
if [ -z "$FOLLOW_EVENT" ]; then
|
|
echo "ERROR: No follow list found"
|
|
exit 1
|
|
fi
|
|
|
|
FOLLOW_COUNT=$(echo "$FOLLOW_EVENT" | jq '[.tags[] | select(.[0] == "p")] | length')
|
|
echo "Found $FOLLOW_COUNT follows"
|
|
|
|
echo ""
|
|
echo "=== Publishing follow list to local relays ==="
|
|
publish "$FOLLOW_EVENT"
|
|
|
|
echo ""
|
|
echo "=== Extracting followed pubkeys ==="
|
|
PUBKEYS=$(echo "$FOLLOW_EVENT" | jq -r '.tags[] | select(.[0] == "p") | .[1]')
|
|
|
|
echo ""
|
|
echo "=== Fetching and publishing metadata (kind 0) in batches of $BATCH_SIZE ==="
|
|
PUBLISHED=0
|
|
BATCH_NUM=0
|
|
BATCH_ARGS=()
|
|
|
|
while read -r pk; do
|
|
[ -z "$pk" ] && continue
|
|
BATCH_ARGS+=("-a" "$pk")
|
|
|
|
if [ ${#BATCH_ARGS[@]} -ge $((BATCH_SIZE * 2)) ]; then
|
|
BATCH_NUM=$((BATCH_NUM + 1))
|
|
EVENTS=$(nak req -k 0 "${BATCH_ARGS[@]}" $SOURCE_RELAYS 2>/dev/null || true)
|
|
BATCH_COUNT=0
|
|
while read -r event; do
|
|
[ -z "$event" ] && continue
|
|
publish "$event" >/dev/null 2>&1
|
|
BATCH_COUNT=$((BATCH_COUNT + 1))
|
|
done <<<"$EVENTS"
|
|
PUBLISHED=$((PUBLISHED + BATCH_COUNT))
|
|
printf " batch %d: %d metadata events (%d total)\n" "$BATCH_NUM" "$BATCH_COUNT" "$PUBLISHED"
|
|
BATCH_ARGS=()
|
|
fi
|
|
done <<<"$PUBKEYS"
|
|
|
|
if [ ${#BATCH_ARGS[@]} -gt 0 ]; then
|
|
BATCH_NUM=$((BATCH_NUM + 1))
|
|
EVENTS=$(nak req -k 0 "${BATCH_ARGS[@]}" $SOURCE_RELAYS 2>/dev/null || true)
|
|
BATCH_COUNT=0
|
|
while read -r event; do
|
|
[ -z "$event" ] && continue
|
|
publish "$event" >/dev/null 2>&1
|
|
BATCH_COUNT=$((BATCH_COUNT + 1))
|
|
done <<<"$EVENTS"
|
|
PUBLISHED=$((PUBLISHED + BATCH_COUNT))
|
|
printf " batch %d: %d metadata events (%d total)\n" "$BATCH_NUM" "$BATCH_COUNT" "$PUBLISHED"
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== Fetching and publishing user's own metadata ==="
|
|
OWN_METADATA=$(nak req -k 0 -l 1 -a "$HEX" $SOURCE_RELAYS 2>/dev/null | head -1)
|
|
if [ -n "$OWN_METADATA" ]; then
|
|
publish "$OWN_METADATA"
|
|
else
|
|
echo " No metadata found"
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== Done ==="
|
|
echo "Published follow list ($FOLLOW_COUNT follows) + $PUBLISHED metadata events"
|