#!/bin/bash source .env download_meter=resources/download_meter.png upload_meter=resources/upload_meter.png needle=resources/needle.png font=resources/CODE_Bold.otf while true; do date=$(date "+%Y%m%d_%H%M%S") camera_image=data/image_$date.png satellite_image=data/satellite_image_$date.png speedtest_ookla=data/speedtest_ookla_$date.json speedtest_libre=data/speedtest_libre_$date.json speedtest_fast=data/speedtest_fast_$date.json speedtest_download_meter=data/speedtest_download_meter_$date.png speedtest_upload_meter=data/speedtest_upload_meter_$date.png speedtest_meter_image=data/speedtest_meter_image_$date.png weather_file=data/weather_$date.json edited_image=data/edited_image_$date.png tg_log=data/tg_log_$date.json ################################################################################# latency(){ echo $(ping -c 1 $1) | \ grep 'time=' | \ awk -F'time=' '{print $2}' | \ awk '{print $1}' } ################################################################################# ################################################################################# echo Grabbing Camara Image # Capture a frame from RTSP stream mpv $RTSP_URL --frames=1 --vo=image --ovc=png --o=$camera_image >> /dev/null echo Camera Image grabbed ################################################################################# ################################################################################# echo Grabbing Satellite Image # scrap html, get image link and download it. curl -s $(curl -s "https://www.meteorology.gov.mv/" | \ grep -o 'https://mobile.codeworks.mv/uploads/Satellite/[^"]*' | \ tail -n 1) -o $satellite_image echo Satellite Image grabbed ################################################################################# ################################################################################# echo Doing speedtest by Ookla # Run speedtest and output to a file speedtest --json | tee $speedtest_ookla # Extract information from the speedtest output # Parsing JSON data ookla_server=$(jq -r '.server.sponsor' "$speedtest_ookla") ookla_city=$(jq -r '.server.name' "$speedtest_ookla") ookla_country=$(jq -r '.server.country' "$speedtest_ookla") ookla_ping=$(jq '.ping' "$speedtest_ookla") ookla_download=$(jq '.download' "$speedtest_ookla") ookla_upload=$(jq '.upload' "$speedtest_ookla") ookla_bytes_received=$(jq '.bytes_received' "$speedtest_ookla") ookla_bytes_sent=$(jq '.bytes_sent' "$speedtest_ookla") # replacing null values [ -z "$ookla_ping" ] && ookla_ping="-" [ -z "$ookla_download" ] && ookla_download=0 [ -z "$ookla_upload" ] && ookla_upload=0 [ -z "$ookla_bytes_received" ] && ookla_bytes_received=0 [ -z "$ookla_bytes_sent" ] && ookla_bytes_sent=0 # Converting to human readable units ookla_download_mbps=$(echo "scale=2; $ookla_download / 1000000" | bc) ookla_upload_mbps=$(echo "scale=2; $ookla_upload / 1000000" | bc) ookla_bytes_received_mb=$(echo "scale=2; $ookla_bytes_received / 1048576" | bc) ookla_bytes_sent_mb=$(echo "scale=2; $ookla_bytes_sent / 1048576" | bc) ookla_total=$(echo $ookla_bytes_sent_mb+$ookla_bytes_received_mb | bc) echo Starting LibreSpeed librespeed-cli --json | tee $speedtest_libre # Parsing JSON data libre_bytes_sent=$(jq '.[0].bytes_sent' "$speedtest_libre") libre_bytes_received=$(jq '.[0].bytes_received' "$speedtest_libre") libre_ping=$(jq '.[0].ping' "$speedtest_libre") libre_upload=$(jq '.[0].upload' "$speedtest_libre") libre_download=$(jq '.[0].download' "$speedtest_libre") libre_server_name=$(jq -r '.[0].server.name' "$speedtest_libre") # replacing null values [ "$libre_ping" = "null" ] || [ -z "$libre_ping" ] && libre_ping="-" [ "$libre_download" = "null" ] || [ -z "$libre_download" ] && libre_download=0 [ "$libre_upload" = "null" ] || [ -z "$libre_upload" ] && libre_upload=0 [ "$libre_bytes_received" = "null" ] || [ -z "$libre_bytes_received" ] && libre_bytes_received=0 [ "$libre_bytes_sent" = "null" ] || [ -z "$libre_bytes_sent" ] && libre_bytes_sent=0 # Converting to human readable units and replacing null values with 0 libre_bytes_sent_mb=$(echo "scale=2; $libre_bytes_sent / 1048576" | bc) libre_bytes_received_mb=$(echo "scale=2; $libre_bytes_received / 1048576" | bc) libre_total=$(echo $libre_bytes_sent_mb+$libre_bytes_received_mb | bc) echo Starting Fast fast --upload --json | tee $speedtest_fast fast_download_speed=$(jq '.downloadSpeed' "$speedtest_fast") fast_upload_speed=$(jq '.uploadSpeed' "$speedtest_fast") fast_latency=$(jq '.latency' "$speedtest_fast") fast_downloaded=$(jq '.downloaded' "$speedtest_fast") fast_uploaded=$(jq '.uploaded' "$speedtest_fast") [ -z "$fast_latency" ] && fast_latency="-" [ -z "$fast_download_speed" ] && fast_download_speed=0 [ -z "$fast_upload_speed" ] && fast_upload_speed=0 [ -z "$fast_downloaded" ] && fast_downloaded=0 [ -z "$fast_uploaded" ] && fast_uploaded=0 fast_total=$(echo $fast_downloaded+$fast_uploaded | bc) average_download=$(echo $ookla_download_mbps+$libre_download+$fast_download_speed/3 | bc) average_upload=$(echo $ookla_upload_mbps+$libre_upload+$fast_upload_speed/3| bc) highest_download=$(echo $ookla_download_mbps $libre_download $fast_download_speed | tr ' ' '\n' | sort -nr | head -n1) highest_upload=$(echo $ookla_upload_mbps $libre_upload $fast_upload_speed | tr ' ' '\n' | sort -nr | head -n1) total_wasted=$(echo $ookla_total+$libre_total+$fast_total | bc) echo Speedtests complete ################################################################################# ################################################################################# valorant_ping=$(latency dynamodb.ap-southeast-1.amazonaws.com) cfdns_ping=$(latency 1.1.1.1) googledns_ping=$(latency 8.8.8.8) [ -z "$valorant_ping" ] && valorant_ping="-" [ -z "$cfdns_ping" ] && cfdns_ping="-" [ -z "$googledns_ping" ] && googledns_ping="-" ################################################################################# ################################################################################# echo Checking weather # Make the API request curl -s "https://api.open-meteo.com/v1/forecast?latitude=${LATITUDE}&longitude=${LONGITUDE}¤t_weather=true" | tee $weather_file # Extract Weather Condition and day or not weather_condition=$(jq '.current_weather.weathercode' "$weather_file") is_day=$(jq '.current_weather.is_day' "$weather_file") case $weather_condition in 0) current_weather="$([ "$is_day" = "1" ] && echo "☀️" || echo "🌙") Clear Sky";; 1) current_weather="$([ "$is_day" = "1" ] && echo "☀️" || echo "🌙") Mainly Clear";; 2) current_weather="⛅ Partly Cloudy" ;; 3) current_weather="☁️ Overcast" ;; 45) current_weather="🌫️ Fog" ;; 48) current_weather="🌫️🌬️ Depositing Rime Fog" ;; 51) current_weather="🌦️💧 Light Drizzle" ;; 53) current_weather="🌦️💧 Moderate Drizzle" ;; 55) current_weather="🌦️💧 Dense Drizzle" ;; 56) current_weather="🌦️❄️ Light Freezing Drizzle" ;; 57) current_weather="🌦️❄️ Dense Freezing Drizzle" ;; 61) current_weather="🌧️ Slight Rain" ;; 63) current_weather="🌧️ Moderate Rain" ;; 65) current_weather="🌧️ Heavy Rain" ;; 66) current_weather="🌧️❄️ Light Freezing Rain" ;; 67) current_weather="🌧️❄️ Heavy Freezing Rain" ;; 71) current_weather="🌨️ Slight Snowfall" ;; 73) current_weather="🌨️ Moderate Snowfall" ;; 75) current_weather="🌨️ Heavy Snowfall" ;; 77) current_weather="❄️ Snow Grains" ;; 80) current_weather="🌧️🚿 Slight Rain Showers" ;; 81) current_weather="🌧️🚿 Moderate Rain Showers" ;; 82) current_weather="🌧️🚿 Violent Rain Showers" ;; 85) current_weather="🌨️❄️ Slight Snow Showers" ;; 86) current_weather="🌨️❄️ Heavy Snow Showers" ;; 95) current_weather="⛈️ Slight Thunderstorm" ;; 96) current_weather="⛈️🌨️ Thunderstorm with Slight Hail" ;; 99) current_weather="⛈️🌨️ Thunderstorm with Heavy Hail" ;; *) current_weather="🌐 Weather Condition Not Recognized" ;; esac echo Weather checked ################################################################################# ################################################################################# download_angle=$(echo "scale=2; -118 + ($highest_download - 0) / ($MAX_DOWNLOAD_SPEED - 0) * (118 - -118)" | bc) upload_angle=$(echo "scale=2; -118 + ($highest_upload - 0) / ($MAX_UPLOAD_SPEED - 0) * (118 - -118)" | bc) convert $download_meter \ \( $needle -background none \ -rotate $download_angle \) \ -gravity center \ -compose over \ -composite \ -pointsize 41 \ -font $font \ -fill white \ -annotate +0+-15 $highest_download \ -annotate +120+85 $MAX_DOWNLOAD_SPEED \ $speedtest_download_meter convert $upload_meter \ \( $needle -background none \ -rotate $upload_angle \) \ -gravity center \ -compose over \ -composite \ -pointsize 41 \ -font $font \ -fill white \ -annotate +0+-15 $highest_upload \ -annotate +120+85 $MAX_UPLOAD_SPEED \ $speedtest_upload_meter convert $camera_image \ \( $speedtest_download_meter \ -resize $METER_SCALE% \ -gravity southwest \ -geometry +10+0 \) \ -composite \ \( $speedtest_upload_meter \ -resize $METER_SCALE% \ -gravity southwest \ -geometry +$UPLOAD_METER_LOCATION+0 \) \ -composite \ $speedtest_meter_image ################################################################################# ################################################################################# caption=" $current_weather 🔫 Valorant SEA ping: $valorant_ping ms 🌐 1.1.1.1 ping: $cfdns_ping ms 🌐 8.8.8.8 ping: $googledns_ping ms *Speedtest by Ookla*: 🌐 *Server*: $ookla_server, $ookla_city, $ookla_country 🏓 *Latency*: $ookla_ping ms ⬇️ *Download*: $ookla_download_mbps Mbit/s, Used: $ookla_bytes_received_mb MB ⬆️ *Upload*: $ookla_upload_mbps Mbit/s, Used: $ookla_bytes_sent_mb MB *LibreSpeed*: 🌐 *Server*: $libre_server_name 🏓 *Latency*: $libre_ping ms ⬇️ *Download*: $libre_download Mbit/s, Used: $libre_bytes_received_mb MB ⬆️ *Upload*: $libre_upload Mbit/s, Used $libre_bytes_sent_mb MB *Fast Powered by Netflix*: 🏓 *Latency*: $fast_latency ms ⬇️ *Download*: $fast_download_speed Mbit/s, Used: $fast_downloaded MB ⬆️ *Upload*: $fast_upload_speed Mbit/s, Used: $fast_uploaded MB Total data wasted: $total_wasted MB " ################################################################################# ################################################################################# echo Uploading to Telegram curl -X POST https://api.telegram.org/bot$TG_BOT_TOKEN/sendMediaGroup \ -F chat_id=$TG_CHATID \ -F media='[{"type": "photo", "media": "attach://photo1", "caption": "'"$caption"'", "parse_mode": "Markdown"}, {"type": "photo", "media": "attach://photo2"}]' \ -F photo1=@$speedtest_meter_image \ -F photo2=@$satellite_image | tee $tg_log ################################################################################# echo Ok done, Sleeping for $DELAY sleep $DELAY done