306 lines
11 KiB
Bash
Executable File
306 lines
11 KiB
Bash
Executable File
#!/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
|