stationboard: add HAFAS support

This commit is contained in:
Derf Null 2023-03-27 21:03:25 +02:00
parent 3acee2b285
commit c3c7a0c78b
No known key found for this signature in database
GPG key ID: 19E6E524EBB177BA
6 changed files with 153 additions and 66 deletions

View file

@ -795,22 +795,56 @@ sub station {
my $train = $self->param('train'); my $train = $self->param('train');
$self->render_later; $self->render_later;
$self->iris->get_departures_p(
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, station => $station,
lookbehind => 120, lookbehind => 120,
lookahead => 30, lookahead => 30,
with_related => 1 with_related => 1,
)->then( );
}
$promise->then(
sub { sub {
my ($status) = @_; my ($status) = @_;
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 # You can't check into a train which terminates here
my @results = grep { $_->departure } @{ $status->{results} }; @results = grep { $_->departure } @{ $status->{results} };
@results = map { $_->[0] } @results = map { $_->[0] }
sort { $b->[1] <=> $a->[1] } sort { $b->[1] <=> $a->[1] }
map { [ $_, $_->departure->epoch // $_->sched_departure->epoch ] } map {
@results; [ $_, $_->departure->epoch // $_->sched_departure->epoch ]
} @results;
}
my $connections_p; my $connections_p;
if ($train) { if ($train) {
@ -842,6 +876,7 @@ sub station {
'departures', 'departures',
eva => $status->{station_eva}, eva => $status->{station_eva},
results => \@results, results => \@results,
hafas => $use_hafas,
station => $status->{station_name}, station => $status->{station_name},
related_stations => $status->{related_stations}, related_stations => $status->{related_stations},
connections => $connecting_trains, connections => $connecting_trains,
@ -856,6 +891,7 @@ sub station {
'departures', 'departures',
eva => $status->{station_eva}, eva => $status->{station_eva},
results => \@results, results => \@results,
hafas => $use_hafas,
station => $status->{station_name}, station => $status->{station_name},
related_stations => $status->{related_stations}, related_stations => $status->{related_stations},
title => "travelynx: $status->{station_name}", title => "travelynx: $status->{station_name}",
@ -870,6 +906,7 @@ sub station {
'departures', 'departures',
eva => $status->{station_eva}, eva => $status->{station_eva},
results => \@results, results => \@results,
hafas => $use_hafas,
station => $status->{station_name}, station => $status->{station_name},
related_stations => $status->{related_stations}, related_stations => $status->{related_stations},
title => "travelynx: $status->{station_name}", title => "travelynx: $status->{station_name}",

View file

@ -91,7 +91,7 @@ sub get_departures_p {
station => $opt{eva}, station => $opt{eva},
datetime => $when, datetime => $when,
duration => $opt{lookahead}, duration => $opt{lookahead},
results => 120, results => 300,
cache => $self->{realtime_cache}, cache => $self->{realtime_cache},
promise => 'Mojo::Promise', promise => 'Mojo::Promise',
user_agent => $self->{user_agent}->request_timeout(5), user_agent => $self->{user_agent}->request_timeout(5),

View file

@ -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>

View file

@ -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>

View file

@ -63,58 +63,12 @@
und maximal 120 Minuten nach Abfahrt möglich. und maximal 120 Minuten nach Abfahrt möglich.
% } % }
</p> </p>
<table class="striped"> % if ($hafas) {
<tbody> %= include '_departures_hafas', results => $results;
% 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 { % else {
%= $result->departure->strftime('%H:%M') %= include '_departures_iris', results => $results;
% } % }
% 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>
</div> </div>
</div> </div>

View file

@ -21,7 +21,7 @@
%= DateTime->now(time_zone => 'Europe/Berlin')->strftime("%d/%b/%Y:%H:%M:%S %z") %= DateTime->now(time_zone => 'Europe/Berlin')->strftime("%d/%b/%Y:%H:%M:%S %z")
<br/><br/> <br/><br/>
Message: Message:
%= (split(qr{\n}, $exception->message))[0] %= ref($exception) ? (split(qr{\n}, $exception->message))[0] : $exception
</p> </p>
</div> </div>
</div> </div>