summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rwxr-xr-xlib/Travelynx.pm84
1 files changed, 83 insertions, 1 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index acf82e0..e71ad9e 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -1917,6 +1917,67 @@ sub startup {
);
$self->helper(
+ 'get_hafas_tripid_p' => sub {
+ my ( $self, $train ) = @_;
+
+ my $promise = Mojo::Promise->new;
+ my $cache = $self->app->cache_iris_main;
+ my $eva = $train->station_uic;
+
+ my $dep_ts = DateTime->now( time_zone => 'Europe/Berlin' );
+ my $url
+ = "https://2.db.transport.rest/stations/${eva}/departures?duration=5&when=$dep_ts";
+
+ if ( $train->sched_departure ) {
+ $dep_ts = $train->sched_departure->epoch;
+ $url
+ = "https://2.db.transport.rest/stations/${eva}/departures?duration=5&when=$dep_ts";
+ }
+ elsif ( $train->sched_arrival ) {
+ $dep_ts = $train->sched_arrival->epoch;
+ $url
+ = "https://2.db.transport.rest/stations/${eva}/arrivals?duration=5&when=$dep_ts";
+ }
+
+ if ( my $content = $cache->get($url) ) {
+ $promise->resolve($content);
+ return $promise;
+ }
+
+ $self->ua->request_timeout(5)->get_p(
+ $url => {
+ 'User-Agent' => 'travelynx/' . $self->app->config->{version}
+ }
+ )->then(
+ sub {
+ my ($tx) = @_;
+ my $body = decode( 'utf-8', $tx->res->body );
+ my $json = JSON->new->decode($body);
+
+ for my $result ( @{$json} ) {
+ if ( $result->{line}
+ and $result->{line}{fahrtNr} == $train->train_no )
+ {
+ my $trip_id = $result->{tripId};
+ $cache->set( $url, $trip_id );
+ $promise->resolve($trip_id);
+ return;
+ }
+ }
+ $promise->reject;
+ }
+ )->catch(
+ sub {
+ my ($err) = @_;
+ $promise->reject($err);
+ }
+ )->wait;
+
+ return $promise;
+ }
+ );
+
+ $self->helper(
'get_hafas_json_p' => sub {
my ( $self, $url ) = @_;
@@ -2035,7 +2096,7 @@ sub startup {
my $journey = $db->select(
'in_transit_str',
- [ 'arr_eva', 'dep_eva', 'route' ],
+ [ 'arr_eva', 'dep_eva', 'route', 'data' ],
{ user_id => $uid }
)->expand->hash;
@@ -2043,6 +2104,27 @@ sub startup {
return;
}
+ if ( not $journey->{data}{trip_id} ) {
+ $self->get_hafas_tripid_p($train)->then(
+ sub {
+ my ($trip_id) = @_;
+
+ my $res = $db->select( 'in_transit', ['data'],
+ { user_id => $uid } );
+ my $res_h = $res->expand->hash;
+ my $data = $res_h->{data} // {};
+
+ $data->{trip_id} = $trip_id;
+
+ $db->update(
+ 'in_transit',
+ { data => JSON->new->encode($data) },
+ { user_id => $uid }
+ );
+ }
+ )->wait;
+ }
+
my ($platform) = ( ( $train->platform // 0 ) =~ m{(\d+)} );
my $route = $journey->{route};