Files
EFTCOMPANION/update-ammo.sh
T
2026-06-25 21:26:53 +00:00

110 lines
2.5 KiB
Bash
Executable File

#!/bin/sh
# POSIX-safe (dash/sh compatible)
set -eu
OUT="/var/www/EFT_COMPANION/public_html/ammo-data.json"
API="https://api.tarkov.dev/graphql"
# --- Preferred: ammo-only (note lowercase enum value 'ammo') ---
GQL_AMMO_ONLY='{
items(lang: en, types: [ammo]) {
id
name
shortName
iconLink
wikiLink
updated
properties {
__typename
... on ItemPropertiesAmmo {
caliber
tracer
tracerColor
damage
armorDamage
fragmentationChance
penetrationPower
accuracyModifier
recoilModifier
initialSpeed
lightBleedModifier
heavyBleedModifier
projectileCount
}
}
}
}'
# --- Fallback: all items then filter to ItemPropertiesAmmo ---
GQL_ALL_MIN='{
items(lang: en) {
id
name
shortName
iconLink
wikiLink
updated
properties {
__typename
... on ItemPropertiesAmmo {
caliber
tracer
tracerColor
damage
armorDamage
fragmentationChance
penetrationPower
accuracyModifier
recoilModifier
initialSpeed
lightBleedModifier
heavyBleedModifier
projectileCount
}
}
}
}'
# Build JSON payloads safely via jq (read from stdin, -R = raw, -s = slurp)
PAYLOAD_AMMO_ONLY=$(printf '%s' "$GQL_AMMO_ONLY" | jq -Rs '{query: .}')
PAYLOAD_ALL_MIN=$(printf '%s' "$GQL_ALL_MIN" | jq -Rs '{query: .}')
fetch_graphql () {
payload="$1"
curl -sS -X POST "$API" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
--data-binary "$payload"
}
# Try ammo-only first
JSON=$(fetch_graphql "$PAYLOAD_AMMO_ONLY")
# If .data is missing, fall back to broad query
if ! printf '%s' "$JSON" | jq -e '.data' >/dev/null 2>&1 ; then
echo "Ammo-only query failed, falling back to broad items query…" >&2
JSON=$(fetch_graphql "$PAYLOAD_ALL_MIN")
if ! printf '%s' "$JSON" | jq -e '.data' >/dev/null 2>&1 ; then
echo "GraphQL error on fallback:" >&2
printf '%s\n' "$JSON" | jq . >&2 || printf '%s\n' "$JSON" >&2
exit 1
fi
fi
# Normalize to a compact JSON your site can consume
TMP="$OUT.tmp"
printf '%s' "$JSON" | jq -c '
{
fetchedAt: (now | todate),
source: "api.tarkov.dev/graphql",
items: (
.data.items
| map(select(.properties != null and .properties.__typename == "ItemPropertiesAmmo"))
)
}
' > "$TMP"
mv "$TMP" "$OUT"
COUNT=$(jq '.items | length' "$OUT")
echo "Wrote $COUNT ammo rows to $OUT at $(date -Is)"