From 6019af792131171f22364d2fe2942ed1fed5106a Mon Sep 17 00:00:00 2001 From: Llewellyn van der Merwe Date: Tue, 4 Jan 2022 14:38:57 +0200 Subject: [PATCH] Adds json output. Adds persistent of scripture. --- src/today.sh | 205 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 161 insertions(+), 44 deletions(-) diff --git a/src/today.sh b/src/today.sh index cb9c9162..25c14d03 100755 --- a/src/today.sh +++ b/src/today.sh @@ -1,6 +1,10 @@ #!/bin/bash # Do some prep work +command -v jq >/dev/null 2>&1 || { + echo >&2 "We require jq for this script to run, but it's not installed. Aborting." + exit 1 +} command -v git >/dev/null 2>&1 || { echo >&2 "We require git for this script to run, but it's not installed. Aborting." exit 1 @@ -11,13 +15,49 @@ command -v curl >/dev/null 2>&1 || { } # global config options -DRYRUN=0 +DRY_RUN=0 +# translation version +VERSION="kjv" +# scripture +TODAY_S_SCRIPTURE='' # check if we have options while :; do case $1 in --dry) - DRYRUN=1 + DRY_RUN=1 + ;; + -s | --scripture) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + TODAY_S_SCRIPTURE=$2 + shift + else + echo >&2 '"--scripture" requires a non-empty option argument.' + exit 17 + fi + ;; + -s=?* | --scripture=?*) + TODAY_S_SCRIPTURE=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + -s= | --scripture=) # Handle the case of an empty --scripture= + echo >&2 '"--scripture=" requires a non-empty option argument.' + exit 17 + ;; + -v | --version) # Takes an option argument; ensure it has been specified. + if [ "$2" ]; then + VERSION=$2 + shift + else + echo >&2 '"--version" requires a non-empty option argument.' + exit 17 + fi + ;; + -v=?* | --version=?*) + VERSION=${1#*=} # Delete everything up to "=" and assign the remainder. + ;; + -v= | --version=) # Handle the case of an empty --version= + echo >&2 '"--version=" requires a non-empty option argument.' + exit 17 ;; *) # Default case: No more options, so break out of the loop. break ;; @@ -28,6 +68,7 @@ done #██████████████████████████████████████████████████████████████ DATE TODAY ███ # must set the time to Namibian :) TODAY=$(TZ="Africa/Windhoek" date '+%A %d-%B, %Y') +TODAY_FOLDER=$(TZ="Africa/Windhoek" date '+%D') #█████████████████████████████████████████████████████████████ SCRIPT PATH ███ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -36,78 +77,154 @@ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SORTED="$DIR/SCRIPTURE" USED="$DIR/SCRIPTURE_USED" TMP="$DIR/.TMP" +SCRIPTURE_DIR="$DIR/../scripture/${VERSION}/${TODAY_FOLDER}" -#██████████████████████████████████████████████████████████████████ RANDOM ███ -# set a random temp file -sort -R -k1 -b "${SORTED}" >"${TMP}" -# get the first line -VERSE=$(head -n 1 "${TMP}") -# test behaviour -if (("$DRYRUN" == 1)); then - echo "selected: $VERSE" -else - # remove the verse - sed -i -e '1,1d' "${TMP}" - # add to used verses - [ -f "${USED}" ] && echo "$VERSE" >>"${USED}" || echo "$VERSE" >"${USED}" -fi - -#█████████████████████████████████████████████████████ SIX MONTH RETENTION ███ -# check test behaviour -if (("$DRYRUN" == 0)); then - # count the number of verse in used file - LINES_NR=$(wc -l <"${USED}") - if [ "$LINES_NR" -gt 182 ]; then +#█████████████████████████████████████████████████ GET SCRIPTURE FOR TODAY ███ +# only load if not already given +if [ -z "${TODAY_S_SCRIPTURE}" ]; then + #████████████████████████████████████████████████████████████████ RANDOM ███ + # set a random temp file + sort -R -k1 -b "${SORTED}" >"${TMP}" # get the first line - VERSE_BACK=$(head -n 1 "${USED}") - # remove the verse - sed -i -e '1,1d' "${USED}" - # add add back to the pile - echo "$VERSE_BACK" >>"${TMP}" + TODAY_S_SCRIPTURE=$(head -n 1 "${TMP}") + # only if not a test + if (("$DRY_RUN" == 0)); then + # remove the verse + sed -i -e '1,1d' "${TMP}" + # add to used verses + [ -f "${USED}" ] && echo "$TODAY_S_SCRIPTURE" >>"${USED}" || echo "$TODAY_S_SCRIPTURE" >"${USED}" + fi + + #███████████████████████████████████████████████████ SIX MONTH RETENTION ███ + # check test behaviour + if (("$DRY_RUN" == 0)); then + # count the number of verse in used file + LINES_NR=$(wc -l <"${USED}") + if [ "$LINES_NR" -gt 182 ]; then + # get the first line + VERSE_BACK=$(head -n 1 "${USED}") + # remove the verse + sed -i -e '1,1d' "${USED}" + # add add back to the pile + echo "$VERSE_BACK" >>"${TMP}" + fi fi + + #█████████████████████████████████████████████████████████████ SORT BACK ███ + # check test behaviour + if (("$DRY_RUN" == 0)); then + # store back for next time + sort -h -b -k1 "${TMP}" >"${SORTED}" + fi + # remove the temp file + rm -f "${TMP}" fi -#███████████████████████████████████████████████████████████████ SORT BACK ███ -# check test behaviour -if (("$DRYRUN" == 0)); then - # store back for next time - sort -h -b -k1 "${TMP}" >"${SORTED}" +#█████████████████████████████████████████████ SHOW WHAT SCRIPTURE SELECTED ███ +if (("$DRY_RUN" == 1)); then + echo "selected: $TODAY_S_SCRIPTURE" + echo "version: $VERSION" fi -# remove the temp file -rm -f "${TMP}" #███████████████████████████████████████████████████████ GET SCRIPTURE TEXT ███ # Get the verses from the getBible API -VERSES=$(bash <(curl -s https://raw.githubusercontent.com/getbible/getverse/master/src/chapter.sh) "${VERSE}") +TODAY_S_SCRIPTURE_TEXT=$(bash <(curl -s https://raw.githubusercontent.com/getbible/getverse/master/src/chapter.sh) -s="\"${TODAY_S_SCRIPTURE}\"" -v="${VERSION}" ) #███████████████████████████████████████████████████████ GET SCRIPTURE NAME ███ # Get the verses name from the getBible API -NAME=$(bash <(curl -s https://raw.githubusercontent.com/getbible/getverse/master/src/name.sh) "${VERSE}") +NAME=$(bash <(curl -s https://raw.githubusercontent.com/getbible/getverse/master/src/name.sh) -s="\"${TODAY_S_SCRIPTURE}\"" -v="${VERSION}" ) #████████████████████████████████████████████ SET TODAY'S SCRIPTURE IN HTML ███ -HTML="${NAME} -${VERSES//$'\n'/ } +HTML="${NAME}
+${TODAY_S_SCRIPTURE_TEXT//$'\n'/ }

+${TODAY}" + +#████████████████████████████████████████████ SET TODAY'S SCRIPTURE IN JSON ███ +# convert text to json +IFS=$'\n'; TODAY_S_SCRIPTURE_ARRAY=( $TODAY_S_SCRIPTURE_TEXT ) +TODAY_S_SCRIPTURE_JSON='[]' +for line in "${TODAY_S_SCRIPTURE_ARRAY[@]}"; do + # shellcheck disable=SC2001 + text_nr=$(echo "${line}" | sed 's@^[^0-9]*\([0-9]\+\).*@\1@') + text="${line#$text_nr }" + TODAY_S_SCRIPTURE_JSON="$( + jq <<<"$TODAY_S_SCRIPTURE_JSON" -c \ + --arg nr "$text_nr" \ + --arg text "$text" ' + . += [{ + nr: $nr, + text: $text + }] + ' + )" +done +# build the json object +JSON='{}'; JSON="$( + jq <<<"$JSON" -c \ + --arg name "${NAME}" \ + --argjson scripture "${TODAY_S_SCRIPTURE_JSON}" \ + --arg version "${VERSION}" \ + --arg date "${TODAY}" \ + --arg telegram "daily_scripture" \ + --arg source "https://github.com/trueChristian/daily-scripture" ' + { + name: $name, + scripture: $scripture, + version: $version, + date: $date, + telegram: $telegram, + source: $source + } + ' + )" + +#██████████████████████████████████████████████ SET TODAY'S SCRIPTURE IN TG ███ +TG="${NAME} +${TODAY_S_SCRIPTURE_TEXT//$'\n'/ } ${TODAY}" #████████████████████████████████████████ SET TODAY'S SCRIPTURE IN MARKDOWN ███ MARKDOWN="**${NAME}** -${VERSES//$'\n'/ } +${TODAY_S_SCRIPTURE_TEXT//$'\n'/ } [${TODAY}](https://t.me/s/daily_scripture)" #███████████████████████████████████████████████████████████████ SET FILES ███ # check test behaviour -if (("$DRYRUN" == 1)); then +if (("$DRY_RUN" == 1)); then + echo "====================================================" + echo "selected: ${TODAY_S_SCRIPTURE}" + echo "version: ${VERSION}" + echo "====================================================" echo "${HTML}" echo "----------------------------------------------------" + jq <<<"$JSON" -S . + echo "----------------------------------------------------" + echo "${TG}" + echo "----------------------------------------------------" echo "${MARKDOWN}" else - echo "${HTML}" >README.html - echo "${MARKDOWN}" >README.md - + # update the default if this is kjv + if [ "${VERSION}" = 'kjv' ]; then + echo "${HTML}" >README.html + jq <<<"$JSON" -S . >README.json + echo "${TG}" >README.tg + echo "${MARKDOWN}" >README.md + echo "${TODAY_S_SCRIPTURE}" >README.today + fi + # make sure the folders exist + mkdir -p "${SCRIPTURE_DIR}" + # set today's verse to persistent state + echo "${HTML}" >"${SCRIPTURE_DIR}/scripture.html" + jq <<<"$JSON" -S . >"${SCRIPTURE_DIR}/scripture.json" + echo "${TG}" >"${SCRIPTURE_DIR}/scripture.tg" + echo "${MARKDOWN}" >"${SCRIPTURE_DIR}/scripture.md" + echo "${TODAY_S_SCRIPTURE}" >"${SCRIPTURE_DIR}/scripture.today" + # make sure to add new files and folders + git add . git commit -am"${TODAY}" git push fi