summaryrefslogtreecommitdiff
path: root/lib/DBInfoscreen/Helper/Wagonorder.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/DBInfoscreen/Helper/Wagonorder.pm')
-rw-r--r--lib/DBInfoscreen/Helper/Wagonorder.pm147
1 files changed, 78 insertions, 69 deletions
diff --git a/lib/DBInfoscreen/Helper/Wagonorder.pm b/lib/DBInfoscreen/Helper/Wagonorder.pm
index 5f0555d..9981244 100644
--- a/lib/DBInfoscreen/Helper/Wagonorder.pm
+++ b/lib/DBInfoscreen/Helper/Wagonorder.pm
@@ -1,9 +1,14 @@
package DBInfoscreen::Helper::Wagonorder;
+# Copyright (C) 2011-2020 Birte Kristina Friesel
+#
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
use strict;
use warnings;
use 5.020;
+use DateTime;
use Mojo::Promise;
sub new {
@@ -20,113 +25,117 @@ sub new {
}
-sub is_available_p {
- my ( $self, $train, $wr_link ) = @_;
- my $promise = Mojo::Promise->new;
+sub get_p {
+ my ( $self, %opt ) = @_;
- $self->check_wagonorder_p( $train->train_no, $wr_link )->then(
- sub {
- $promise->resolve;
- return;
- },
- sub {
- if ( $train->is_wing ) {
- my $wing = $train->wing_of;
- return $self->check_wagonorder_p( $wing->train_no, $wr_link );
- }
- else {
- $promise->reject;
- return;
- }
- }
- )->then(
- sub {
- $promise->resolve;
- return;
- },
- sub {
- $promise->reject;
- return;
- }
- )->wait;
+ my %param;
- return $promise;
-}
+ if ( $opt{param} ) {
+ %param = %{ $opt{param} };
+ delete $param{e};
+ }
+ else {
+ my $datetime = $opt{datetime}->clone->set_time_zone('UTC');
+ %param = (
+ administrationId => 80,
+ category => $opt{train_type},
+ date => $datetime->strftime('%Y-%m-%d'),
+ evaNumber => $opt{eva},
+ number => $opt{train_number},
+ time => $datetime->rfc3339 =~ s{(?=Z)}{.000}r
+ );
+ }
-sub check_wagonorder_p {
- my ( $self, $train_no, $wr_link ) = @_;
+ my $url = sprintf( '%s?%s',
+'https://www.bahn.de/web/api/reisebegleitung/wagenreihung/vehicle-sequence',
+ join( '&', map { $_ . '=' . $param{$_} } sort keys %param ) );
my $promise = Mojo::Promise->new;
- my $url
- = "https://lib.finalrewind.org/dbdb/has_wagonorder/${train_no}/${wr_link}";
- my $cache = $self->{main_cache};
-
- if ( my $content = $cache->get($url) ) {
- if ( $content eq 'y' ) {
- return $promise->resolve;
+ if ( my $content = $self->{main_cache}->thaw($url) ) {
+ $self->{log}->debug("wagonorder->get_p($url): cached");
+ if ( $content->{error} ) {
+ return $promise->reject(
+"GET $url: HTTP $content->{error}{code} $content->{error}{message} (cachd)"
+ );
}
- else {
- return $promise->reject;
+ return $promise->resolve( $content, \%param );
+ }
+
+ if ( my $content = $self->{realtime_cache}->thaw($url) ) {
+ $self->{log}->debug("wagonorder->get_p($url): cached");
+ if ( $content->{error} ) {
+ return $promise->reject(
+"GET $url: HTTP $content->{error}{code} $content->{error}{message} (cachd)"
+ );
}
+ return $promise->resolve( $content, \%param );
}
- $self->{user_agent}->request_timeout(5)->head_p( $url => $self->{header} )
+ $self->{user_agent}->request_timeout(10)->get_p( $url => $self->{header} )
->then(
sub {
my ($tx) = @_;
- if ( $tx->result->is_success ) {
- $cache->set( $url, 'y' );
- $promise->resolve;
- }
- else {
- $cache->set( $url, 'n' );
- $promise->reject;
+
+ if ( my $err = $tx->error ) {
+ my $json = {
+ error => {
+ id => $err->{code},
+ msg => $err->{message}
+ }
+ };
+ $self->{log}->debug(
+ "wagonorder->get_p($url): HTTP $err->{code} $err->{message}"
+ );
+ $self->{realtime_cache}->freeze( $url, $json );
+ $promise->reject("GET $url: HTTP $err->{code} $err->{message}");
+ return;
}
+
+ $self->{log}->debug("wagonorder->get_p($url): OK");
+ my $json = $tx->res->json;
+ $json->{ts} = DateTime->now( time_zone => 'Europe/Berlin' )
+ ->strftime('%d.%m.%Y %H:%M');
+
+ $self->{main_cache}->freeze( $url, $json );
+ $promise->resolve( $json, \%param );
return;
}
)->catch(
sub {
- $cache->set( $url, 'n' );
- $promise->reject;
+ my ($err) = @_;
+ $self->{log}->warn("wagonorder->get_p($url): $err");
+ $promise->reject("GET $url: $err");
return;
}
)->wait;
return $promise;
}
-sub get_p {
- my ( $self, $train_no, $api_ts ) = @_;
+sub get_stationinfo_p {
+ my ( $self, $eva ) = @_;
- my $url
- = "https://www.apps-bahn.de/wr/wagenreihung/1.0/${train_no}/${api_ts}";
-
- my $cache = $self->{realtime_cache};
+ my $url = "https://lib.finalrewind.org/dbdb/s/${eva}.json";
+ my $cache = $self->{main_cache};
my $promise = Mojo::Promise->new;
if ( my $content = $cache->thaw($url) ) {
- $self->{log}->debug("GET $url (cached)");
return $promise->resolve($content);
}
- $self->{user_agent}->request_timeout(10)->get_p( $url => $self->{header} )
+ $self->{user_agent}->request_timeout(5)->get_p( $url => $self->{header} )
->then(
sub {
my ($tx) = @_;
if ( my $err = $tx->error ) {
- $self->{log}->warn(
- "wagonorder->get_p($url): HTTP $err->{code} $err->{message}"
- );
- $promise->reject(
- "GET $url returned HTTP $err->{code} $err->{message}");
+ $cache->freeze( $url, {} );
+ $promise->reject("HTTP $err->{code} $err->{message}");
return;
}
- $self->{log}->debug("GET $url (OK)");
- my $json = $tx->res->json;
-
+ my $json = $tx->result->json;
$cache->freeze( $url, $json );
$promise->resolve($json);
return;
@@ -134,8 +143,8 @@ sub get_p {
)->catch(
sub {
my ($err) = @_;
- $self->{log}->warn("GET $url: $err");
- $promise->reject("GET $url: $err");
+ $cache->freeze( $url, {} );
+ $promise->reject($err);
return;
}
)->wait;