diff options
Diffstat (limited to 'lib/Travelynx/Command')
-rw-r--r-- | lib/Travelynx/Command/work.pm | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/lib/Travelynx/Command/work.pm b/lib/Travelynx/Command/work.pm new file mode 100644 index 0000000..b8f8e52 --- /dev/null +++ b/lib/Travelynx/Command/work.pm @@ -0,0 +1,111 @@ +package Travelynx::Command::work; +use Mojo::Base 'Mojolicious::Command'; + +use DateTime; +use List::Util qw(first); + +has description => + 'Perform automatic checkout when users arrive at their destination'; + +has usage => sub { shift->extract_usage }; + +sub run { + my ($self) = @_; + + my $now = DateTime->now( time_zone => 'Europe/Berlin' ); + + my $db = $self->app->pg->db; + + for my $entry ( + $db->select( 'in_transit_str', '*', { cancelled => 0 } )->hashes->each ) + { + + my $uid = $entry->{user_id}; + my $dep = $entry->{dep_ds100}; + my $arr = $entry->{arr_ds100}; + my $train = $entry->{train_id}; + + $self->app->log->debug("Processing $uid"); + + eval { + if ( $now->epoch - $entry->{real_dep_ts} < 300 ) { + $self->app->log->debug(" - updating departure"); + my $status = $self->app->get_departures( $dep, 30, 30 ); + if ( $status->{errstr} ) { + die("get_departures($dep): $status->{errstr}\n"); + } + + my ($train) + = first { $_->train_id eq $train } @{ $status->{results} }; + + if ( not $train ) { + die("could not find train $train at $dep\n"); + } + + $db->update( + 'in_transit', + { real_departure => $train->departure }, + { user_id => $uid } + ); + } + }; + if ($@) { + $self->app->log->error("work($uid)/departure: $@"); + } + + eval { + if ( + $entry->{arr_name} + and ( not $entry->{real_arr_ts} + or $now->epoch - $entry->{real_arr_ts} < 60 ) + ) + { + $self->app->log->debug(" - updating arrival"); + my $status = $self->app->get_departures( $arr, 20, 220 ); + if ( $status->{errstr} ) { + die("get_departures($arr): $status->{errstr}\n"); + } + + my ($train) + = first { $_->train_id eq $train } @{ $status->{results} }; + + if ( not $train ) { + die("could not find train $train at $arr\n"); + } + + $db->update( + 'in_transit', + { + sched_arrival => $train->sched_arrival, + real_arrival => $train->arrival, + }, + { user_id => $uid } + ); + } + elsif ( $entry->{real_arr_ts} ) { + $self->app->log->debug(" - checking out"); + my ( undef, $error ) = $self->app->checkout( $arr, 1, $uid ); + if ($error) { + die("${error}\n"); + } + } + }; + if ($@) { + $self->app->log->error("work($uid)/arrival: $@"); + } + + eval { } + } +} + +1; + +__END__ + +=head1 SYNOPSIS + + Usage: index.pl work + + Work Work Work. + + Should be called from a cronjob every three minutes or so. |