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

support multiple via stops

parent 7285e2ed
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -77,12 +77,8 @@ if ($list_services) {

parse_mot_options();

my ( $from_stop, $via_stop, $to_stop ) = @ARGV;

if ( $via_stop and not $to_stop ) {
	$to_stop  = $via_stop;
	$via_stop = undef;
}
my ( $from_stop, @via_stops ) = @ARGV;
my $to_stop = pop @via_stops;

if ( not( $from_stop and $to_stop ) ) {
	show_help(1);
@@ -91,7 +87,7 @@ if ( not( $from_stop and $to_stop ) ) {
my %opt = (
	service        => $service,
	from_stop      => $from_stop,
	via_stop       => $via_stop,
	via_stops      => \@via_stops,
	to_stop        => $to_stop,
	excluded_mots  => \@excluded_mots,
	exclusive_mots => \@exclusive_mots,
@@ -456,7 +452,7 @@ hafas - Interface to HAFAS (e.g. Deutsche Bahn) itinerary services
=head1 SYNOPSIS

B<hafas> [B<-d> I<date>] [B<-t> I<time>] [B<-m> I<motlist>]
[B<-s> I<service>] [B<-l> I<language>] [B<-v>] I<from> [I<via>] I<to>
[B<-s> I<service>] [B<-l> I<language>] [B<-v>] I<from> [I<via> ...] I<to>

=head1 VERSION

+22 −31
Original line number Diff line number Diff line
@@ -218,7 +218,7 @@ sub new {
		messages       => [],
		results        => [],
		from_stop      => $conf{from_stop},
		via_stop       => $conf{via_stop},
		via_stops      => $conf{via_stops} // [],
		to_stop        => $conf{to_stop},
		ua             => $ua,
		now            => $now,
@@ -232,41 +232,21 @@ sub new {
	my $time    = ( $conf{datetime} // $now )->strftime('%H%M%S');
	my $outFrwd = $conf{arrival} ? \0 : undef;

	my ( $from_lid, $via_lid, $to_lid );
	if ( $self->{from_stop} =~ m{ ^ [0-9]+ $ }x ) {
		$from_lid = 'A=1@L=' . $self->{from_stop} . '@';
	}
	else {
		$from_lid = 'A=1@O=' . $self->{from_stop} . '@';
	}
	if ( $self->{to_stop} =~ m{ ^ [0-9]+ $ }x ) {
		$to_lid = 'A=1@L=' . $self->{to_stop} . '@';
	}
	else {
		$to_lid = 'A=1@O=' . $self->{to_stop} . '@';
	}
	if ( $self->{via_stop} ) {
		if ( $self->{via_stop} =~ m{ ^ [0-9]+ $ }x ) {
			$via_lid = 'A=1@L=' . $self->{via_stop} . '@';
		}
		else {
			$via_lid = 'A=1@O=' . $self->{via_stop} . '@';
		}
	}
	my @via_locs = map { $self->stop_to_hafas($_) } @{ $self->{via_stops} };

	$req = {
		svcReqL => [
			{
				meth => 'TripSearch',
				req  => {
					depLocL    => [ { lid => $from_lid } ],
					arrLocL    => [ { lid => $to_lid } ],
					depLocL => [ $self->stop_to_hafas( $self->{from_stop} ) ],
					arrLocL => [ $self->stop_to_hafas( $self->{to_stop} ) ],
					numF    => 6,
					maxChg  => $conf{max_change},
					minChgTime => undef,
					outFrwd    => $outFrwd,
					viaLocL    => $via_lid
					? [ { loc => { lid => $via_lid } } ]
					viaLocL    => @via_locs
					? [ map { { loc => $_ } } @via_locs ]
					: undef,
					trfReq => {
						cType    => 'PK',
@@ -425,6 +405,17 @@ sub mot_mask {
	return $mot_mask;
}

sub stop_to_hafas {
	my ( $self, $stop ) = @_;

	if ( $stop =~ m{ ^ [0-9]+ $ }x ) {
		return { lid => 'A=1@L=' . $stop . '@' };
	}
	else {
		return { lid => 'A=1@O=' . $stop . '@' };
	}
}

sub post_with_cache {
	my ( $self, $url ) = @_;
	my $cache = $self->{cache};
@@ -720,10 +711,10 @@ must be specified either by name or by EVA ID (e.g. 8000080 for Dortmund Hbf).
Destination stop, e.g. "Essen HBf" or "Alfredusbad, Essen (Ruhr)". The stop
must be specified either by name or by EVA ID (e.g. 8000080 for Dortmund Hbf).

=item B<via_stop> => I<stop>
=item B<via_stops> => [I<stop1>, I<stop2>, ...]

Only return connections that pass I<stop>. It must be specified either by name
or by EVA ID (e.g. 8000080 for Dortmund Hbf).
Only return connections that pass all specified stops. Individual stops are
identified by name or by EVA ID (e.g. 8000080 for Dortmund Hbf).

=item B<arrival> => I<bool>