forked from matryer/xbar-plugins
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request matryer#1498 from CartoonChess/covid-19-today
Add covid-19_today.15m.sh
- Loading branch information
Showing
1 changed file
with
261 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,261 @@ | ||
#!/bin/bash | ||
|
||
# <bitbar.title>COVID-19 Today</bitbar.title> | ||
# <bitbar.version>v1.0.0</bitbar.version> | ||
# <bitbar.author>CartoonChess</bitbar.author> | ||
# <bitbar.author.github>cartoonchess</bitbar.author.github> | ||
# <bitbar.desc>Displays changes in daily and average COVID-19 cases for a given country.</bitbar.desc> | ||
# <bitbar.image>https://user-images.githubusercontent.com/43363630/93694795-da7d0700-fb4a-11ea-875b-02f29152e929.png</bitbar.image> | ||
# <bitbar.dependencies>bash,jq</bitbar.dependencies> | ||
# <bitbar.abouturl>https://github.com/cartoonchess/bitbar-covid-19-today</bitbar.abouturl> | ||
|
||
# ==============================CONFIGURATION================================ | ||
# Set these variables to configure the output to your liking. | ||
# The country must be a two- or three-letter country code. | ||
COUNTRY="kr" | ||
SHOW_CASES_TODAY_BESIDE_ICON=true | ||
# =========================================================================== | ||
|
||
|
||
|
||
# ==============================DEPENDENCIES================================= | ||
# This script requires jq for manipulating JSON data. | ||
# Requires: https://stedolan.github.io/jq/ | ||
# Install via brew: `brew install jq` | ||
# =========================================================================== | ||
|
||
# ===============================DATA SOURCE================================= | ||
# This script curls JSON data from disease.sh, the Open Disease API: | ||
# https://disease.sh/ | ||
# GitHub: https://github.com/disease-sh/api | ||
# =========================================================================== | ||
|
||
# ================================PRIOR ART================================== | ||
# This script is a modified version of: | ||
# covid-bitbar | ||
# https://github.com/wilsongoode/covid-bitbar | ||
# by Wilson Good | ||
# Check there for a version with detailed stats for the US. | ||
# Many thanks! | ||
# =========================================================================== | ||
|
||
|
||
|
||
# Setting my Bitbar path to include /usr/local/bin. Systems may vary | ||
# jq fails without this | ||
PATH=/usr/local/bin:${PATH} | ||
export PATH | ||
LANG=en_US.UTF-8 # needed in BitBar env for awk to format numbers | ||
export LANG | ||
|
||
|
||
|
||
# Test for jq | ||
|
||
JSON_PARSER="jq" | ||
if [ ! $(command -v $JSON_PARSER) ]; then | ||
echo "⚠" | ||
echo "---" | ||
echo "$JSON_PARSER Not Installed" | ||
echo "Install ${JSON_PARSER}… | href=https://stedolan.github.io/${JSON_PARSER}/download/" | ||
echo "---" | ||
echo "Refresh | refresh=true" | ||
exit | ||
fi | ||
|
||
|
||
|
||
# Methods | ||
|
||
# Return the singular or plural form of a word based on some count | ||
# Usage: | ||
# COUNT=15 | ||
# echo "I have $COUNT $(plural $COUNT 'bee' 'bees')" | ||
# Output: I have 15 bees | ||
plural() { | ||
COUNT=$1 | ||
SINGULAR=$2 | ||
PLURAL=$3 | ||
if [ $COUNT = 1 ]; then | ||
echo $SINGULAR | ||
else | ||
echo $PLURAL | ||
fi | ||
} | ||
|
||
# Return number with comma as thousands place separator | ||
# Usage: | ||
# BIG_NUM=1500 | ||
# echo "I have $(commas $BIG_NUM) bees" | ||
# Output: I have 1,500 bees | ||
commas() { | ||
echo $(awk 'BEGIN{printf "%\047d\n", '$1'}') | ||
} | ||
|
||
|
||
|
||
# Get the three-letter country code to link to a detailed graph | ||
|
||
COUNTRY_DATA=$(curl -s https://disease.sh/v3/covid-19/countries/$COUNTRY) | ||
|
||
# Maybe the server is down? | ||
if [ -z "$COUNTRY_DATA" ]; then | ||
echo "⚠" | ||
echo "---" | ||
echo "No Information" | ||
echo "Refresh | refresh=true" | ||
exit | ||
fi | ||
|
||
COUNTRY_CODE=$(echo $COUNTRY_DATA | | ||
jq '.countryInfo.iso3' | | ||
sed -E 's/"//g' | ||
) | ||
|
||
# If there's no country code, there's a problem with the data | ||
# jq returns a literal string "null", NOT a null value | ||
if [ $COUNTRY_CODE = "null" ]; then | ||
echo "⚠" | ||
echo "---" | ||
echo "Invalid Country Code" | ||
echo "Use a two- or three-letter code in the script" | ||
echo "Open Plugin Folder… | href=file://${0%/*}/" | ||
echo "---" | ||
echo "Refresh | refresh=true" | ||
exit | ||
fi | ||
|
||
|
||
|
||
# Fetch various numbers | ||
# Somehow this data seems more reliable than the data above. | ||
# Namely, it often reports zero new cases when that simply isn't true. | ||
|
||
HISTORICAL_DATA=$(curl -s https://disease.sh/v3/covid-19/historical/$COUNTRY\?lastdays=3) | ||
COUNTRY_NAME=$(echo $HISTORICAL_DATA | | ||
jq '.country' | | ||
# Remove quotation marks | ||
sed -E 's/"//g' | ||
) | ||
|
||
CASES_TODAY=$(echo $HISTORICAL_DATA | | ||
jq '[.timeline.cases[]] | sort | .[-1] - .[-2]' | ||
) | ||
|
||
CASES_YESTERDAY=$(echo $HISTORICAL_DATA | | ||
jq '[.timeline.cases[]] | sort | .[-2] - .[-3]' | ||
) | ||
|
||
TOTAL_CASES=$( | ||
echo $HISTORICAL_DATA | | ||
jq '[.timeline.cases[]] | sort | .[-1]' | ||
) | ||
|
||
|
||
|
||
# Calculate daily stats | ||
|
||
TODAY=$(date +%s) | ||
# Data begins at 2020-01-22 | ||
# Mac-specific formatting; Linux would require a change | ||
DAY_ONE=$(date -jf "%Y-%m-%d" "2020-01-22" +%s) | ||
TOTAL_DAYS=$((($TODAY-$DAY_ONE)/(3600*24))) | ||
DAILY_AVERAGE=$(($TOTAL_CASES/$TOTAL_DAYS)) | ||
|
||
TODAY_VS_YESTERDAY=$(($CASES_TODAY-$CASES_YESTERDAY)) | ||
TODAY_VS_AVERAGE=$(($CASES_TODAY-$DAILY_AVERAGE)) | ||
|
||
|
||
|
||
# Determine differences and format strings | ||
|
||
# Absolute value of difference between new cases today and yesterday | ||
if [ $TODAY_VS_YESTERDAY = 0 ]; then | ||
DAILY_DIFFERENCE="▶ No more" # — | ||
elif [ $TODAY_VS_YESTERDAY -lt 0 ]; then | ||
DAILY_DIFFERENCE=$((-$TODAY_VS_YESTERDAY)) | ||
# awk prints numbers with comma as thousands place separators | ||
DAILY_DIFFERENCE=$(commas $DAILY_DIFFERENCE) | ||
DAILY_DIFFERENCE="▼ $DAILY_DIFFERENCE fewer" | ||
else | ||
DAILY_DIFFERENCE=$(commas $TODAY_VS_YESTERDAY) | ||
DAILY_DIFFERENCE="▲ $DAILY_DIFFERENCE more" | ||
fi | ||
|
||
# Absolute value of difference between total cases today and daily average | ||
if [ $TODAY_VS_AVERAGE = 0 ]; then | ||
AVERAGE_DIFFERENCE="⦵ No more" # —⃝ | ||
elif [ $TODAY_VS_AVERAGE -lt 0 ]; then | ||
AVERAGE_DIFFERENCE=$((-$TODAY_VS_AVERAGE)) | ||
AVERAGE_DIFFERENCE=$(commas $AVERAGE_DIFFERENCE) | ||
AVERAGE_DIFFERENCE="—̥ $AVERAGE_DIFFERENCE fewer" # ⏁—̥⃝ | ||
else | ||
AVERAGE_DIFFERENCE=$(commas $TODAY_VS_AVERAGE) | ||
AVERAGE_DIFFERENCE="—̊ $AVERAGE_DIFFERENCE more" # ⏂—̊⃝ | ||
fi | ||
|
||
|
||
|
||
# Show menu bar item | ||
# TODO: What about "break even" icons?? | ||
|
||
# ⤉⤈⤒⤓ ▼̅▼̲▲̅▲̲ ⤉⃝⤈⃝⤒⃝⤓⃝ ▼̅⃝▼̲⃝▲̅⃝▲̲⃝ | ||
if [ $TODAY_VS_YESTERDAY = 0 ]; then | ||
if [ $TODAY_VS_AVERAGE = 0 ]; then | ||
ICON="⦵" | ||
elif [ $TODAY_VS_AVERAGE -lt 0 ]; then | ||
ICON="—̥" | ||
else | ||
ICON="—̊" | ||
fi | ||
elif [ $TODAY_VS_YESTERDAY -lt 0 ]; then | ||
if [ $TODAY_VS_AVERAGE = 0 ]; then | ||
# This and its upward equivalent render without strikethrough without other text | ||
# i.e. If not showing daily count, only the triangle appears | ||
ICON="▽̶" | ||
elif [ $TODAY_VS_AVERAGE -lt 0 ]; then | ||
ICON="⤈" | ||
else | ||
ICON="⤓" | ||
fi | ||
else | ||
if [ $TODAY_VS_AVERAGE = 0 ]; then | ||
ICON="△̶" | ||
elif [ $TODAY_VS_AVERAGE -lt 0 ]; then | ||
ICON="⤒" | ||
else | ||
ICON="⤉" | ||
fi | ||
fi | ||
|
||
CASES_TODAY_FORMATTED=$(commas $CASES_TODAY) | ||
if [ $SHOW_CASES_TODAY_BESIDE_ICON = true ]; then | ||
ICON="$ICON $CASES_TODAY_FORMATTED" | ||
fi | ||
|
||
echo $ICON | ||
echo "---" | ||
|
||
|
||
|
||
# Show dropdown details | ||
|
||
# Total new cases today | ||
# Add "s" for plural, if plural | ||
echo "$CASES_TODAY_FORMATTED new $(plural $CASES_TODAY 'case' 'cases') today in $COUNTRY_NAME | href=https://ourworldindata.org/coronavirus-data-explorer?interval=daily&country=$COUNTRY_CODE" | ||
|
||
echo $DAILY_DIFFERENCE" new $(plural $TODAY_VS_YESTERDAY 'case' 'cases') than yesterday" | ||
echo $AVERAGE_DIFFERENCE" daily $(plural $TODAY_VS_AVERAGE 'case' 'cases') than average" | ||
|
||
|
||
|
||
# Options | ||
|
||
echo "---" | ||
echo "Update | refresh=true" | ||
echo "Settings" | ||
echo "-- Edit the plugin directly to:" | ||
echo "-- • Change the country" | ||
echo "-- • Show or hide daily cases beside icon" | ||
echo "-----" | ||
echo "-- Open Plugin Folder… | href=file://${0%/*}/" |