From 7694e626a51439a7a0902c686bf9048bcdaf4b3f Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 5 Oct 2018 20:41:28 +0200 Subject: [PATCH] show journey distances as well --- index.pl | 49 +++++++++++++++++++++++++++++++++-- templates/landingpage.html.ep | 10 ++++--- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/index.pl b/index.pl index 6d00a1d..f0242ed 100755 --- a/index.pl +++ b/index.pl @@ -4,7 +4,9 @@ use Mojolicious::Lite; use Cache::File; use DateTime; use DBI; +use Geo::Distance; use List::Util qw(first); +use List::MoreUtils qw(after_incl before_incl); use Travel::Status::DE::IRIS; use Travel::Status::DE::IRIS::Stations; @@ -233,6 +235,18 @@ sub get_departures { } } +sub get_station { + my ($station_name) = @_; + + my @candidates + = Travel::Status::DE::IRIS::Stations::get_station($station_name); + + if ( @candidates == 1 ) { + return $candidates[0]; + } + return undef; +} + helper 'checkin' => sub { my ( $self, $station, $train_id ) = @_; @@ -450,7 +464,8 @@ helper 'get_user_travels' => sub { type => $train_type, line => $train_line, no => $train_no, - messages => [ split( qr{|}, $raw_messages ) ], + messages => [ split( qr{[|]}, $raw_messages ) ], + route => [ split( qr{[|]}, $raw_route ) ], completed => 0, } ); @@ -464,7 +479,7 @@ helper 'get_user_travels' => sub { if ($train_no) { $ref->{sched_arrival} = epoch_to_dt($raw_sched_ts), $ref->{rt_arrival} = epoch_to_dt($raw_real_ts), - $ref->{messages} = [ split( qr{|}, $raw_messages ) ]; + $ref->{messages} = [ split( qr{[|]}, $raw_messages ) ]; } } } @@ -516,6 +531,36 @@ helper 'get_user_status' => sub { }; }; +helper 'get_travel_distance' => sub { + my ( $self, $from, $to, $route_ref ) = @_; + + my $distance = 0; + my $geo = Geo::Distance->new(); + my @route = after_incl { $_ eq $from } @{$route_ref}; + @route = before_incl { $_ eq $to } @route; + + if ( @route < 2 ) { + + # I AM ERROR + return 0; + } + + my $prev_station = get_station( shift @route ); + if ( not $prev_station ) { + return 0; + } + + for my $station_name (@route) { + if ( my $station = get_station($station_name) ) { + $distance += $geo->distance( 'kilometer', $prev_station->[3], + $prev_station->[4], $station->[3], $station->[4] ); + $prev_station = $station; + } + } + + return $distance; +}; + helper 'navbar_class' => sub { my ( $self, $path ) = @_; diff --git a/templates/landingpage.html.ep b/templates/landingpage.html.ep index a33d83a..9e45076 100644 --- a/templates/landingpage.html.ep +++ b/templates/landingpage.html.ep @@ -49,10 +49,12 @@ <%= $travel->{type} %> <%= $travel->{line} // $travel->{no} %> <%= $travel->{from_name} %> → <%= $travel->{to_name} %> % if ($travel->{rt_arrival} and $travel->{rt_departure}) { - <%= ($travel->{rt_arrival}->epoch - $travel->{rt_departure}->epoch) / 60 %> min - % } - % else { - ? + <%= ($travel->{rt_arrival}->epoch - $travel->{rt_departure}->epoch) / 60 %> min + / + <%= sprintf('%.f', $self->get_travel_distance($travel->{from_name}, $travel->{to_name}, $travel->{route})) %>km + + % } else { + <%= sprintf('%.f', $self->get_travel_distance($travel->{from_name}, $travel->{to_name}, $travel->{route})) %>km % } % }