diff options
author | Derf Null <derf@finalrewind.org> | 2023-03-27 21:03:25 +0200 |
---|---|---|
committer | Derf Null <derf@finalrewind.org> | 2023-03-27 21:03:25 +0200 |
commit | c3c7a0c78b30cc7ef2b836cca4eb0a4e110955da (patch) | |
tree | b66a6f0dcb4cb8d0e10ad29c84d79d0f309ee402 | |
parent | 3acee2b285ac81405c5d2ce8889c77460f6f58a0 (diff) |
stationboard: add HAFAS support
-rwxr-xr-x | lib/Travelynx/Controller/Traveling.pm | 61 | ||||
-rw-r--r-- | lib/Travelynx/Helper/HAFAS.pm | 2 | ||||
-rw-r--r-- | templates/_departures_hafas.html.ep | 44 | ||||
-rw-r--r-- | templates/_departures_iris.html.ep | 52 | ||||
-rw-r--r-- | templates/departures.html.ep | 58 | ||||
-rw-r--r-- | templates/exception.html.ep | 2 |
6 files changed, 153 insertions, 66 deletions
diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index 00cc02a..e9a8bb5 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -795,22 +795,56 @@ sub station { my $train = $self->param('train'); $self->render_later; - $self->iris->get_departures_p( - station => $station, - lookbehind => 120, - lookahead => 30, - with_related => 1 - )->then( + + my $use_hafas = $self->param('hafas'); + my $promise; + if ($use_hafas) { + $promise = $self->hafas->get_departures_p( + eva => $station, + lookbehind => 120, + lookahead => 30, + ); + } + else { + $promise = $self->iris->get_departures_p( + station => $station, + lookbehind => 120, + lookahead => 30, + with_related => 1, + ); + } + $promise->then( sub { my ($status) = @_; - # You can't check into a train which terminates here - my @results = grep { $_->departure } @{ $status->{results} }; + my @results; + if ($use_hafas) { + my $now = $self->now->epoch; + @results = map { $_->[0] } + sort { $b->[1] <=> $a->[1] } + map { [ $_, $_->datetime->epoch ] } + grep { + ( $_->datetime // $_->sched_datetime )->epoch + < $now + 30 * 60 + } $status->results; + $status = { + station_eva => $status->station->{eva}, + station_name => + List::Util::reduce { length($a) < length($b) ? $a : $b } + @{ $status->station->{names} }, + related_stations => [], + }; + } + else { + # You can't check into a train which terminates here + @results = grep { $_->departure } @{ $status->{results} }; - @results = map { $_->[0] } - sort { $b->[1] <=> $a->[1] } - map { [ $_, $_->departure->epoch // $_->sched_departure->epoch ] } - @results; + @results = map { $_->[0] } + sort { $b->[1] <=> $a->[1] } + map { + [ $_, $_->departure->epoch // $_->sched_departure->epoch ] + } @results; + } my $connections_p; if ($train) { @@ -842,6 +876,7 @@ sub station { 'departures', eva => $status->{station_eva}, results => \@results, + hafas => $use_hafas, station => $status->{station_name}, related_stations => $status->{related_stations}, connections => $connecting_trains, @@ -856,6 +891,7 @@ sub station { 'departures', eva => $status->{station_eva}, results => \@results, + hafas => $use_hafas, station => $status->{station_name}, related_stations => $status->{related_stations}, title => "travelynx: $status->{station_name}", @@ -870,6 +906,7 @@ sub station { 'departures', eva => $status->{station_eva}, results => \@results, + hafas => $use_hafas, station => $status->{station_name}, related_stations => $status->{related_stations}, title => "travelynx: $status->{station_name}", diff --git a/lib/Travelynx/Helper/HAFAS.pm b/lib/Travelynx/Helper/HAFAS.pm index 9bff723..a418b61 100644 --- a/lib/Travelynx/Helper/HAFAS.pm +++ b/lib/Travelynx/Helper/HAFAS.pm @@ -91,7 +91,7 @@ sub get_departures_p { station => $opt{eva}, datetime => $when, duration => $opt{lookahead}, - results => 120, + results => 300, cache => $self->{realtime_cache}, promise => 'Mojo::Promise', user_agent => $self->{user_agent}->request_timeout(5), diff --git a/templates/_departures_hafas.html.ep b/templates/_departures_hafas.html.ep new file mode 100644 index 0000000..5b1a057 --- /dev/null +++ b/templates/_departures_hafas.html.ep @@ -0,0 +1,44 @@ +<table class="striped"> +<tbody> +% my $orientation_bar_shown = param('train'); +% my $now_epoch = now()->epoch; +% for my $result (@{$results}) { + % my $td_class = ''; + % my $link_class = 'action-checkin'; + % if ($result->is_cancelled) { + % $td_class = "cancelled"; + % $link_class = 'action-cancelled-from'; + % } + % if (not $orientation_bar_shown and $result->datetime->epoch < $now_epoch) { + % $orientation_bar_shown = 1; + <tr> + <td> + </td> + <td> + — Anfragezeitpunkt — + </td> + <td> + </td> + </tr> + % } + <tr class="<%= $link_class %>" data-station="<%= $result->station_eva %>" data-train="<%= $result->id %>" data-tr="3"> + <td> + <a> + <%= $result->line %> + </a> + </td> + <td class="<%= $td_class %>"> + <a> + <%= $result->destination %> + </a> + </td> + <td class="<%= $td_class %>"> + %= $result->datetime->strftime('%H:%M') + % if ($result->delay) { + (<%= sprintf('%+d', $result->delay) %>) + % } + </td> + </tr> +% } +</tbody> +</table> diff --git a/templates/_departures_iris.html.ep b/templates/_departures_iris.html.ep new file mode 100644 index 0000000..b24c3f1 --- /dev/null +++ b/templates/_departures_iris.html.ep @@ -0,0 +1,52 @@ +<table class="striped"> +<tbody> +% my $orientation_bar_shown = param('train'); +% my $now_epoch = now()->epoch; +% for my $result (@{$results}) { + % my $td_class = ''; + % my $link_class = 'action-checkin'; + % if ($result->departure_is_cancelled) { + % $td_class = "cancelled"; + % $link_class = 'action-cancelled-from'; + % } + % if (not $orientation_bar_shown and $result->departure->epoch < $now_epoch) { + % $orientation_bar_shown = 1; + <tr> + <td> + </td> + <td> + — Anfragezeitpunkt — + </td> + <td> + </td> + </tr> + % } + <tr class="<%= $link_class %>" data-station="<%= $result->station_uic %>" data-train="<%= $result->train_id %>" data-tr="3"> + <td> + <a> + <%= $result->line %> + </a> + </td> + <td class="<%= $td_class %>"> + <a> + <%= $result->destination %> + </a> + </td> + <td class="<%= $td_class %>"> + % if ($result->departure_hidden) { + (<%= $result->departure->strftime('%H:%M') %>) + % } + % else { + %= $result->departure->strftime('%H:%M') + % } + % if ($result->departure_delay) { + (<%= sprintf('%+d', $result->departure_delay) %>) + % } + % elsif (not $result->has_realtime and $result->start->epoch < $now_epoch) { + <i class="material-icons" aria-label="Keine Echtzeitdaten vorhanden" style="font-size: 16px;">gps_off</i> + % } + </td> + </tr> +% } +</tbody> +</table> diff --git a/templates/departures.html.ep b/templates/departures.html.ep index 25e752a..857be74 100644 --- a/templates/departures.html.ep +++ b/templates/departures.html.ep @@ -63,58 +63,12 @@ und maximal 120 Minuten nach Abfahrt möglich. % } </p> - <table class="striped"> - <tbody> - % my $orientation_bar_shown = param('train'); - % my $now_epoch = now()->epoch; - % for my $result (@{$results}) { - % my $td_class = ''; - % my $link_class = 'action-checkin'; - % if ($result->departure_is_cancelled) { - % $td_class = "cancelled"; - % $link_class = 'action-cancelled-from'; - % } - % if (not $orientation_bar_shown and $result->departure->epoch < $now_epoch) { - % $orientation_bar_shown = 1; - <tr> - <td> - </td> - <td> - — Anfragezeitpunkt — - </td> - <td> - </td> - </tr> - % } - <tr class="<%= $link_class %>" data-station="<%= $result->station_uic %>" data-train="<%= $result->train_id %>" data-tr="3"> - <td> - <a> - <%= $result->line %> - </a> - </td> - <td class="<%= $td_class %>"> - <a> - <%= $result->destination %> - </a> - </td> - <td class="<%= $td_class %>"> - % if ($result->departure_hidden) { - (<%= $result->departure->strftime('%H:%M') %>) - % } - % else { - %= $result->departure->strftime('%H:%M') - % } - % if ($result->departure_delay) { - (<%= sprintf('%+d', $result->departure_delay) %>) - % } - % elsif (not $result->has_realtime and $result->start->epoch < $now_epoch) { - <i class="material-icons" aria-label="Keine Echtzeitdaten vorhanden" style="font-size: 16px;">gps_off</i> - % } - </td> - </tr> - % } - </tbody> - </table> + % if ($hafas) { + %= include '_departures_hafas', results => $results; + % } + % else { + %= include '_departures_iris', results => $results; + % } </div> </div> diff --git a/templates/exception.html.ep b/templates/exception.html.ep index 290efc5..ec01ad2 100644 --- a/templates/exception.html.ep +++ b/templates/exception.html.ep @@ -21,7 +21,7 @@ %= DateTime->now(time_zone => 'Europe/Berlin')->strftime("%d/%b/%Y:%H:%M:%S %z") <br/><br/> Message: - %= (split(qr{\n}, $exception->message))[0] + %= ref($exception) ? (split(qr{\n}, $exception->message))[0] : $exception </p> </div> </div> |