diff options
-rwxr-xr-x | bin/efa-m | 25 | ||||
-rw-r--r-- | lib/Travel/Status/DE/EFA.pm | 7 | ||||
-rw-r--r-- | lib/Travel/Status/DE/EFA/Trip.pm | 94 |
3 files changed, 125 insertions, 1 deletions
@@ -258,6 +258,26 @@ sub display_result { return; } +sub show_stopseq { + my $trip = $efa->result; + + printf( "%s %s → %s\n", + $trip->line, $trip->number // q{}, + $trip->dest_name ); + + for my $stop ( $trip->route ) { + printf( "%s → %s %s\n", + $stop->{sched_arr} + ? ( $stop->{rt_arr} // $stop->{sched_arr} )->strftime('%H:%M') + : q{ }, + $stop->{sched_dep} + ? ( $stop->{rt_dep} // $stop->{sched_dep} )->strftime('%H:%M') + : q{ }, + $stop->{name_full}, + ); + } +} + sub show_lines { my @output; @@ -449,7 +469,10 @@ if ( my $err = $efa->errstr ) { exit 2; } -if ($list_lines) { +if ($stopseq) { + show_stopseq(); +} +elsif ($list_lines) { show_lines(); } else { diff --git a/lib/Travel/Status/DE/EFA.pm b/lib/Travel/Status/DE/EFA.pm index 85aea8e..8591bc1 100644 --- a/lib/Travel/Status/DE/EFA.pm +++ b/lib/Travel/Status/DE/EFA.pm @@ -15,6 +15,7 @@ use JSON; use Travel::Status::DE::EFA::Line; use Travel::Status::DE::EFA::Departure; use Travel::Status::DE::EFA::Stop; +use Travel::Status::DE::EFA::Trip; use LWP::UserAgent; my %efa_instance = ( @@ -568,6 +569,12 @@ sub results { return @results; } +sub result { + my ($self) = @_; + + return Travel::Status::DE::EFA::Trip->new( json => $self->{response} ); +} + # static sub get_efa_urls { return map { diff --git a/lib/Travel/Status/DE/EFA/Trip.pm b/lib/Travel/Status/DE/EFA/Trip.pm new file mode 100644 index 0000000..3f5b134 --- /dev/null +++ b/lib/Travel/Status/DE/EFA/Trip.pm @@ -0,0 +1,94 @@ +package Travel::Status::DE::EFA::Trip; + +use strict; +use warnings; +use 5.010; + +use DateTime::Format::Strptime; + +use parent 'Class::Accessor'; + +our $VERSION = '2.02'; + +Travel::Status::DE::EFA::Trip->mk_ro_accessors( + qw(operator name line number type id dest_name dest_id)); + +sub new { + my ( $obj, %conf ) = @_; + + my $json = $conf{json}{transportation}; + + my $ref = { + operator => $json->{operator}{name}, + polyline => $json->{coords}, + name => $json->{name}, + line => $json->{disassembledName}, + number => $json->{properties}{trainNumber}, + type => $json->{properties}{trainType}, + id => $json->{id}, + dest_name => $json->{destination}{name}, + dest_id => $json->{destination}{id}, + route_raw => $json->{locationSequence}, + strptime_obj => DateTime::Format::Strptime->new( + pattern => '%Y-%m-%dT%H:%M:%SZ', + time_zone => 'UTC' + ), + }; + return bless( $ref, $obj ); +} + +sub polyline { + my ($self) = @_; + + return @{ $self->{polyline} // [] }; +} + +sub parse_dt { + my ( $self, $value ) = @_; + + if ($value) { + my $dt = $self->{strptime_obj}->parse_datetime($value); + if ($dt) { + return $dt->set_time_zone('Europe/Berlin'); + } + } + return undef; +} + +sub route { + my ($self) = @_; + + if ( $self->{route} ) { + return @{ $self->{route} }; + } + + for my $stop ( @{ $self->{route_raw} // [] } ) { + push( + @{ $self->{route} }, + { + sched_arr => $self->parse_dt( $stop->{arrivalTimePlanned} ), + sched_dep => $self->parse_dt( $stop->{departureTimePlanned} ), + rt_arr => $self->parse_dt( $stop->{arrivalTimeEstimated} ), + rt_dep => $self->parse_dt( $stop->{departureTimeEstimated} ), + latlon => $stop->{coord}, + name_full => $stop->{name}, + name => $stop->{parent}{disassembledName}, + place => $stop->{parent}{parent}{name}, + niveau => $stop->{niveau}, + id => $stop->{id}, + } + ); + } + + delete $self->{route_raw}; + + return @{ $self->{route} // [] }; +} + +sub TO_JSON { + my ($self) = @_; + + return { %{$self} }; +} + +1; |