diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2020-09-07 20:49:45 +0200 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2020-09-07 20:49:45 +0200 | 
| commit | 33be560292ac02595f3fb386d5785d1f2b690dba (patch) | |
| tree | cfdc6e26a5f522f3e3157e7e61da75d922299b9f | |
| parent | d2f3efbd0c2839c287a6e9b43b5383816b162a56 (diff) | |
working train intersection demo \o/
| -rw-r--r-- | lib/DBInfoscreen.pm | 3 | ||||
| -rw-r--r-- | lib/DBInfoscreen/Controller/Map.pm | 117 | ||||
| -rw-r--r-- | lib/DBInfoscreen/Helper/HAFAS.pm | 60 | ||||
| -rw-r--r-- | templates/layouts/app.html.ep | 2 | ||||
| -rw-r--r-- | templates/route_map.html.ep | 4 | ||||
| -rw-r--r-- | templates/trainsearch.html.ep | 29 | 
6 files changed, 189 insertions, 26 deletions
| diff --git a/lib/DBInfoscreen.pm b/lib/DBInfoscreen.pm index 72be819..3b3d5c1 100644 --- a/lib/DBInfoscreen.pm +++ b/lib/DBInfoscreen.pm @@ -351,6 +351,9 @@ sub startup {  	$r->get('/map/:tripid/:lineno')->to('map#route');  	$r->get('/intersection/:trips')->to('map#intersection'); +	$r->get('/map')->to('map#search_form'); +	$r->get('/_trainsearch')->to('map#search'); +  	$self->defaults( layout => 'app' );  	$r->get('/')->to('stationboard#handle_request'); diff --git a/lib/DBInfoscreen/Controller/Map.pm b/lib/DBInfoscreen/Controller/Map.pm index 73d8df5..8a84e16 100644 --- a/lib/DBInfoscreen/Controller/Map.pm +++ b/lib/DBInfoscreen/Controller/Map.pm @@ -274,7 +274,7 @@ sub estimate_train_positions2 {  		}  	} -	if ( not $next_stop ) { +	if ( @route and not $next_stop ) {  		@train_positions = ( [ $route[-1]{lat}, $route[-1]{lon} ] );  		$next_stop       = {  			type    => 'present', @@ -313,13 +313,15 @@ sub estimate_train_intersection {  		my $arr2 = $route2[ $i2 + 1 ]{arr};  		if ( not( $dep1 and $arr1 ) ) { -			say "skip 1 $route1[$i1]{name}"; + +			#say "skip 1 $route1[$i1]{name}";  			$i1++;  			next;  		}  		if ( not( $dep2 and $arr2 ) ) { -			say "skip 2 $route2[$i2]{name}"; + +			#say "skip 2 $route2[$i2]{name}";  			$i2++;  			next;  		} @@ -857,4 +859,113 @@ sub ajax_route {  	)->wait;  } +sub search { +	my ($self) = @_; + +	my $t1 = $self->param('train1'); +	my $t2 = $self->param('train2'); + +	my $t1_data; +	my $t2_data; + +	my $now       = DateTime->now( time_zone => 'Europe/Berlin' ); +	my $date_yy   = $now->strftime('%d.%m.%y'); +	my $date_yyyy = $now->strftime('%d.%m.%Y'); + +	# Doesn't seem to matter -- so far, HAFAS is happy as long as the date part +	# starts with a number. HAFAS-internal tripIDs use this format (withouth +	# leading zero for day of month < 10) though, so let's stick with it. +	my $date_map = $now->strftime('%d%m%Y'); + +	if ( $t1 and $t1 =~ m{^\S+\s+\d+$} ) { +		$t1_data = $self->hafas->trainsearch( +			train_no  => $t1, +			date_yy   => $date_yy, +			date_yyyy => $date_yyyy +		); +	} +	else { +		$self->render( +			'trainsearch', +			title     => 'Fahrtverlauf', +			hide_opts => 1, +			error     => $t1 +			? "Züge müssen im Format 'Zugtyp Nummer' angegeben werden, z.B. 'RE 1234'" +			: undef, +		); +		return; +	} + +	if ( $t2 and $t2 =~ m{^\S+\s+\d+$} ) { +		$t2_data = $self->hafas->trainsearch( train_no => $t2 ); +	} +	elsif ($t2) { +		$self->render( +			'trainsearch', +			title     => 'Fahrtverlauf', +			hide_opts => 1, +			error => +"Züge müssen im Format 'Zugtyp Nummer' angegeben werden, z.B. 'RE 1234'", +		); +		return; +	} + +	if ( not $t1_data ) { +		$self->render( +			'trainsearch', +			title     => 'Fahrtverlauf', +			hide_opts => 1, +			error     => "Zug $t1 nicht gefunden" +		); +		return; +	} + +	if ( $t2 and not $t2_data ) { +		$self->render( +			'trainsearch', +			title     => 'Fahrtverlauf', +			hide_opts => 1, +			error     => "Zug $t2 nicht gefunden" +		); +		return; +	} + +	if ( $t1 and not $t2 ) { +		$self->redirect_to( +			sprintf( +				"/map/1|%d|%d|%d|%s/0", +				$t1_data->{id},   $t1_data->{cycle}, +				$t1_data->{pool}, $date_map +			) +		); +	} +	elsif ( $t1 and $t2 ) { +		$self->redirect_to( +			sprintf( +				"/intersection/1|%d|%d|%d|%s,0;1|%d|%d|%d|%s,0", +				$t1_data->{id},   $t1_data->{cycle}, $t1_data->{pool}, +				$date_map,        $t2_data->{id},    $t2_data->{cycle}, +				$t2_data->{pool}, $date_map +			) +		); +	} +	else { +		$self->render( +			'trainsearch', +			title     => 'Fahrtverlauf', +			hide_opts => 1, +		); +	} +} + +sub search_form { +	my ($self) = @_; + +	$self->render( +		'trainsearch', +		title     => 'Fahrtverlauf', +		hide_opts => 1, +	); +} +  1; diff --git a/lib/DBInfoscreen/Helper/HAFAS.pm b/lib/DBInfoscreen/Helper/HAFAS.pm index 8007ff4..f7df0f7 100644 --- a/lib/DBInfoscreen/Helper/HAFAS.pm +++ b/lib/DBInfoscreen/Helper/HAFAS.pm @@ -151,35 +151,27 @@ sub hafas_xml_req {  	return $ret;  } -sub get_route_timestamps { +sub trainsearch {  	my ( $self, %opt ) = @_;  	my $base  	  = 'https://reiseauskunft.bahn.de/bin/trainsearch.exe/dn?L=vs_json&start=yes&rt=1'; -	my ( $date_yy, $date_yyyy, $train_no, $train_origin ); -	if ( $opt{train} ) { -		$date_yy      = $opt{train}->start->strftime('%d.%m.%y'); -		$date_yyyy    = $opt{train}->start->strftime('%d.%m.%Y'); -		$train_no     = $opt{train}->type . ' ' . $opt{train}->train_no; -		$train_origin = $opt{train}->origin; -	} -	else { +	if ( not $opt{date_yy} ) {  		my $now = DateTime->now( time_zone => 'Europe/Berlin' ); -		$date_yy   = $now->strftime('%d.%m.%y'); -		$date_yyyy = $now->strftime('%d.%m.%Y'); -		$train_no  = $opt{train_no}; +		$opt{date_yy}   = $now->strftime('%d.%m.%y'); +		$opt{date_yyyy} = $now->strftime('%d.%m.%Y');  	}  	my $trainsearch = $self->hafas_json_req( $self->{main_cache}, -		"${base}&date=${date_yy}&trainname=${train_no}" ); +		"${base}&date=$opt{date_yy}&trainname=$opt{train_no}" );  	if ( not $trainsearch ) {  		return;  	}  	# Fallback: Take first result -	my $trainlink = $trainsearch->{suggestions}[0]{trainLink}; +	my $result = $trainsearch->{suggestions}[0];  	# Try finding a result for the current date  	for my $suggestion ( @{ $trainsearch->{suggestions} // [] } ) { @@ -187,8 +179,8 @@ sub get_route_timestamps {         # Drunken API, sail with care. Both date formats are used interchangeably  		if (  			exists $suggestion->{depDate} -			and (  $suggestion->{depDate} eq $date_yy -				or $suggestion->{depDate} eq $date_yyyy ) +			and (  $suggestion->{depDate} eq $opt{date_yy} +				or $suggestion->{depDate} eq $opt{date_yyyy} )  		  )  		{  			# Train numbers are not unique, e.g. IC 149 refers both to the @@ -197,28 +189,52 @@ sub get_route_timestamps {  			# requests with the stationFilter=80 parameter.  Checking the origin  			# station seems to be the more generic solution, so we do that  			# instead. -			if ( $train_origin and $suggestion->{dep} eq $train_origin ) { -				$trainlink = $suggestion->{trainLink}; +			if (    $opt{train_origin} +				and $suggestion->{dep} eq $opt{train_origin} ) +			{ +				$result = $suggestion;  				last;  			}  		}  	} -	if ( not $trainlink ) { +	return $result; +} + +sub get_route_timestamps { +	my ( $self, %opt ) = @_; + +	if ( $opt{train} ) { +		$opt{date_yy}      = $opt{train}->start->strftime('%d.%m.%y'); +		$opt{date_yyyy}    = $opt{train}->start->strftime('%d.%m.%Y'); +		$opt{train_no}     = $opt{train}->type . ' ' . $opt{train}->train_no; +		$opt{train_origin} = $opt{train}->origin; +	} +	else { +		my $now = DateTime->now( time_zone => 'Europe/Berlin' ); +		$opt{date_yy}   = $now->strftime('%d.%m.%y'); +		$opt{date_yyyy} = $now->strftime('%d.%m.%Y'); +	} + +	my $trainsearch_result = $self->trainsearch(%opt); + +	if ( not $trainsearch_result ) {  		return;  	} -	$base = 'https://reiseauskunft.bahn.de/bin/traininfo.exe/dn'; +	my $trainlink = $trainsearch_result->{trainLink}; + +	my $base = 'https://reiseauskunft.bahn.de/bin/traininfo.exe/dn';  	my $traininfo = $self->hafas_json_req( $self->{realtime_cache}, -		"${base}/${trainlink}?rt=1&date=${date_yy}&L=vs_json" ); +		"${base}/${trainlink}?rt=1&date=$opt{date_yy}&L=vs_json" );  	if ( not $traininfo or $traininfo->{error} ) {  		return;  	}  	my $traindelay = $self->hafas_xml_req( $self->{realtime_cache}, -		"${base}/${trainlink}?rt=1&date=${date_yy}&L=vs_java3" ); +		"${base}/${trainlink}?rt=1&date=$opt{date_yy}&L=vs_java3" );  	my $ret = {}; diff --git a/templates/layouts/app.html.ep b/templates/layouts/app.html.ep index fc81ba3..f32fdb2 100644 --- a/templates/layouts/app.html.ep +++ b/templates/layouts/app.html.ep @@ -90,7 +90,7 @@  <div class="container">  % if (my $error = stash 'error') { -<div class="error"><strong>Backend-Fehler:</strong> +<div class="error"><strong>Fehler:</strong>  <pre>  %= $error  </pre> diff --git a/templates/route_map.html.ep b/templates/route_map.html.ep index 1ba96bc..5bc7fd6 100644 --- a/templates/route_map.html.ep +++ b/templates/route_map.html.ep @@ -86,6 +86,10 @@ Die eingezeichnete Route stammt aus dem HAFAS und ist im Detail oft  fehlerbehaftet.<br/>  Die Zugposition auf der Karte ist eine DBF-eigene Schätzung und kann erheblich  von den tatsächlichen Gegebenheiten abweichen. +% if (stash('intersection')) { +<br/>In dieser Ansicht sind Live-Updates der Zug- und Begegnungspositionen noch +nicht implementiert. +% }  </div>  % if (my $op = stash('operator')) { diff --git a/templates/trainsearch.html.ep b/templates/trainsearch.html.ep new file mode 100644 index 0000000..5d6d3f9 --- /dev/null +++ b/templates/trainsearch.html.ep @@ -0,0 +1,29 @@ +<div class="container"> +  <div class="input-field"> +    %= form_for _trainsearch => begin +      <div> +        <div class="field"> +          <div class="desc">Zug</div> +          <div> +            %= text_field 'train1', placeholder => 'RE 1234', id => 'train1_input', autofocus => 'autofocus' +          </div> +        </div> +        <div class="field"> +          %= submit_button 'Strecke zeigen' +        </div> +        <div class="break"></div> +        <div class="field"> +          <div class="desc"> +            Zweiter Zug (optional) +          </div> +          <div> +            %= text_field 'train2', placeholder => 'S 5678', id => 'train2_input' +          </div> +        </div> +        <div class="field"> +          %= submit_button 'Begegnungen suchen (beta)' +        </div> +      </div> +    % end +  </div> +</div> | 
