summaryrefslogtreecommitdiff
path: root/lib/Travelynx.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Travelynx.pm')
-rwxr-xr-xlib/Travelynx.pm199
1 files changed, 183 insertions, 16 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index c73f96d..ac45be6 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -19,8 +19,9 @@ use JSON;
use List::Util;
use List::UtilsBy qw(uniq_by);
use List::MoreUtils qw(first_index);
-use Travel::Status::DE::DBWagenreihung;
+use Travel::Status::DE::DBRIS::Formation;
use Travelynx::Helper::DBDB;
+use Travelynx::Helper::DBRIS;
use Travelynx::Helper::HAFAS;
use Travelynx::Helper::IRIS;
use Travelynx::Helper::Sendmail;
@@ -182,7 +183,7 @@ sub startup {
$self->attr(
ice_name => sub {
state $id_to_name = {
- Travel::Status::DE::DBWagenreihung::Group::name_to_designation(
+ Travel::Status::DE::DBRIS::Formation::Group::name_to_designation(
)
};
return $id_to_name;
@@ -217,10 +218,24 @@ sub startup {
);
$self->helper(
+ dbris => sub {
+ my ($self) = @_;
+ state $dbris = Travelynx::Helper::DBRIS->new(
+ log => $self->app->log,
+ cache => $self->app->cache_iris_rt,
+ root_url => $self->base_url_for('/')->to_abs,
+ user_agent => $self->ua,
+ version => $self->app->config->{version},
+ );
+ }
+ );
+
+ $self->helper(
hafas => sub {
my ($self) = @_;
state $hafas = Travelynx::Helper::HAFAS->new(
log => $self->app->log,
+ service_config => $self->app->config->{hafas},
main_cache => $self->app->cache_iris_main,
realtime_cache => $self->app->cache_iris_rt,
root_url => $self->base_url_for('/')->to_abs,
@@ -404,6 +419,14 @@ sub startup {
my $first = $load->{FIRST} // 0;
my $second = $load->{SECOND} // 0;
+ # DBRIS
+ if ( $first == 99 ) {
+ $first = 4;
+ }
+ if ( $second == 99 ) {
+ $second = 4;
+ }
+
my @symbols
= (
qw(help_outline person_outline people priority_high not_interested)
@@ -451,6 +474,9 @@ sub startup {
return Mojo::Promise->reject('You are already checked in');
}
+ if ( $opt{dbris} ) {
+ return $self->_checkin_dbris_p(%opt);
+ }
if ( $opt{hafas} ) {
return $self->_checkin_hafas_p(%opt);
}
@@ -530,6 +556,146 @@ sub startup {
);
$self->helper(
+ '_checkin_dbris_p' => sub {
+ my ( $self, %opt ) = @_;
+
+ my $station = $opt{station};
+ my $train_id = $opt{train_id};
+ my $ts = $opt{ts};
+ my $uid = $opt{uid} // $self->current_user->{id};
+ my $db = $opt{db} // $self->pg->db;
+ my $hafas;
+
+ my $promise = Mojo::Promise->new;
+
+ $self->dbris->get_journey_p(
+ trip_id => $train_id,
+ with_polyline => 1
+ )->then(
+ sub {
+ my ($journey) = @_;
+ my $found;
+ for my $stop ( $journey->route ) {
+ if ( $stop->eva eq $station ) {
+ $found = $stop;
+
+ # Lines may serve the same stop several times.
+ # Keep looking until the scheduled departure
+ # matches the one passed while checking in.
+ if ( $ts and $stop->sched_dep->epoch == $ts ) {
+ last;
+ }
+ }
+ }
+ if ( not $found ) {
+ $promise->reject(
+"Did not find stop '$station' within journey '$train_id'"
+ );
+ return;
+ }
+ for my $stop ( $journey->route ) {
+ $self->stations->add_or_update(
+ stop => $stop,
+ db => $db,
+ dbris => 'bahn.de',
+ );
+ }
+ eval {
+ $self->in_transit->add(
+ uid => $uid,
+ db => $db,
+ journey => $journey,
+ stop => $found,
+ data => { trip_id => $train_id },
+ backend_id => $self->stations->get_backend_id(
+ dbris => 'bahn.de'
+ ),
+ );
+ };
+ if ($@) {
+ $self->app->log->error(
+ "Checkin($uid): INSERT failed: $@");
+ $promise->reject( 'INSERT failed: ' . $@ );
+ return;
+ }
+
+ my $polyline;
+ if ( $journey->polyline ) {
+ my @station_list;
+ my @coordinate_list;
+ for my $coord ( $journey->polyline ) {
+ if ( $coord->{stop} ) {
+ push(
+ @coordinate_list,
+ [
+ $coord->{lon}, $coord->{lat},
+ $coord->{stop}->eva
+ ]
+ );
+ push( @station_list, $coord->{stop}->name );
+ }
+ else {
+ push( @coordinate_list,
+ [ $coord->{lon}, $coord->{lat} ] );
+ }
+ }
+
+ # equal length → polyline only consists of straight
+ # lines between stops. that's not helpful.
+ if ( @station_list == @coordinate_list ) {
+ $self->log->debug( 'Ignoring polyline for '
+ . $journey->train
+ . ' as it only consists of straight lines between stops.'
+ );
+ }
+ else {
+ $polyline = {
+ from_eva => ( $journey->route )[0]->eva,
+ to_eva => ( $journey->route )[-1]->eva,
+ coords => \@coordinate_list,
+ };
+ }
+ }
+
+ if ($polyline) {
+ $self->in_transit->set_polyline(
+ uid => $uid,
+ db => $db,
+ polyline => $polyline,
+ );
+ }
+
+ # mustn't be called during a transaction
+ if ( not $opt{in_transaction} ) {
+ $self->run_hook( $uid, 'checkin' );
+ $self->add_wagonorder(
+ uid => $uid,
+ train_id => $train_id,
+ is_departure => 1,
+ eva => $found->eva,
+ datetime => $found->sched_dep,
+ train_type => $journey->type,
+ train_no => $journey->number
+ );
+ $self->add_stationinfo( $uid, 1, $train_id,
+ $found->eva );
+ }
+
+ $promise->resolve($journey);
+ }
+ )->catch(
+ sub {
+ my ($err) = @_;
+ $promise->reject($err);
+ return;
+ }
+ )->wait;
+
+ return $promise;
+ }
+ );
+
+ $self->helper(
'_checkin_hafas_p' => sub {
my ( $self, %opt ) = @_;
@@ -788,7 +954,7 @@ sub startup {
if ( not $user->{checked_in} and not $user->{cancelled} ) {
return $promise->resolve( 0,
- 'You are not checked into any train' );
+ 'You are not checked in' );
}
if ( $dep_eva and $dep_eva != $user->{dep_eva} ) {
@@ -798,8 +964,8 @@ sub startup {
return $promise->resolve( 0, 'race condition' );
}
- if ( $user->{is_hafas} ) {
- return $self->_checkout_hafas_p(%opt);
+ if ( $user->{is_dbris} or $user->{is_hafas} ) {
+ return $self->_checkout_journey_p(%opt);
}
my $now = DateTime->now( time_zone => 'Europe/Berlin' );
@@ -1048,7 +1214,7 @@ sub startup {
);
$self->helper(
- '_checkout_hafas_p' => sub {
+ '_checkout_journey_p' => sub {
my ( $self, %opt ) = @_;
my $station = $opt{station};
@@ -1621,8 +1787,8 @@ sub startup {
my $wr;
eval {
$wr
- = Travel::Status::DE::DBWagenreihung->new(
- from_json => $wagonorder );
+ = Travel::Status::DE::DBRIS::Formation->new(
+ json => $wagonorder );
};
if ( $wr
and $wr->sectors
@@ -1767,8 +1933,8 @@ sub startup {
my $wr;
eval {
$wr
- = Travel::Status::DE::DBWagenreihung->new(
- from_json => $in_transit->{data}{wagonorder_dep} );
+ = Travel::Status::DE::DBRIS::Formation->new(
+ json => $in_transit->{data}{wagonorder_dep} );
};
if ( $wr
and $wr->carriages
@@ -1839,6 +2005,7 @@ sub startup {
cancellation => $latest_cancellation,
backend_id => $latest->{backend_id},
backend_name => $latest->{backend_name},
+ is_dbris => $latest->{is_dbris},
is_iris => $latest->{is_iris},
is_hafas => $latest->{is_hafas},
journey_id => $latest->{journey_id},
@@ -1900,8 +2067,10 @@ sub startup {
) ? \1 : \0,
comment => $status->{comment},
backend => {
- id => $status->{backend_id},
- type => $status->{is_hafas} ? 'HAFAS' : 'IRIS-TTS',
+ id => $status->{backend_id},
+ type => $status->{ds_dbris} ? 'DBRIS'
+ : $status->{is_hafas} ? 'HAFAS'
+ : 'IRIS-TTS',
name => $status->{backend_name},
},
fromStation => {
@@ -2024,8 +2193,7 @@ sub startup {
my $db = $self->pg->db;
my $tx = $db->begin;
- $self->_checkin_hafas_p(
- hafas => 'DB',
+ $self->_checkin_dbris_p(
station => $traewelling->{dep_eva},
train_id => $traewelling->{trip_id},
uid => $uid,
@@ -2034,8 +2202,7 @@ sub startup {
)->then(
sub {
$self->log->debug("... handled origin");
- return $self->_checkout_hafas_p(
- hafas => 'DB',
+ return $self->_checkout_journey_p(
station => $traewelling->{arr_eva},
train_id => $traewelling->{trip_id},
uid => $uid,