Loading examples/traintrack +32 −13 Original line number Diff line number Diff line Loading @@ -19,7 +19,9 @@ binmode( STDOUT, ':encoding(utf-8)' ); @ARGV = map { decode( 'UTF-8', $_ ) } @ARGV; my ($dest_station, $train_type, $train_no) = @ARGV; my ($dest_station, $train_type, $train_no, $max_stations) = @ARGV; $max_stations //= 20; my $main_cache = Cache::Memory->new( namespace => 'IRISMain', Loading Loading @@ -102,6 +104,16 @@ sub format_datetime { return $dt->strftime('%H:%M'); } sub format_delay { my ($delay) = @_; if (not defined $delay) { return q{}; } return sprintf('%+d', $delay); } sub update_trainstatus { my ($train) = @_; return { Loading @@ -113,6 +125,8 @@ sub update_trainstatus { cancelled_departure => $train->departure_is_cancelled, sched_platform => $train->sched_platform, delay => $train->delay, arrival_delay => $train->arrival_delay, departure_delay => $train->departure_delay, platform => $train->platform, epoch => ($train->arrival // $train->departure)->epoch, last_update => DateTime->now(time_zone => 'Europe/Berlin')->epoch, Loading @@ -129,8 +143,8 @@ if (not defined $initial_train) { my @stations = ($initial_train->route_pre, $dest_station); my @all_messages = $initial_train->messages; if (@stations > 20) { splice(@stations, 0, @stations - 20); if (@stations > $max_stations) { splice(@stations, 0, @stations - $max_stations); } my %status = ( Loading Loading @@ -180,31 +194,36 @@ while (1) { } if ($prev_epoch < $now->epoch and $now->epoch <= $epoch) { printf("\n%30s %5s\n\n", '>' x 15, $now->strftime('%H:%M')); printf("%30s %5s\n\n", '>' x 15, $now->strftime('%H:%M')); } printf("%30s %5s → %5s +%d\n%30s %5s → %5s\n\n", printf("%30s %5s → %5s %s\n", $station, format_datetime($status{$station}{sched_arrival}), format_datetime($status{$station}{sched_departure}), $status{$station}{delay}, q{}, format_delay($status{$station}{delay}), ); if ($status{$station}{arrival_delay} or $status{$station}{departure_delay}) { printf("%30s %5s → %5s\n", q{}, format_datetime($status{$station}{rt_arrival}), format_datetime($status{$station}{rt_departure}), ); } print "\n"; $prev_epoch = $epoch; } } sleep(60); for my $station (@stations) { if (my $train = get_train_or_undef($station, 1)) { $status{$station} = update_trainstatus($train); @all_messages = $train->messages; } else { $status{$station}{skip} = 1; } } sleep(60); say "\n----\n"; } Loading
examples/traintrack +32 −13 Original line number Diff line number Diff line Loading @@ -19,7 +19,9 @@ binmode( STDOUT, ':encoding(utf-8)' ); @ARGV = map { decode( 'UTF-8', $_ ) } @ARGV; my ($dest_station, $train_type, $train_no) = @ARGV; my ($dest_station, $train_type, $train_no, $max_stations) = @ARGV; $max_stations //= 20; my $main_cache = Cache::Memory->new( namespace => 'IRISMain', Loading Loading @@ -102,6 +104,16 @@ sub format_datetime { return $dt->strftime('%H:%M'); } sub format_delay { my ($delay) = @_; if (not defined $delay) { return q{}; } return sprintf('%+d', $delay); } sub update_trainstatus { my ($train) = @_; return { Loading @@ -113,6 +125,8 @@ sub update_trainstatus { cancelled_departure => $train->departure_is_cancelled, sched_platform => $train->sched_platform, delay => $train->delay, arrival_delay => $train->arrival_delay, departure_delay => $train->departure_delay, platform => $train->platform, epoch => ($train->arrival // $train->departure)->epoch, last_update => DateTime->now(time_zone => 'Europe/Berlin')->epoch, Loading @@ -129,8 +143,8 @@ if (not defined $initial_train) { my @stations = ($initial_train->route_pre, $dest_station); my @all_messages = $initial_train->messages; if (@stations > 20) { splice(@stations, 0, @stations - 20); if (@stations > $max_stations) { splice(@stations, 0, @stations - $max_stations); } my %status = ( Loading Loading @@ -180,31 +194,36 @@ while (1) { } if ($prev_epoch < $now->epoch and $now->epoch <= $epoch) { printf("\n%30s %5s\n\n", '>' x 15, $now->strftime('%H:%M')); printf("%30s %5s\n\n", '>' x 15, $now->strftime('%H:%M')); } printf("%30s %5s → %5s +%d\n%30s %5s → %5s\n\n", printf("%30s %5s → %5s %s\n", $station, format_datetime($status{$station}{sched_arrival}), format_datetime($status{$station}{sched_departure}), $status{$station}{delay}, q{}, format_delay($status{$station}{delay}), ); if ($status{$station}{arrival_delay} or $status{$station}{departure_delay}) { printf("%30s %5s → %5s\n", q{}, format_datetime($status{$station}{rt_arrival}), format_datetime($status{$station}{rt_departure}), ); } print "\n"; $prev_epoch = $epoch; } } sleep(60); for my $station (@stations) { if (my $train = get_train_or_undef($station, 1)) { $status{$station} = update_trainstatus($train); @all_messages = $train->messages; } else { $status{$station}{skip} = 1; } } sleep(60); say "\n----\n"; }