#!/bin/bash ###### configuration ##### # stations to display STATION_ID[0]="18" STATION_ID[1]="202" LOGO_L[ 0]="\\t\\t████████████████████████████████████████████████" LOGO_L[ 1]="\\t\\t██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██" LOGO_L[ 2]="\\t\\t██▒▒████████████████████████████████████████▒▒██" LOGO_L[ 3]="\\t\\t██▒▒██████████▒▒██▒▒████████████▒▒██▒▒██████▒▒██" LOGO_L[ 4]="\\t\\t██▒▒████▒▒▒▒▒▒████▒▒██████▒▒▒▒▒▒████▒▒██████▒▒██" LOGO_L[ 5]="\\t\\t██▒▒████▒▒████████████▒▒██▒▒████████████▒▒██▒▒██" LOGO_L[ 6]="\\t\\t██▒▒████▒▒████████▒▒██▒▒██▒▒████████▒▒██▒▒██▒▒██" LOGO_L[ 7]="\\t\\t██▒▒██████████▒▒██▒▒██▒▒████████▒▒██▒▒██▒▒██▒▒██" LOGO_L[ 8]="\\t\\t██▒▒██▒▒▒▒▒▒▒▒██▒▒██▒▒██▒▒▒▒▒▒▒▒██▒▒██▒▒████▒▒██" LOGO_L[ 9]="\\t\\t██▒▒████████████████████████████████████████▒▒██" LOGO_L[10]="\\t\\t██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██" LOGO_L[11]="\\t\\t████████████████████████████████████████████████" LOGO_L[12]="\\t\\t""\e[1m"" C H A O S C H E M N I T Z . D E ""\e[0m""\\n" LOGO_S[0]="\\t\\t█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ " LOGO_S[1]="\\t\\t█ █████▀█▀██████▀█▀███ █ " LOGO_S[2]="\\t\\t█ ██ ▄▄██▄█▀█ ▄▄██▄█▀█ █ " LOGO_S[3]="\\t\\t█ ██▄██▀█ █ █▄██▀█ █ █ █ " LOGO_S[4]="\\t\\t█ █▄▄▄▄█▄█▄█▄▄▄▄█▄█▄██ █ " LOGO_S[5]="\\t\\t█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ " PROPAGANDA=" \t\t┌──────────────────────────────────────────────────────────┐ \t\t│""\e[7m"" Der Chaostreff Chemnitz (ChCh) ist ein lockeres Treffen ""\e[27m""│ \t\t│""\e[7m"" von technikbegeisterten und kreativen Menschen. Als ""\e[27m""│ \t\t│""\e[7m"" Chaostreff fühlen wir uns dem Chaos Computer Club (CCC) ""\e[27m""│ \t\t│""\e[7m"" nahe. ""\e[27m""│ \t\t│""\e[7m"" ""\e[27m""│ \t\t│""\e[7m"" Besucht uns online oder Montags im zweiten Stock. ""\e[27m""│ \t\t└──────────────────────────────────────────────────────────┘ \t\t""\e[1m"" C H A O S C H E M N I T Z . D E ""\e[0m" ########################## if [ -z "$(which jq)" ]; then printf "\\n\\n\\n\\tPackage \"jq\" required!" exit 1 fi trap do_exit INT do_exit() { tput cvvis # unhide cursor exit 0 } # hide cursor tput civis # ohne dieses IFS trennt BASH an Space und erstellt damit zu viele Array-Felder IFS=" " append_five_line_symbol() { local -n LINES=$1 case $2 in "0") LINES[0]+=" █████" LINES[1]+=" █ █" LINES[2]+=" █ █" LINES[3]+=" █ █" LINES[4]+=" █ █" LINES[5]+=" █████" ;; "1") LINES[0]+=" █" LINES[1]+=" █" LINES[2]+=" █" LINES[3]+=" █" LINES[4]+=" █" LINES[5]+=" █" ;; "2") LINES[0]+=" █████" LINES[1]+=" █" LINES[2]+=" ▄▄▄▄█" LINES[3]+=" █▀▀▀▀" LINES[4]+=" █ " LINES[5]+=" █████" ;; "3") LINES[0]+=" █████" LINES[1]+=" █" LINES[2]+=" ▄▄▄▄█" LINES[3]+=" ▀▀▀▀█" LINES[4]+=" █" LINES[5]+=" █████" ;; "4") LINES[0]+=" █ █" LINES[1]+=" █ █" LINES[2]+=" █▄▄▄█" LINES[3]+=" ▀▀▀▀█" LINES[4]+=" █" LINES[5]+=" █" ;; "5") LINES[0]+=" █████" LINES[1]+=" █ " LINES[2]+=" █▄▄▄▄" LINES[3]+=" ▀▀▀▀█" LINES[4]+=" █" LINES[5]+=" █████" ;; "6") LINES[0]+=" █████" LINES[1]+=" █ " LINES[2]+=" █▄▄▄▄" LINES[3]+=" █▀▀▀█" LINES[4]+=" █ █" LINES[5]+=" █████" ;; "7") LINES[0]+=" █████" LINES[1]+=" █" LINES[2]+=" █" LINES[3]+=" █" LINES[4]+=" █" LINES[5]+=" █" ;; "8") LINES[0]+=" █████" LINES[1]+=" █ █" LINES[2]+=" █▄▄▄█" LINES[3]+=" █▀▀▀█" LINES[4]+=" █ █" LINES[5]+=" █████" ;; "9") LINES[0]+=" █████" LINES[1]+=" █ █" LINES[2]+=" █▄▄▄█" LINES[3]+=" ▀▀▀▀█" LINES[4]+=" █" LINES[5]+=" █████" ;; ":") LINES[0]+=" " LINES[1]+=" ███ " LINES[2]+=" ▀▀▀ " LINES[3]+=" ▄▄▄ " LINES[4]+=" ███ " LINES[5]+=" " ;; *) esac } get_cvag_station_name() { local -n _STATION_NAME=$1 local -n _STATION_ID=$2 COMPLETE_STATION_LIST="$(curl --connect-timeout 5 -s "http://www.cvag.de/eza/mis/stations?minLat=0&maxLat=100&minLon=0&maxLon=100")" [ -z "$(echo $COMPLETE_STATION_LIST | grep -oe "^{.*}$")" ] && return 1 for ((i=0; i<${#_STATION_ID[*]}; i++)); do case ${_STATION_ID[$i]} in ""|*[!0-9]*) _STATION_NAME[$i]=$(echo -n "$COMPLETE_STATION_LIST" | jq -r ".stations | .[] | select(.displayName | contains(${_STATION_ID[$i]})) | .number") ;; *) _STATION_NAME[$i]=$(echo -n "$COMPLETE_STATION_LIST" | jq -r ".stations | .[] | select(.number | contains(${_STATION_ID[$i]})) | .displayName") ;; esac done } SYSTEM_TIME_DELTA=0 STATION_SCHEDULE=() get_cvag_station_info() { local -n _STATION_STOPS=$2 local -n _STATION_NOW=$3 local -n _STATION_DESTINATIONS=$4 local -n _STATION_LINES=$5 local -n _STATION_ACTUAL_DEPARTURE=$6 local -n _THISDATE=$7 _ERROR=0 THIS_STATION_SCHEDULE="$(curl --connect-timeout 5 -s "http://www.cvag.de/eza/mis/stops/station/CAG-${STATION_ID[$1]}")" [ ! -z "$(echo "$THIS_STATION_SCHEDULE" | grep -oe "^{.*}$")" ] && STATION_SCHEDULE[$1]=$THIS_STATION_SCHEDULE || _ERROR=1 # return data from cache [ -z "$STATION_SCHEDULE[$1]" ] && _ERROR=2 # no data cached yet _STATION_STOPS=$(echo "${STATION_SCHEDULE[$1]}" | jq -r ".stops | .[]") _STATION_NOW=$(echo "${STATION_SCHEDULE[$1]}" | jq -r ".now") _STATION_DESTINATIONS=($(echo -n "$_STATION_STOPS" | jq -r ".destination")) _STATION_LINES=($(echo -n "$_STATION_STOPS" | jq -r ".line")) _STATION_ACTUAL_DEPARTURE=($(echo -n "$_STATION_STOPS" | jq -r ".actualDeparture")) [ ${#_STATION_NOW} -lt 1 ] && _STATION_NOW="0" _REALSTATION_NOW=$(( "$_STATION_NOW" / 1000)) [ $_ERROR -eq 0 ] && SYSTEM_TIME_DELTA=$(($_REALSTATION_NOW-$(date +%s))) || _STATION_NOW=$((($(date +%s)+$SYSTEM_TIME_DELTA)*1000)) _THISDATE="$(date --date="@$_REALSTATION_NOW" +"%d.%m.%Y %T")" return $_ERROR } draw_logo_time() { local -n _MYOUTPUT=$1 local TIME=$2 LOGO_TIME=("${LOGO_S[@]}") for((k=1; k<6; k++)); do append_five_line_symbol LOGO_TIME "$(date --date="@$TIME" +"%H:%M" | cut -b"$k")" done _MYOUTPUT="\\n\\n${LOGO_TIME[0]}\\n${LOGO_TIME[1]}\\n${LOGO_TIME[2]}\\n${LOGO_TIME[3]}\\n${LOGO_TIME[4]}\\n${LOGO_TIME[5]}" } draw_large_logo() { clear echo -e "\n\n\n\n\n" for ((j=0; j<="${#LOGO_L[*]}"; j++)); do echo -e "${LOGO_L[$j]}" done } print_chch_propaganda() { clear draw_logo_time LOGO_AND_TIME $(($(date +%s)+$SYSTEM_TIME_DELTA)) echo -e "$LOGO_AND_TIME" echo -e "$PROPAGANDA" sleep 10 } LOGO_LINES_POSITION=0 STATION_NAME=() print_cvag_schedule() { [ ${#STATION_NAME[*]} -eq 0 ] && get_cvag_station_name STATION_NAME STATION_ID if [ ${#STATION_NAME[*]} -eq 0 ]; then clear echo -e "\\n\\n\\n\\tService unavailable!" else MYOUTPUT=() MYOUTPUT[0]="\\n " for ((j=0; j<="${#STATION_ID[*]}"; j++)); do if [ ! "$j" -eq "$LOGO_LINES_POSITION" ]; then [ "$j" -gt "$LOGO_LINES_POSITION" ] && THIS_STATION_ID=$(($j-1)) || THIS_STATION_ID=$j get_cvag_station_info $THIS_STATION_ID STATION_STOPS STATION_NOW STATION_DESTINATIONS STATION_LINES STATION_ACTUAL_DEPARTURE THISDATE STATION_INFO_ERR=$? if [ ! $STATION_INFO_ERR -eq 2 ]; then # FIXME: add warning, when STATION_INFO_ERR == 1 CACHE_WARN=" "; [ $STATION_INFO_ERR -eq 1 ] && CACHE_WARN="/""\e[5m""!""\e[25m""\\" MYOUTPUT[$j]="${MYOUTPUT[$j]}\n\n\ \t\t┌─────────────────────────┬────────────────────────────────┐ \n\ \t\t│ ${STATION_NAME[$THIS_STATION_ID]}$(printf "%-$((24-${#STATION_NAME[$THIS_STATION_ID]}))s" "")│ Stand: $THISDATE $CACHE_WARN │\n\ \t\t├─────────────┬─────┬─────┴────────────────────────────────┤\n" for ((i=0; i<"${#STATION_LINES[*]}"; i++)); do MILLIS=$((${STATION_ACTUAL_DEPARTURE[$i]} - STATION_NOW)); [ "$MILLIS" -lt 0 ] && MILLIS=0 SEKS=$((MILLIS / 1000)); MINS=$((SEKS / 60)); SEKS=$((SEKS % 60)) MYOUTPUT[$j]="${MYOUTPUT[$j]}\ \t\t│$(printf "%-$((3-${#MINS}))s" "")$MINS min $(printf "%-$((2-${#SEKS}))s" "")$SEKS s │ $(printf "%-$((3-${#STATION_LINES[$i]}))s" "")${STATION_LINES[$i]} │ ${STATION_DESTINATIONS[$i]}$(printf "%-$((36-${#STATION_DESTINATIONS[$i]}))s" "") │\\n" done MYOUTPUT[$j]="${MYOUTPUT[$j]}\ \t\t└─────────────┴─────┴──────────────────────────────────────┘" fi fi done draw_logo_time LOGO_AND_TIME $(($(date +%s)+$SYSTEM_TIME_DELTA)) MYOUTPUT[$LOGO_LINES_POSITION]="$LOGO_AND_TIME" LOGO_LINES_POSITION=$(((LOGO_LINES_POSITION + 1) % (${#STATION_ID[*]} + 1))) clear for ((j=0; j<="${#STATION_ID[*]}"; j++)); do echo -e "${MYOUTPUT[$j]}" done fi } update_and_restart() { cd "$(dirname "$0")" [ -d ".git" ] && git pull >/dev/null || sleep 10 exec ./$(basename -- "$0") "skip_initial_update" } draw_large_logo SKIP_UPDATE="$1" [ "$SKIP_UPDATE" = "skip_initial_update" ] && sleep 10 ROUND_COUNT=0 while true; do [ $ROUND_COUNT -eq 0 -a ! "$SKIP_UPDATE" = "skip_initial_update" ] && update_and_restart SKIP_UPDATE="" if [ $(($ROUND_COUNT % 20)) -eq 0 ]; then print_chch_propaganda else print_cvag_schedule fi ROUND_COUNT=$((($ROUND_COUNT + 1) % 60)) sleep 10 done exit 1