2019-04-06 05:59:05 +02:00
#!/bin/bash
2020-08-23 17:17:50 +02:00
###### configuration #####
# stations to display
2020-08-28 23:58:45 +02:00
STATION_ID[ 0] = "18"
STATION_ID[ 1] = "202"
2020-08-23 17:17:50 +02:00
2020-08-29 19:55:31 +02:00
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████████████████████████████████████████████████"
2020-08-30 02:38:04 +02:00
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"
2020-08-23 17:43:15 +02:00
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█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ "
2020-08-23 17:17:50 +02:00
2020-08-30 22:42:50 +02:00
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"
2020-08-23 17:17:50 +02:00
##########################
2019-04-06 05:59:05 +02:00
2020-08-18 02:32:32 +02:00
if [ -z " $( which jq) " ] ; then
2020-03-15 00:28:00 +01:00
printf "\\n\\n\\n\\tPackage \"jq\" required!"
2019-04-06 05:59:05 +02:00
exit 1
fi
2020-08-20 00:38:37 +02:00
trap do_exit INT
do_exit( ) {
tput cvvis # unhide cursor
exit 0
}
2020-08-23 17:43:15 +02:00
# hide cursor
tput civis
# ohne dieses IFS trennt BASH an Space und erstellt damit zu viele Array-Felder
2020-08-29 00:10:15 +02:00
IFS = "
"
2020-08-23 00:21:57 +02:00
2020-08-23 01:28:08 +02:00
append_five_line_symbol( )
{
local -n LINES = $1
case $2 in
"0" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █████"
LINES[ 1] += " █ █"
LINES[ 2] += " █ █"
LINES[ 3] += " █ █"
LINES[ 4] += " █ █"
LINES[ 5] += " █████"
2020-08-23 01:28:08 +02:00
; ;
"1" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █"
LINES[ 1] += " █"
LINES[ 2] += " █"
LINES[ 3] += " █"
LINES[ 4] += " █"
LINES[ 5] += " █"
2020-08-23 01:28:08 +02:00
; ;
"2" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █████"
LINES[ 1] += " █"
LINES[ 2] += " ▄▄▄▄█"
LINES[ 3] += " █▀▀▀▀"
LINES[ 4] += " █ "
LINES[ 5] += " █████"
2020-08-23 01:28:08 +02:00
; ;
"3" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █████"
LINES[ 1] += " █"
LINES[ 2] += " ▄▄▄▄█"
LINES[ 3] += " ▀▀▀▀█"
LINES[ 4] += " █"
LINES[ 5] += " █████"
2020-08-23 01:28:08 +02:00
; ;
"4" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █ █"
LINES[ 1] += " █ █"
LINES[ 2] += " █▄▄▄█"
LINES[ 3] += " ▀▀▀▀█"
LINES[ 4] += " █"
LINES[ 5] += " █"
2020-08-23 01:28:08 +02:00
; ;
"5" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █████"
LINES[ 1] += " █ "
LINES[ 2] += " █▄▄▄▄"
LINES[ 3] += " ▀▀▀▀█"
LINES[ 4] += " █"
LINES[ 5] += " █████"
2020-08-23 01:28:08 +02:00
; ;
"6" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █████"
LINES[ 1] += " █ "
LINES[ 2] += " █▄▄▄▄"
LINES[ 3] += " █▀▀▀█"
LINES[ 4] += " █ █"
LINES[ 5] += " █████"
2020-08-23 01:28:08 +02:00
; ;
"7" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █████"
LINES[ 1] += " █"
LINES[ 2] += " █"
LINES[ 3] += " █"
LINES[ 4] += " █"
LINES[ 5] += " █"
2020-08-23 01:28:08 +02:00
; ;
"8" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █████"
LINES[ 1] += " █ █"
LINES[ 2] += " █▄▄▄█"
LINES[ 3] += " █▀▀▀█"
LINES[ 4] += " █ █"
LINES[ 5] += " █████"
2020-08-23 01:28:08 +02:00
; ;
"9" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " █████"
LINES[ 1] += " █ █"
LINES[ 2] += " █▄▄▄█"
LINES[ 3] += " ▀▀▀▀█"
LINES[ 4] += " █"
LINES[ 5] += " █████"
2020-08-23 01:28:08 +02:00
; ;
":" )
2020-08-23 01:31:29 +02:00
LINES[ 0] += " "
LINES[ 1] += " ███ "
LINES[ 2] += " ▀▀▀ "
LINES[ 3] += " ▄▄▄ "
LINES[ 4] += " ███ "
LINES[ 5] += " "
2020-08-23 01:28:08 +02:00
; ;
*)
esac
}
2020-08-23 00:21:57 +02:00
2020-08-23 02:38:22 +02:00
get_cvag_station_name( )
{
2020-08-28 23:58:45 +02:00
local -n _STATION_NAME = $1
local -n _STATION_ID = $2
2020-08-23 02:38:22 +02:00
2020-08-23 17:17:50 +02:00
COMPLETE_STATION_LIST = " $( curl --connect-timeout 5 -s "http://www.cvag.de/eza/mis/stations?minLat=0&maxLat=100&minLon=0&maxLon=100" ) "
2020-08-29 18:39:01 +02:00
[ -z " $( echo $COMPLETE_STATION_LIST | grep -oe " ^{.*} $" ) " ] && return 1
2020-08-28 23:58:45 +02:00
for ( ( i = 0; i<${# _STATION_ID [*] } ; i++) ) ; do
case ${ _STATION_ID [ $i ] } in
2020-08-29 00:10:15 +02:00
"" | *[ !0-9] *)
_STATION_NAME[ $i ] = $( echo -n " $COMPLETE_STATION_LIST " | jq -r " .stations | .[] | select(.displayName | contains( ${ _STATION_ID [ $i ] } )) | .number " )
2020-08-23 02:38:22 +02:00
; ;
*)
2020-08-29 00:10:15 +02:00
_STATION_NAME[ $i ] = $( echo -n " $COMPLETE_STATION_LIST " | jq -r " .stations | .[] | select(.number | contains( ${ _STATION_ID [ $i ] } )) | .displayName " )
2020-08-23 02:38:22 +02:00
; ;
esac
done
}
2020-08-29 19:03:07 +02:00
SYSTEM_TIME_DELTA = 0
2020-08-29 18:39:01 +02:00
STATION_SCHEDULE = ( )
2020-08-29 01:17:42 +02:00
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
2020-08-29 19:03:07 +02:00
local -n _THISDATE = $7
2020-08-29 18:39:01 +02:00
_ERROR = 0
2020-08-29 01:17:42 +02:00
2020-08-29 18:39:01 +02:00
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
2020-08-29 01:17:42 +02:00
2020-08-29 18:39:01 +02:00
_STATION_STOPS = $( echo " ${ STATION_SCHEDULE [ $1 ] } " | jq -r ".stops | .[]" )
_STATION_NOW = $( echo " ${ STATION_SCHEDULE [ $1 ] } " | jq -r ".now" )
2020-08-29 01:17:42 +02:00
_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 ))
2020-08-29 19:03:07 +02:00
[ $_ERROR -eq 0 ] && SYSTEM_TIME_DELTA = $(( $_REALSTATION_NOW - $( date +%s) )) || _STATION_NOW = $(( ( $( date +%s) + $SYSTEM_TIME_DELTA ) * 1000 ))
2020-08-29 19:18:18 +02:00
_THISDATE = " $( date --date= " @ $_REALSTATION_NOW " +"%d.%m.%Y %T" ) "
2020-08-29 18:39:01 +02:00
return $_ERROR
2020-08-29 01:17:42 +02:00
}
2020-08-23 16:49:09 +02:00
draw_logo_time( )
{
local -n _MYOUTPUT = $1
local TIME = $2
2020-08-23 17:43:15 +02:00
LOGO_TIME = ( " ${ LOGO_S [@] } " )
2020-08-23 16:49:09 +02:00
for ( ( k = 1; k<6; k++) ) ; do
2020-08-23 17:57:46 +02:00
append_five_line_symbol LOGO_TIME " $( date --date= " @ $TIME " +"%H:%M" | cut -b" $k " ) "
2020-08-23 16:49:09 +02:00
done
2020-08-29 13:53:14 +02:00
_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] } "
2020-08-23 16:49:09 +02:00
}
2020-08-29 19:55:31 +02:00
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
}
2020-08-30 02:38:04 +02:00
print_chch_propaganda( )
{
clear
draw_logo_time LOGO_AND_TIME $(( $( date +%s) + $SYSTEM_TIME_DELTA ))
echo -e " $LOGO_AND_TIME "
2020-08-30 22:42:50 +02:00
echo -e " $PROPAGANDA "
2020-08-30 02:38:04 +02:00
sleep 10
}
2020-08-23 17:17:50 +02:00
LOGO_LINES_POSITION = 0
2020-08-28 23:58:45 +02:00
STATION_NAME = ( )
2020-08-29 19:55:31 +02:00
print_cvag_schedule( )
{
2020-08-29 18:39:01 +02:00
[ ${# STATION_NAME [*] } -eq 0 ] && get_cvag_station_name STATION_NAME STATION_ID
if [ ${# STATION_NAME [*] } -eq 0 ] ; then
2020-08-29 16:09:06 +02:00
clear
echo -e "\\n\\n\\n\\tService unavailable!"
2020-08-18 02:32:32 +02:00
else
2020-08-29 13:53:14 +02:00
MYOUTPUT = ( )
MYOUTPUT[ 0] = "\\n "
2020-03-15 00:28:00 +01:00
2020-08-29 13:53:14 +02:00
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
2020-08-29 01:17:42 +02:00
2020-08-29 19:03:07 +02:00
get_cvag_station_info $THIS_STATION_ID STATION_STOPS STATION_NOW STATION_DESTINATIONS STATION_LINES STATION_ACTUAL_DEPARTURE THISDATE
2020-08-29 18:39:01 +02:00
STATION_INFO_ERR = $?
if [ ! $STATION_INFO_ERR -eq 2 ] ; then # FIXME: add warning, when STATION_INFO_ERR == 1
2020-08-29 22:45:24 +02:00
CACHE_WARN = " " ; [ $STATION_INFO_ERR -eq 1 ] && CACHE_WARN = "/" "\e[5m" "!" "\e[25m" "\\"
2020-08-29 18:39:01 +02:00
MYOUTPUT[ $j ] = " ${ MYOUTPUT [ $j ] } \n\n\
2020-08-29 22:45:24 +02:00
\t \t ┌─────────────────────────┬────────────────────────────────┐ \n \
\t \t │ ${ STATION_NAME [ $THIS_STATION_ID ] } $( printf " %- $(( 24 - ${# STATION_NAME [ $THIS_STATION_ID ] } )) s " "" ) │ Stand: $THISDATE $CACHE_WARN │\n \
2020-09-06 03:34:43 +02:00
\t \t ├─────────────┬─────┬─────┴────────────────────────────────┤\n "
2020-08-29 18:39:01 +02:00
for ( ( i = 0; i<" ${# STATION_LINES [*] } " ; i++) ) ; do
MILLIS = $(( ${ STATION_ACTUAL_DEPARTURE [ $i ] } - STATION_NOW)) ; [ " $MILLIS " -lt 0 ] && MILLIS = 0
2020-08-29 19:18:18 +02:00
SEKS = $(( MILLIS / 1000 )) ; MINS = $(( SEKS / 60 )) ; SEKS = $(( SEKS % 60 ))
2020-08-29 18:39:01 +02:00
MYOUTPUT[ $j ] = " ${ MYOUTPUT [ $j ] } \
2020-09-06 03:34:43 +02:00
\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"
2020-08-29 18:39:01 +02:00
done
MYOUTPUT[ $j ] = " ${ MYOUTPUT [ $j ] } \
2020-09-06 03:34:43 +02:00
\t \t └─────────────┴─────┴──────────────────────────────────────┘"
2020-08-29 18:39:01 +02:00
fi
2020-08-29 13:53:14 +02:00
fi
2020-03-15 00:28:00 +01:00
done
2020-08-29 19:03:07 +02:00
draw_logo_time LOGO_AND_TIME $(( $( date +%s) + $SYSTEM_TIME_DELTA ))
2020-08-29 13:53:14 +02:00
MYOUTPUT[ $LOGO_LINES_POSITION ] = " $LOGO_AND_TIME "
2020-08-28 23:58:45 +02:00
LOGO_LINES_POSITION = $(( ( LOGO_LINES_POSITION + 1 ) % ( ${# STATION_ID [*] } + 1 )) )
2020-08-29 13:53:14 +02:00
2020-08-18 02:32:32 +02:00
clear
2020-08-29 13:53:14 +02:00
for ( ( j = 0; j<= " ${# STATION_ID [*] } " ; j++) ) ; do
echo -e " ${ MYOUTPUT [ $j ] } "
done
2020-03-15 00:28:00 +01:00
fi
2020-08-29 19:55:31 +02:00
}
2020-08-29 23:30:49 +02:00
update_and_restart( )
2020-08-29 21:47:12 +02:00
{
cd " $( dirname " $0 " ) "
2020-08-29 23:30:49 +02:00
[ -d ".git" ] && git pull >/dev/null || sleep 10
exec ./$( basename -- " $0 " ) "skip_initial_update"
2020-08-29 21:47:12 +02:00
}
2020-08-29 19:55:31 +02:00
draw_large_logo
2020-08-29 21:47:12 +02:00
SKIP_UPDATE = " $1 "
2020-08-29 22:35:04 +02:00
[ " $SKIP_UPDATE " = "skip_initial_update" ] && sleep 10
2020-08-29 21:47:12 +02:00
ROUND_COUNT = 0
2020-08-29 19:55:31 +02:00
while true; do
2020-08-29 23:30:49 +02:00
[ $ROUND_COUNT -eq 0 -a ! " $SKIP_UPDATE " = "skip_initial_update" ] && update_and_restart
2020-08-29 21:47:12 +02:00
SKIP_UPDATE = ""
2020-08-30 02:38:04 +02:00
if [ $(( $ROUND_COUNT % 20 )) -eq 0 ] ; then
print_chch_propaganda
else
print_cvag_schedule
fi
2020-08-29 21:47:12 +02:00
ROUND_COUNT = $(( ( $ROUND_COUNT + 1 ) % 60 ))
2020-08-18 02:32:32 +02:00
sleep 10
2019-04-06 05:59:05 +02:00
done
2020-08-20 00:38:37 +02:00
exit 1