#!/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 } command -v curl >/dev/null 2>&1 || { echo >&2 "We require curl for this script to run, but it's not installed. Aborting." exit 1 } # global config options DRY_RUN=0 # translation version VERSION="kjv" # scripture TODAY_S_SCRIPTURE='' # check if we have options while :; do case $1 in --dry) 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 ;; esac shift 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)" #███████████████████████████████████████████████████████████████ SCRIPTURE ███ SORTED="$DIR/SCRIPTURE" USED="$DIR/SCRIPTURE_USED" TMP="$DIR/.TMP" SCRIPTURE_DIR="$DIR/../scripture/${VERSION}/${TODAY_FOLDER}" VERSION_DIR="$DIR/../scripture/${VERSION}" #█████████████████████████████████████████████████ 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 a random number between 1 and 1900 RANDOM_LINE=$((RANDOM % 1900 + 1)) # get the line corresponding to the random number TODAY_S_SCRIPTURE=$(sed -n "${RANDOM_LINE}{p;q}" "${TMP}") # only if not a test if (("$DRY_RUN" == 0)); then # remove the verse sed -i -e "${RANDOM_LINE},${RANDOM_LINE}d" "${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 #█████████████████████████████████████████████ SHOW WHAT SCRIPTURE SELECTED ███ if (("$DRY_RUN" == 1)); then echo "selected: $TODAY_S_SCRIPTURE" echo "version: $VERSION" fi #███████████████████████████████████████████████████████ GET SCRIPTURE TEXT ███ # Get the verses from the getBible API 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 book number BOOK_NUMBER=$(echo "$TODAY_S_SCRIPTURE" | cut -d' ' -f1) # get the list of books from the API to get the book number BOOKS=$(curl -s "https://api.getbible.net/v2/${VERSION}/books.json") BOOK_NAME=$(echo "$BOOKS" | jq -r ".[] | select(.nr == ${BOOK_NUMBER}) | .name") # get the chapter CHAPTER=$(echo "$TODAY_S_SCRIPTURE" | cut -d' ' -f2 | cut -d':' -f1) # get the verses VERSES=$(echo "$TODAY_S_SCRIPTURE" | cut -d' ' -f2 | cut -d':' -f2) # Set the passage name NAME="${BOOK_NAME} ${CHAPTER}:${VERSES}" #███████████████████████████████████████████████████████████ GET BIBLE LINK ███ # We set the GetBible link for this verse GETBIBLE_LINK="https://getbible.net/${VERSION}/${BOOK_NAME}/${CHAPTER}/${VERSES}" #████████████████████████████████████████████ SET TODAY'S SCRIPTURE IN HTML ███ 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 book "${BOOK_NAME}" \ --arg chapter "${CHAPTER}" \ --arg verse "${VERSES}" \ --arg date "${TODAY}" \ --arg telegram "daily_scripture" \ --arg getbible "${GETBIBLE_LINK}" \ --arg source "https://git.vdm.dev/christian/daily-scripture" ' { name: $name, scripture: $scripture, version: $version, book: $book, chapter: $chapter, verse: $verse, date: $date, telegram: $telegram, getbible: $getbible, source: $source } ' )" #██████████████████████████████████████████████ SET TODAY'S SCRIPTURE IN TG ███ TG="${NAME} ${TODAY_S_SCRIPTURE_TEXT//$'\n'/ } ${TODAY}" #████████████████████████████████████████ SET TODAY'S SCRIPTURE IN MARKDOWN ███ MARKDOWN="**${NAME}** ${TODAY_S_SCRIPTURE_TEXT//$'\n'/ } [${TODAY}](${GETBIBLE_LINK})" #███████████████████████████████████████████████████████████████ SET FILES ███ # check test behaviour 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 # 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 README scripture echo "${HTML}" >"${VERSION_DIR}/README.html" jq <<<"$JSON" -S . >"${VERSION_DIR}/README.json" echo "${TG}" >"${VERSION_DIR}/README.tg" echo "${MARKDOWN}" >"${VERSION_DIR}/README.md" echo "${TODAY_S_SCRIPTURE}" >"${VERSION_DIR}/README.today" # 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 exit 0