Use async IRIS API for /s/
This commit is contained in:
parent
116becccb0
commit
bb6acc0c6b
2 changed files with 131 additions and 35 deletions
|
@ -604,45 +604,50 @@ sub station {
|
||||||
my $station = $self->stash('station');
|
my $station = $self->stash('station');
|
||||||
my $train = $self->param('train');
|
my $train = $self->param('train');
|
||||||
|
|
||||||
my $status = $self->iris->get_departures(
|
$self->render_later;
|
||||||
|
$self->iris->get_departures_p(
|
||||||
station => $station,
|
station => $station,
|
||||||
lookbehind => 120,
|
lookbehind => 120,
|
||||||
lookahead => 30,
|
lookahead => 30,
|
||||||
with_related => 1
|
with_related => 1
|
||||||
);
|
)->then(
|
||||||
|
sub {
|
||||||
|
my ($status) = @_;
|
||||||
|
|
||||||
if ( $status->{errstr} ) {
|
# You can't check into a train which terminates here
|
||||||
$self->render(
|
my @results = grep { $_->departure } @{ $status->{results} };
|
||||||
'landingpage',
|
|
||||||
version => $self->app->config->{version} // 'UNKNOWN',
|
|
||||||
with_autocomplete => 1,
|
|
||||||
with_geolocation => 1,
|
|
||||||
error => $status->{errstr}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
# You can't check into a train which terminates here
|
|
||||||
my @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 { [ $_, $_->departure->epoch // $_->sched_departure->epoch ] }
|
||||||
@results;
|
@results;
|
||||||
|
|
||||||
if ($train) {
|
if ($train) {
|
||||||
@results
|
@results
|
||||||
= grep { $_->type . ' ' . $_->train_no eq $train } @results;
|
= grep { $_->type . ' ' . $_->train_no eq $train } @results;
|
||||||
|
}
|
||||||
|
|
||||||
|
$self->render(
|
||||||
|
'departures',
|
||||||
|
eva => $status->{station_eva},
|
||||||
|
results => \@results,
|
||||||
|
station => $status->{station_name},
|
||||||
|
related_stations => $status->{related_stations},
|
||||||
|
title => "travelynx: $status->{station_name}",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
)->catch(
|
||||||
$self->render(
|
sub {
|
||||||
'departures',
|
my ($status) = @_;
|
||||||
eva => $status->{station_eva},
|
$self->render(
|
||||||
results => \@results,
|
'landingpage',
|
||||||
station => $status->{station_name},
|
version => $self->app->config->{version} // 'UNKNOWN',
|
||||||
related_stations => $status->{related_stations},
|
with_autocomplete => 1,
|
||||||
title => "travelynx: $status->{station_name}",
|
with_geolocation => 1,
|
||||||
);
|
error => $status->{errstr}
|
||||||
}
|
);
|
||||||
|
}
|
||||||
|
)->wait;
|
||||||
$self->users->mark_seen( uid => $self->current_user->{id} );
|
$self->users->mark_seen( uid => $self->current_user->{id} );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ use 5.020;
|
||||||
|
|
||||||
use utf8;
|
use utf8;
|
||||||
|
|
||||||
|
use Mojo::Promise;
|
||||||
|
use Mojo::UserAgent;
|
||||||
use Travel::Status::DE::IRIS;
|
use Travel::Status::DE::IRIS;
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
|
@ -21,8 +23,8 @@ sub new {
|
||||||
sub get_departures {
|
sub get_departures {
|
||||||
my ( $self, %opt ) = @_;
|
my ( $self, %opt ) = @_;
|
||||||
my $station = $opt{station};
|
my $station = $opt{station};
|
||||||
my $lookbehind = $opt{lookbehind} // 180;
|
my $lookbehind = $opt{lookbehind} // 180;
|
||||||
my $lookahead = $opt{lookahead} // 30;
|
my $lookahead = $opt{lookahead} // 30;
|
||||||
my $with_related = $opt{with_related} // 0;
|
my $with_related = $opt{with_related} // 0;
|
||||||
|
|
||||||
my @station_matches
|
my @station_matches
|
||||||
|
@ -48,8 +50,8 @@ sub get_departures {
|
||||||
with_related => $with_related,
|
with_related => $with_related,
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
results => [ $status->results ],
|
results => [ $status->results ],
|
||||||
errstr => $status->errstr,
|
errstr => $status->errstr,
|
||||||
station_ds100 =>
|
station_ds100 =>
|
||||||
( $status->station ? $status->station->{ds100} : undef ),
|
( $status->station ? $status->station->{ds100} : undef ),
|
||||||
station_eva =>
|
station_eva =>
|
||||||
|
@ -74,6 +76,95 @@ sub get_departures {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub get_departures_p {
|
||||||
|
my ( $self, %opt ) = @_;
|
||||||
|
my $station = $opt{station};
|
||||||
|
my $lookbehind = $opt{lookbehind} // 180;
|
||||||
|
my $lookahead = $opt{lookahead} // 30;
|
||||||
|
my $with_related = $opt{with_related} // 0;
|
||||||
|
|
||||||
|
my @station_matches
|
||||||
|
= Travel::Status::DE::IRIS::Stations::get_station($station);
|
||||||
|
|
||||||
|
if ( @station_matches == 1 ) {
|
||||||
|
$station = $station_matches[0][0];
|
||||||
|
my $promise = Mojo::Promise->new;
|
||||||
|
Travel::Status::DE::IRIS->new_p(
|
||||||
|
station => $station,
|
||||||
|
main_cache => $self->{main_cache},
|
||||||
|
realtime_cache => $self->{realtime_cache},
|
||||||
|
keep_transfers => 1,
|
||||||
|
lookbehind => 20,
|
||||||
|
datetime => DateTime->now( time_zone => 'Europe/Berlin' )
|
||||||
|
->subtract( minutes => $lookbehind ),
|
||||||
|
lookahead => $lookbehind + $lookahead,
|
||||||
|
lwp_options => {
|
||||||
|
timeout => 10,
|
||||||
|
agent => 'travelynx/'
|
||||||
|
. $self->{version}
|
||||||
|
. ' +https://travelynx.de',
|
||||||
|
},
|
||||||
|
with_related => $with_related,
|
||||||
|
promise => 'Mojo::Promise',
|
||||||
|
user_agent => Mojo::UserAgent->new,
|
||||||
|
get_station => \&Travel::Status::DE::IRIS::Stations::get_station,
|
||||||
|
meta => Travel::Status::DE::IRIS::Stations::get_meta(),
|
||||||
|
)->then(
|
||||||
|
sub {
|
||||||
|
my ($status) = @_;
|
||||||
|
$promise->resolve(
|
||||||
|
{
|
||||||
|
results => [ $status->results ],
|
||||||
|
errstr => $status->errstr,
|
||||||
|
station_ds100 => (
|
||||||
|
$status->station
|
||||||
|
? $status->station->{ds100}
|
||||||
|
: undef
|
||||||
|
),
|
||||||
|
station_eva => (
|
||||||
|
$status->station ? $status->station->{uic} : undef
|
||||||
|
),
|
||||||
|
station_name => (
|
||||||
|
$status->station ? $status->station->{name} : undef
|
||||||
|
),
|
||||||
|
related_stations => [ $status->related_stations ],
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
)->catch(
|
||||||
|
sub {
|
||||||
|
my ($err) = @_;
|
||||||
|
$promise->reject(
|
||||||
|
{
|
||||||
|
results => [],
|
||||||
|
errstr => "Error in promise: $err",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
)->wait;
|
||||||
|
return $promise;
|
||||||
|
}
|
||||||
|
elsif ( @station_matches > 1 ) {
|
||||||
|
return Mojo::Promise->reject(
|
||||||
|
{
|
||||||
|
results => [],
|
||||||
|
errstr => 'Mehrdeutiger Stationsname. Mögliche Eingaben: '
|
||||||
|
. join( q{, }, map { $_->[1] } @station_matches ),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return Mojo::Promise->reject(
|
||||||
|
{
|
||||||
|
results => [],
|
||||||
|
errstr => 'Unbekannte Station',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sub route_diff {
|
sub route_diff {
|
||||||
my ( $self, $train ) = @_;
|
my ( $self, $train ) = @_;
|
||||||
my @json_route;
|
my @json_route;
|
||||||
|
|
Loading…
Reference in a new issue