diff options
| -rw-r--r-- | lib/DBInfoscreen/Controller/Stationboard.pm | 329 | 
1 files changed, 155 insertions, 174 deletions
| diff --git a/lib/DBInfoscreen/Controller/Stationboard.pm b/lib/DBInfoscreen/Controller/Stationboard.pm index 41f83c0..253cbcb 100644 --- a/lib/DBInfoscreen/Controller/Stationboard.pm +++ b/lib/DBInfoscreen/Controller/Stationboard.pm @@ -709,6 +709,154 @@ sub format_hafas_result_info {  	return ( $info, $moreinfo );  } +sub render_train { +	my ( $self, $result, $departure, $station_name ) = @_; + +	$departure->{route_pre_diff} = [ +		$self->json_route_diff( +			[ $result->route_pre ], +			[ $result->sched_route_pre ] +		) +	]; +	$departure->{route_post_diff} = [ +		$self->json_route_diff( +			[ $result->route_post ], +			[ $result->sched_route_post ] +		) +	]; + +	$departure->{trip_id} +	  = get_hafas_trip_id( $self->ua, $self->app->cache_iris_main, $result ); + +	if ( +		$departure->{wr_link} +		and not check_wagonorder_with_wings( +			$self->ua, $self->app->cache_iris_main, +			$result,   $departure->{wr_link} +		) +	  ) +	{ +		$departure->{wr_link} = undef; +	} + +	my ( $route_ts, $route_info ) = get_route_timestamps( +		$self->ua, +		$self->app->cache_iris_main, +		$self->app->cache_iris_rt, +		{ train => $result } +	); + +	# If a train number changes on the way, IRIS routes are incomplete, +	# whereas HAFAS data has all stops -> merge HAFAS stops into IRIS +	# stops. This is a rare case, one point where it can be observed is +	# the TGV service at Frankfurt/Karlsruhe/Mannheim. +	if ( $route_info +		and my @hafas_stations = @{ $route_info->{stations} // [] } ) +	{ +		if ( my @iris_stations = @{ $departure->{route_pre_diff} } ) { +			my @missing_pre; +			for my $station (@hafas_stations) { +				if ( +					List::MoreUtils::any { $_->{name} eq $station } +					@iris_stations +				  ) +				{ +					unshift( @{ $departure->{route_pre_diff} }, @missing_pre ); +					last; +				} +				push( +					@missing_pre, +					{ +						name  => $station, +						hafas => 1 +					} +				); +			} +		} +		if ( my @iris_stations = @{ $departure->{route_post_diff} } ) { +			my @missing_post; +			for my $station ( reverse @hafas_stations ) { +				if ( +					List::MoreUtils::any { $_->{name} eq $station } +					@iris_stations +				  ) +				{ +					push( @{ $departure->{route_post_diff} }, @missing_post ); +					last; +				} +				unshift( +					@missing_post, +					{ +						name  => $station, +						hafas => 1 +					} +				); +			} +		} +	} +	if ($route_ts) { +		for my $elem ( +			@{ $departure->{route_pre_diff} }, +			@{ $departure->{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; +		$departure->{messages}{him} = $him; +		for my $message ( @{$him} ) { +			if ( $message->{display} ) { +				push( @him_messages, [ $message->{header}, $message->{lead} ] ); +			} +		} +		for my $message ( @{ $departure->{moreinfo} // [] } ) { +			my $m = $message->[1]; +			@him_messages +			  = grep { $_->[0] !~ m{Information\. $m\.$} } @him_messages; +		} +		unshift( @{ $departure->{moreinfo} }, @him_messages ); +	} + +	my $linetype = 'bahn'; +	if ( $departure->{train_type} eq 'S' ) { +		$linetype = 'sbahn'; +	} +	elsif ($departure->{train_type} eq 'IC' +		or $departure->{train_type} eq 'ICE' +		or $departure->{train_type} eq 'EC' +		or $departure->{train_type} eq 'ECE' +		or $departure->{train_type} eq 'EN' ) +	{ +		$linetype = 'fern'; +	} +	elsif ($departure->{train_type} eq 'THA' +		or $departure->{train_type} eq 'TGV' +		or $departure->{train_type} eq 'FLX' +		or $departure->{train_type} eq 'NJ' ) +	{ +		$linetype = 'ext'; +	} +	elsif ( $departure->{train_line} +		and $departure->{train_line} =~ m{^S\d} ) +	{ +		$linetype = 'sbahn'; +	} + +	$self->render( +		'_train_details', +		departure    => $departure, +		linetype     => $linetype, +		icetype      => $self->app->ice_type_map->{ $departure->{train_no} }, +		dt_now       => DateTime->now( time_zone => 'Europe/Berlin' ), +		station_name => $station_name, +	); +} +  sub handle_result {  	my ( $self, $data ) = @_; @@ -727,6 +875,10 @@ sub handle_result {  	my $callback       = $self->param('callback');  	my $via            = $self->param('via'); +	if ( $self->param('ajax') ) { +		delete $self->stash->{layout}; +	} +  	if ( $template eq 'single' ) {  		if ( not @platforms ) {  			for my $result (@results) { @@ -1046,131 +1198,9 @@ sub handle_result {  				}  			);  			if ( $self->param('train') ) { -				$departures[-1]{route_pre_diff} = [ -					$self->json_route_diff( -						[ $result->route_pre ], -						[ $result->sched_route_pre ] -					) -				]; -				$departures[-1]{route_post_diff} = [ -					$self->json_route_diff( -						[ $result->route_post ], -						[ $result->sched_route_post ] -					) -				]; - -				$departures[-1]{trip_id} -				  = get_hafas_trip_id( $self->ua, $self->app->cache_iris_main, -					$result ); - -				if ( -					$departures[-1]{wr_link} -					and not check_wagonorder_with_wings( -						$self->ua, $self->app->cache_iris_main, -						$result,   $departures[-1]{wr_link} -					) -				  ) -				{ -					$departures[-1]{wr_link} = undef; -				} - -				my ( $route_ts, $route_info ) = get_route_timestamps( -					$self->ua, -					$self->app->cache_iris_main, -					$self->app->cache_iris_rt, -					{ train => $result } -				); - -             # If a train number changes on the way, IRIS routes are incomplete, -             # whereas HAFAS data has all stops -> merge HAFAS stops into IRIS -             # stops. This is a rare case, one point where it can be observed is -             # the TGV service at Frankfurt/Karlsruhe/Mannheim. -				if ( $route_info -					and my @hafas_stations -					= @{ $route_info->{stations} // [] } ) -				{ -					if ( my @iris_stations -						= @{ $departures[-1]{route_pre_diff} } ) -					{ -						my @missing_pre; -						for my $station (@hafas_stations) { -							if ( -								List::MoreUtils::any { $_->{name} eq $station } -								@iris_stations -							  ) -							{ -								unshift( -									@{ $departures[-1]{route_pre_diff} }, -									@missing_pre -								); -								last; -							} -							push( -								@missing_pre, -								{ -									name  => $station, -									hafas => 1 -								} -							); -						} -					} -					if ( my @iris_stations -						= @{ $departures[-1]{route_post_diff} } ) -					{ -						my @missing_post; -						for my $station ( reverse @hafas_stations ) { -							if ( -								List::MoreUtils::any { $_->{name} eq $station } -								@iris_stations -							  ) -							{ -								push( -									@{ $departures[-1]{route_post_diff} }, -									@missing_post -								); -								last; -							} -							unshift( -								@missing_post, -								{ -									name  => $station, -									hafas => 1 -								} -							); -						} -					} -				} -				if ($route_ts) { -					for my $elem ( -						@{ $departures[-1]{route_pre_diff} }, -						@{ $departures[-1]{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; -					$departures[-1]{messages}{him} = $him; -					for my $message ( @{$him} ) { -						if ( $message->{display} ) { -							push( @him_messages, -								[ $message->{header}, $message->{lead} ] ); -						} -					} -					for my $message ( @{ $departures[-1]{moreinfo} // [] } ) { -						my $m = $message->[1]; -						@him_messages -						  = grep { $_->[0] !~ m{Information\. $m\.$} } -						  @him_messages; -					} -					unshift( @{ $departures[-1]{moreinfo} }, @him_messages ); -				} +				$self->render_train( $result, $departures[-1], +					$data->{station_name} // $self->stash('station') ); +				return;  			}  		}  		else { @@ -1202,10 +1232,6 @@ sub handle_result {  		}  	} -	if ( $self->param('ajax') ) { -		delete $self->stash->{layout}; -	} -  	if ( $template eq 'json' ) {  		$self->res->headers->access_control_allow_origin(q{*});  		my $json = $self->render_to_string( @@ -1243,51 +1269,6 @@ sub handle_result {  			format => 'text',  		);  	} -	elsif ( my $train = $self->param('train') ) { - -		my ($departure) = @departures; - -		if ($departure) { - -			my $linetype = 'bahn'; -			if ( $departure->{train_type} eq 'S' ) { -				$linetype = 'sbahn'; -			} -			elsif ($departure->{train_type} eq 'IC' -				or $departure->{train_type} eq 'ICE' -				or $departure->{train_type} eq 'EC' -				or $departure->{train_type} eq 'ECE' -				or $departure->{train_type} eq 'EN' ) -			{ -				$linetype = 'fern'; -			} -			elsif ($departure->{train_type} eq 'THA' -				or $departure->{train_type} eq 'TGV' -				or $departure->{train_type} eq 'FLX' -				or $departure->{train_type} eq 'NJ' ) -			{ -				$linetype = 'ext'; -			} -			elsif ( $departure->{train_line} -				and $departure->{train_line} =~ m{^S\d} ) -			{ -				$linetype = 'sbahn'; -			} - -			$self->render( -				'_train_details', -				departure => $departure, -				linetype  => $linetype, -				icetype => $self->app->ice_type_map->{ $departure->{train_no} }, -				dt_now  => DateTime->now( time_zone => 'Europe/Berlin' ), -				station_name => $data->{station_name} -				  // $self->stash('station'), -			); -		} -		else { -			$self->render('not_found'); -		} -	}  	else {  		my $station_name = $data->{station_name} // $self->stash('station');  		$self->render( | 
