#!/bin/bash # Subsea Seismic Monitor # Tracks underwater earthquakes via USGS API # Alias: seismic export DISPLAY=:0 # USGS Earthquake API endpoints api_base="https://earthquake.usgs.gov/fdsnws/event/1/query" # Feed URLs for quick access feed_hour="https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.geojson" feed_day="https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson" feed_week="https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_week.geojson" feed_month="https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/4.5_month.geojson" # Map image map_url="https://earthquake.usgs.gov/earthquakes/map/images/us_seismicity.png" # Cache locations cache_dir="$HOME/.cache/maritime/seismic" cache_hour="$cache_dir/hour.json" cache_day="$cache_dir/day.json" cache_week="$cache_dir/week.json" cache_map="$cache_dir/seismicity_map.png" cache_report="$cache_dir/report.txt" # Ensure cache dir exists mkdir -p "$cache_dir" # Fetch and cache data update() { echo "Fetching seismic data from USGS..." curl -sLo "$cache_hour" "$feed_hour" & curl -sLo "$cache_day" "$feed_day" & curl -sLo "$cache_week" "$feed_week" & wait generate_report notify-send -t 3000 "Seismic Data Updated" "$(head -5 "$cache_report")" } # Generate human-readable report generate_report() { local count_hour count_day count_week max_mag max_place count_hour=$(jq '.metadata.count' "$cache_hour" 2>/dev/null || echo "0") count_day=$(jq '.metadata.count' "$cache_day" 2>/dev/null || echo "0") count_week=$(jq '.features | length' "$cache_week" 2>/dev/null || echo "0") # Get strongest quake in past week max_mag=$(jq -r '[.features[].properties.mag] | max' "$cache_week" 2>/dev/null || echo "N/A") max_place=$(jq -r '.features | max_by(.properties.mag) | .properties.place' "$cache_week" 2>/dev/null || echo "Unknown") cat > "$cache_report" << EOF SUBSEA SEISMIC REPORT - $(date '+%Y-%m-%d %H:%M') ═══════════════════════════════════════════════ Events (Last Hour): $count_hour Events (Last 24h): $count_day Events (Last Week): $count_week (M2.5+) Strongest This Week: M$max_mag Location: $max_place ═══════════════════════════════════════════════ EOF } # Query specific parameters query() { local params="format=geojson" local min_mag="${1:-2.5}" local time_range="${2:-day}" local start_time end_time end_time=$(date -u +%Y-%m-%dT%H:%M:%S) case "$time_range" in hour) start_time=$(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S) ;; day) start_time=$(date -u -d '1 day ago' +%Y-%m-%dT%H:%M:%S) ;; week) start_time=$(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%S) ;; month) start_time=$(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%S) ;; esac curl -s "${api_base}?${params}&starttime=${start_time}&endtime=${end_time}&minmagnitude=${min_mag}" } # List recent earthquakes list_recent() { local count="${1:-10}" echo "Recent Seismic Events (Top $count):" echo "════════════════════════════════════" jq -r ".features[:$count][] | \"M\(.properties.mag | tostring | .[0:3]) | \(.properties.place) | \(.properties.time / 1000 | strftime(\"%Y-%m-%d %H:%M\"))\"" "$cache_day" 2>/dev/null } # Filter by ocean basin (approximate bounding boxes) filter_ocean() { local ocean="$1" local minlat maxlat minlon maxlon case "$ocean" in pacific|P) minlat=-60; maxlat=60; minlon=100; maxlon=-100 ;; atlantic|A) minlat=-60; maxlat=60; minlon=-80; maxlon=0 ;; indian|I) minlat=-60; maxlat=30; minlon=20; maxlon=120 ;; arctic|AR) minlat=66; maxlat=90; minlon=-180; maxlon=180 ;; *) echo "Unknown ocean: $ocean" echo "Use: P (Pacific), A (Atlantic), I (Indian), AR (Arctic)" return 1 ;; esac echo "Seismic events in $ocean basin:" jq -r ".features[] | select(.geometry.coordinates[1] >= $minlat and .geometry.coordinates[1] <= $maxlat) | \"M\(.properties.mag) | \(.properties.place)\"" "$cache_day" 2>/dev/null | head -20 } # Show seismicity map show_map() { setsid -f mpv --title="Global Seismicity" --autofit=70% "$cache_map" } # Display help help() { cat << EOF Subsea Seismic Monitor - USGS Earthquake Tracker Usage: seismic [OPTION] Options: update, u Update seismic data from USGS list [N] List N most recent events (default: 10) report, r Show current seismic report map, m Show global seismicity map ocean, -o BASIN Filter by ocean (P/A/I/AR) query MAG TIME Custom query (mag threshold, time: hour/day/week) help, h Show this help Ocean Basins: P Pacific Ocean A Atlantic Ocean I Indian Ocean AR Arctic Ocean Examples: seismic list 20 # Show 20 most recent quakes seismic -o P # Pacific basin events seismic query 4.0 week # M4.0+ events this week Data Source: USGS Earthquake Hazards Program EOF } # Status bar output tobar() { local count count=$(jq '.metadata.count' "$cache_day" 2>/dev/null || echo "?") echo " $count" } # Handle arguments case "$1" in u*) update ;; list|l) shift; list_recent "$1" ;; report|r) cat "$cache_report" 2>/dev/null || echo "Run 'seismic update' first" ;; map|m) show_map ;; ocean|-o) shift; filter_ocean "$1" ;; query|q) shift; query "$1" "$2" | jq '.' ;; h*|--help) help ;; "") tobar ;; *) help ;; esac # Status bar click handlers case $BLOCK_BUTTON in 1) [ -f "$cache_report" ] || update notify-send -t 60000 "Seismic Activity" "$(cat "$cache_report")" ;; 2) update ;; 3) notify-send -t 60000 "Recent Earthquakes" "$(list_recent 8)" ;; 4) show_map ;; 5) notify-send -t 60000 "Seismic Help" "L-click: Report | M-click: Update | R-click: List | Scroll: Map" ;; 6) setsid -f "$TERMINAL" -e "$EDITOR" "$0" ;; esac