From 234486663dbe1712c10888121d9bf38c4cbd2cc8 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 21 Mar 2021 08:19:33 +0100 Subject: add preliminary support for station-independent train details --- lib/DBInfoscreen.pm | 7 +- lib/DBInfoscreen/Controller/Stationboard.pm | 121 +++++++++++++++++++++++++++- lib/DBInfoscreen/Helper/HAFAS.pm | 2 + templates/_train_details.html.ep | 31 ++++--- templates/train_details.html.ep | 2 +- 5 files changed, 146 insertions(+), 17 deletions(-) diff --git a/lib/DBInfoscreen.pm b/lib/DBInfoscreen.pm index bf18be2..4445d7f 100644 --- a/lib/DBInfoscreen.pm +++ b/lib/DBInfoscreen.pm @@ -40,8 +40,8 @@ sub startup { workers => $ENV{DBFAKEDISPLAY_WORKERS} // 2, }, source_url => 'https://github.com/derf/db-fakedisplay', - issue_url => 'https://github.com/derf/db-fakedisplay/issues', - version => $ENV{DBFAKEDISPLAY_VERSION} // qx{git describe --dirty} + issue_url => 'https://github.com/derf/db-fakedisplay/issues', + version => $ENV{DBFAKEDISPLAY_VERSION} // qx{git describe --dirty} // '???', ); @@ -364,7 +364,8 @@ sub startup { $r->get('/_ajax_mapinfo/:tripid/:lineno')->to('map#ajax_route'); $r->get('/map/:tripid/:lineno')->to('map#route'); $r->get('/intersection/:trips')->to('map#intersection'); - $r->get('/z/:train/:station')->to('stationboard#train_details'); + $r->get('/z/:train/:station')->to('stationboard#station_train_details'); + $r->get('/z/:train')->to('stationboard#train_details'); $r->get('/map')->to('map#search_form'); $r->get('/_trainsearch')->to('map#search'); diff --git a/lib/DBInfoscreen/Controller/Stationboard.pm b/lib/DBInfoscreen/Controller/Stationboard.pm index 1abe998..0ea6c37 100644 --- a/lib/DBInfoscreen/Controller/Stationboard.pm +++ b/lib/DBInfoscreen/Controller/Stationboard.pm @@ -824,7 +824,7 @@ sub render_train { )->wait; } -sub train_details { +sub station_train_details { my ($self) = @_; my $train_no = $self->stash('train'); my $station = $self->stash('station'); @@ -919,6 +919,125 @@ sub train_details { ); } +sub train_details { + my ($self) = @_; + my $train = $self->stash('train'); + + my ( $train_type, $train_no ) = ( $train =~ m{ ^ (\S+) \s+ (.*) $ }x ); + + # TODO error handling + + if ( $self->param('ajax') ) { + delete $self->stash->{layout}; + } + + my $api_version = $Travel::Status::DE::IRIS::VERSION; + + $self->stash( departures => [] ); + $self->stash( title => 'DBF' ); + $self->stash( version => $self->config->{version} ); + + my $res = { + train_type => $train_type, + train_line => undef, + train_no => $train_no, + route_pre_diff => [], + route_post_diff => [], + moreinfo => [], + replaced_by => [], + replacement_for => [], + }; + + $self->stash( title => "${train_type} ${train_no}" ); + $self->stash( hide_opts => 1 ); + + $self->render_later; + + my $linetype = 'bahn'; + + $self->hafas->get_route_timestamps_p( train_no => $train_no )->then( + sub { + my ( $route_ts, $route_info, $trainsearch ) = @_; + + $res->{trip_id} = $trainsearch->{trip_id}; + + if ( not defined $trainsearch->{trainClass} ) { + $linetype = 'ext'; + } + elsif ( $trainsearch->{trainClass} <= 2 ) { + $linetype = 'fern'; + } + elsif ( $trainsearch->{trainClass} <= 8 ) { + $linetype = 'bahn'; + } + elsif ( $trainsearch->{trainClass} <= 16 ) { + $linetype = 'sbahn'; + } + + $res->{origin} = $route_info->{stations}[0]; + $res->{destination} = $route_info->{stations}[-1]; + + $res->{route_post_diff} + = [ map { { name => $_ } } @{ $route_info->{stations} } ]; + + if ($route_ts) { + for my $elem ( @{ $res->{route_post_diff} } ) { + for my $key ( keys %{ $route_ts->{ $elem->{name} } // {} } ) + { + $elem->{$key} = $route_ts->{ $elem->{name} }{$key}; + } + } + } + + if ( $route_info and @{ $route_info->{messages} // [] } ) { + my $him = $route_info->{messages}; + my @him_messages; + for my $message ( @{$him} ) { + if ( $message->{display} ) { + push( @him_messages, + [ $message->{header}, $message->{lead} ] ); + if ( $message->{lead} =~ m{zuginfo.nrw/?\?msg=(\d+)} ) { + push( + @{ $res->{links} }, + [ + "Großstörung", + "https://zuginfo.nrw/?msg=$1" + ] + ); + } + } + } + $res->{moreinfo} = [@him_messages]; + } + + $self->render( + $self->param('ajax') ? '_train_details' : 'train_details', + departure => $res, + linetype => $linetype, + icetype => $self->app->ice_type_map->{ $res->{train_no} }, + details => {}, #$departure->{composition} // {}, + dt_now => DateTime->now( time_zone => 'Europe/Berlin' ), + + #station_name => "FIXME",#$station_name, + ); + } + )->catch( + sub { + my ($e) = @_; + if ($e) { + $self->render( + 'exception', + exception => $e, + snapshot => {} + ); + } + else { + $self->render('not_found'); + } + } + )->wait; +} + sub handle_result { my ( $self, $data ) = @_; diff --git a/lib/DBInfoscreen/Helper/HAFAS.pm b/lib/DBInfoscreen/Helper/HAFAS.pm index 2b8172e..bfc8ed4 100644 --- a/lib/DBInfoscreen/Helper/HAFAS.pm +++ b/lib/DBInfoscreen/Helper/HAFAS.pm @@ -321,6 +321,8 @@ sub get_route_timestamps_p { $promise->reject; return; } + $trainsearch_result->{trainClass} + = $traininfo->{suggestions}[0]{trainClass}; my $ret = {}; my $strp = DateTime::Format::Strptime->new( diff --git a/templates/_train_details.html.ep b/templates/_train_details.html.ep index 0aa3bba..9aa39ac 100644 --- a/templates/_train_details.html.ep +++ b/templates/_train_details.html.ep @@ -112,7 +112,12 @@
% if ($departure->{trip_id}) { - Karte +% if (stash('station_name')) { + Karte +% } +% else { + Karte +% } % } % if ($departure->{wr_link}) { Wagenreihung @@ -192,19 +197,21 @@ % } % } -
  • <%= $departure->{sched_departure} // $departure->{sched_arrival} // q{} %> -% if ($departure->{sched_departure}) { -% if ($departure->{departure} ne $departure->{sched_departure}) { - (heute <%= $departure->{departure} %>) +% if (stash('station_name')) { +
  • <%= $departure->{sched_departure} // $departure->{sched_arrival} // q{} %> +% if ($departure->{sched_departure}) { +% if ($departure->{departure} ne $departure->{sched_departure}) { + (heute <%= $departure->{departure} %>) +% } % } -% } -% elsif ($departure->{arrival}) { -% if ($departure->{arrival} ne $departure->{sched_arrival}) { - (heute <%= $departure->{arrival} %>) +% elsif ($departure->{arrival}) { +% if ($departure->{arrival} ne $departure->{sched_arrival}) { + (heute <%= $departure->{arrival} %>) +% } % } -% } - <%= $station_name %> -
  • + <%= stash('station_name') %> + +% } % for my $stop (@{$departure->{route_post_diff}}) {
  • +
    %= include '_train_details'
    -- cgit v1.2.3