Commit 1d12c3e5 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

move track-via to db-iris

parent 6d3199f7
Loading
Loading
Loading
Loading
+33 −4
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ use Travel::Status::DE::IRIS::Stations;

my ( $date, $time );
my $datetime = DateTime->now( time_zone => 'Europe/Berlin' );
my $filter_via;
my ( $filter_via, $track_via, $status_via );
my ( @grep_class, @grep_type, @grep_platform );
my ( %edata,      @edata_pre );

@@ -38,7 +38,8 @@ GetOptions(
	't|time=s'      => \$time,
	'T|type=s'      => \@grep_type,
	'v|via=s'       => \$filter_via,
	'V|version'     => \&show_version,
	'V|track-via=s' => \$track_via,
	'version'       => \&show_version,

) or show_help(1);

@@ -55,6 +56,10 @@ if ( @ARGV != 1 ) {
my ($station) = @ARGV;
$station = get_station($station);

if ($track_via) {
	$track_via = get_station($track_via);
}

if ($date) {
	my ( $day, $month, $year ) = split( qr{ [.] }ox, $date );
	$datetime->set(
@@ -89,6 +94,12 @@ my $status = Travel::Status::DE::IRIS->new(
	datetime => $datetime,
	station  => $station,
);
if ($track_via) {
	$status_via = Travel::Status::DE::IRIS->new(
		datetime => $datetime,
		station  => $track_via,
	);
}

sub get_station {
	my ($input_name) = @_;
@@ -208,6 +219,12 @@ if ( my $err = $status->errstr ) {
	exit 2;
}

if ( $status_via and $status_via->errstr ) {
	my $err = $status_via->errstr;
	say STDERR "Request error: ${err}";
	exit 2;
}

for my $d ( $status->results() ) {

	my @via;
@@ -232,7 +249,19 @@ for my $d ( $status->results() ) {
	}

	my $timestr;
	if ( $edata{times} ) {
	if ($track_via) {
		$timestr = $d->time;
		my $d_via = first { $_->train_id eq $d->train_id } $status_via->results;
		if (   not $d_via
			or not $d_via->arrival
			or $d_via->arrival < $d->departure )
		{
			next;
		}
		my $timestr_via = $d_via->arrival->strftime('%H:%M') . $delay;
		$timestr = $d->time . '' . $timestr_via;
	}
	elsif ( $edata{times} ) {
		$timestr = sprintf( '%5s → %5s',
			$d->sched_arrival   ? $d->sched_arrival->strftime('%H:%M')   : q{},
			$d->sched_departure ? $d->sched_departure->strftime('%H:%M') : q{},

examples/track-from-to

deleted100755 → 0
+0 −234
Original line number Diff line number Diff line
#!/usr/bin/env perl
use strict;
use warnings;
use 5.014;
use utf8;

no if $] >= 5.018, warnings => 'experimental::smartmatch';

our $VERSION = '0.01';

use Encode qw(decode);
use Getopt::Long qw(:config no_ignore_case bundling);
use List::Util qw(first max);
use List::MoreUtils qw(none);
use Travel::Status::DE::IRIS;
use Travel::Status::DE::IRIS::Stations;

my ( @grep_class, @grep_type, @grep_platform );
my ( %edata, @edata_pre );

my @output;

binmode( STDOUT, ':encoding(utf-8)' );

@ARGV = map { decode( 'UTF-8', $_ ) } @ARGV;

GetOptions(
	'c|class=s@'    => \@grep_class,
	'h|help'        => sub { show_help(0) },
	'o|output=s@'   => \@edata_pre,
	'p|platform=s@' => \@grep_platform,
	'T|type=s'      => \@grep_type,
	'V|version'     => \&show_version,

) or show_help(1);

if ( @ARGV < 2 ) {
	show_help(1);
}

# opt=foo,bar support
@edata_pre     = split( qr{,}, join( q{,}, @edata_pre ) );
@grep_class    = split( qr{,}, join( q{,}, @grep_class ) );
@grep_platform = split( qr{,}, join( q{,}, @grep_platform ) );
@grep_type     = split( qr{,}, join( q{,}, @grep_type ) );

my ($from, $filter_via, $to) = @ARGV;
$to //= $filter_via;
$from = get_station($from);
$to   = get_station($to);

for my $efield (@edata_pre) {
	given ($efield) {
		when ('d') { $edata{delay}     = 1 }
		when ('D') { $edata{delays}    = 1 }
		when ('f') { $edata{fullroute} = 1 }
		when ('m') { $edata{messages}  = 1 }
		when ('q') { $edata{qos}       = 1 }
		when ('r') { $edata{route}     = 1 }
		when ('t') { $edata{times}     = 1 }
		default    { $edata{$efield}   = 1 }
	}
}

my $status_f = Travel::Status::DE::IRIS->new(
	station  => $from,
);

my $status_t = Travel::Status::DE::IRIS->new(
	station  => $to,
);

sub get_station {
	my ($input_name) = @_;

	my @stations = Travel::Status::DE::IRIS::Stations::get_station($input_name);

	if ( @stations == 0 ) {
		say STDERR "No station matches '$input_name'";
		exit(1);
	}
	elsif ( @stations == 1 ) {
		return $stations[0][0];
	}
	else {
		say STDERR "The input '$input_name' is ambiguous. Please choose one "
		  . 'of the following:';
		say STDERR join( "\n", map { $_->[1] } @stations );
		exit(1);
	}
}

sub show_help {
	my ($code) = @_;

	print 'Usage: db-iris [-V] [-c <classlist>] [-d <date>] '
	  . '[-o <output-flags>] [-p <platforms>] [-t <time>] '
	  . '[-T <typelist>] [-v <via>] <station>' . "\n"
	  . "See also: man db-iris\n";

	exit $code;
}

sub show_version {
	say "db-iris version ${VERSION}";

	exit 0;
}

sub display_result {
	my (@lines) = @_;

	my @line_length;

	if ( not @lines ) {
		die("Nothing to show\n");
	}

	for my $i ( 0 .. 4 ) {
		$line_length[$i] = max map { length( $_->[$i] ) } @lines;
	}

	for my $line (@lines) {
		printf(
			join( q{  }, ( map { "%-${_}s" } @line_length ) ),
			@{$line}[ 0 .. 4 ]
		);

		my $d = $line->[5];

		if (    $edata{delays}
			and $d->delay_messages )
		{
			printf( '  %s',
				join( q{  }, map { $_->[1] } ( reverse $d->delay_messages ) ) );
		}
		if (    $edata{delay}
			and ( $d->delay or $d->is_cancelled )
			and $d->delay_messages )
		{
			printf( '  %s', ( $d->delay_messages )[-1]->[1] );
		}
		if ( $edata{qos} and $d->qos_messages ) {
			printf( '  %s',
				join( q{  }, map { $_->[1] } ( reverse $d->qos_messages ) ) );
		}
		print "\n";

		if ( $edata{times} ) {
			if ( not defined $d->delay ) {
				print "\n";
			}
			elsif ( $d->delay == 0 ) {
				printf( "%s+0\n", q{ } x 15 );
			}
			else {
				printf(
					"%5s → %5s  %+d\n",
					$d->arrival   ? $d->arrival->strftime('%H:%M')   : q{},
					$d->departure ? $d->departure->strftime('%H:%M') : q{},
					$d->delay,
				);
			}

		}

		if ( $edata{messages} ) {
			for my $message ( reverse $d->messages ) {

				# leading spaces to align with regular output
				printf( " %s  %s\n",
					$message->[0]->strftime('%d.%m. %H:%M'),
					$message->[1] );
			}
			print "\n";
		}

		if ( $edata{fullroute} ) {
			print "\n" . join( "\n", $d->route ) . "\n\n";
		}
	}

	return;
}

if ( my $err = $status_f->errstr ) {
	say STDERR "Request error at ${from}: ${err}";
	exit 2;
}
if ( my $err = $status_t->errstr ) {
	say STDERR "Request error at ${to}: ${err}";
	exit 2;
}

for my $d ( $status_f->results ) {

	my @via;

	@via = $d->route_post;

	if (   ( $filter_via and not( first { $_ =~ m{$filter_via}io } @via ) )
		or ( @grep_class and none { $_ ~~ \@grep_class } $d->classes )
		or ( @grep_platform and not( $d->platform ~~ \@grep_platform ) )
		or ( @grep_type and not( $d->type ~~ \@grep_type ) ) )
	{
		next;
	}

	my $delay = q{};

	if ( $d->delay ) {
		$delay = ( $d->delay > 0 ? ' +' : q{ } ) . $d->delay;
	}
	if ( $d->is_cancelled ) {
		$delay = ' CANCELED';
	}

	my $timestr = $d->time;

	my $d_via = first { $_->train_id eq $d->train_id } $status_t->results;
	my $timestr_via = ($d_via ? $d_via->arrival->strftime('%H:%M') : '??:??') . $delay;

	push(
		@output,
		[
			"$timestr$timestr_via", $d->train,
			$edata{route} ? join( q{  }, $d->route_interesting ) : q{},
			$d->route_end, $d->platform // q{}, $d
		]
	);

}

display_result(@output);