Unverified Commit c3c7a0c7 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

stationboard: add HAFAS support

parent 3acee2b2
Loading
Loading
Loading
Loading
+49 −12
Original line number Diff line number Diff line
@@ -795,22 +795,56 @@ sub station {
	my $train   = $self->param('train');

	$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,
			lookbehind   => 120,
			lookahead    => 30,
		with_related => 1
	)->then(
			with_related => 1,
		);
	}
	$promise->then(
		sub {
			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
			my @results = grep { $_->departure } @{ $status->{results} };
				@results = grep { $_->departure } @{ $status->{results} };

				@results = map { $_->[0] }
				  sort { $b->[1] <=> $a->[1] }
			  map { [ $_, $_->departure->epoch // $_->sched_departure->epoch ] }
			  @results;
				  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}",
+1 −1
Original line number Diff line number Diff line
@@ -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),
+44 −0
Original line number Diff line number Diff line
<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>
+52 −0
Original line number Diff line number Diff line
<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>
+6 −52
Original line number Diff line number Diff line
@@ -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') %>)
		% if ($hafas) {
			%= include '_departures_hafas', results => $results;
		% }
		% 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>
			%= include '_departures_iris', results => $results;
		% }
			</tbody>
		</table>
	</div>
</div>

Loading