From 7be3a4219ef469565ac1ae9958865f64de035901 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Tue, 4 Jun 2019 21:12:36 +0200 Subject: [PATCH] checked in: Show QoS messages before departure and HIM messages at all times --- lib/Travelynx.pm | 45 ++++++++++++++++++++++++++++--- lib/Travelynx/Command/database.pm | 30 +++++++++++++++++++++ templates/_checked_in.html.ep | 10 ++++++- 3 files changed, 81 insertions(+), 4 deletions(-) diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index 76b4b7f..7a4b6ca 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -646,6 +646,7 @@ sub startup { = $db->select( 'in_transit', '*', { user_id => $uid } )->hash; if ( $has_arrived or $force ) { + delete $journey->{data}; $journey->{edited} = 0; $journey->{checkout_time} = $now; $db->insert( 'journeys', $journey ); @@ -1591,12 +1592,13 @@ sub startup { my $tree; my $traininfo = { - station => {}, + station => {}, + messages => [], }; # is invalid HTML, but present in # regardless. As it is the last tag, we just throw it away. - $body =~ s{}s; + $body =~ s{]*/>}{}s; eval { $tree = XML::LibXML->load_xml( string => $body ) }; if ($@) { $self->app->log->warning("load_xml($url): $@"); @@ -1615,6 +1617,21 @@ sub startup { }; } + for my $message ( $tree->findnodes('/Journey/HIMMessage') ) + { + my $header = $message->getAttribute('header'); + my $lead = $message->getAttribute('lead'); + my $display = $message->getAttribute('display'); + push( + @{ $traininfo->{messages} }, + { + header => $header, + lead => $lead, + display => $display + } + ); + } + $cache->freeze( $url, $traininfo ); $promise->resolve($traininfo); } @@ -1655,6 +1672,14 @@ sub startup { $self->app->log->debug("add_route_timestamps"); + my $extra_data = { + delay_msg => [ + map { [ $_->[0]->epoch, $_->[1] ] } $train->delay_messages + ], + qos_msg => + [ map { [ $_->[0]->epoch, $_->[1] ] } $train->qos_messages ], + }; + my ( $trainlink, $route_data ); $self->get_hafas_json_p( @@ -1743,9 +1768,15 @@ sub startup { $station->[1] = $route_data->{ $station->[0] }; } + + $extra_data->{him_msg} = $traininfo2->{messages}; + $db->update( 'in_transit', - { route => JSON->new->encode($route) }, + { + route => JSON->new->encode($route), + data => JSON->new->encode($extra_data) + }, { user_id => $uid } ); } @@ -2139,6 +2170,7 @@ sub startup { arr_platform => $in_transit->{arr_platform}, route_after => \@route_after, messages => $in_transit->{messages}, + extra_data => $in_transit->{data}, }; my @parsed_messages; @@ -2148,6 +2180,13 @@ sub startup { } $ret->{messages} = [ reverse @parsed_messages ]; + @parsed_messages = (); + for my $message ( @{ $ret->{extra_data}{qos_msg} // [] } ) { + my ( $ts, $msg ) = @{$message}; + push( @parsed_messages, [ epoch_to_dt($ts), $msg ] ); + } + $ret->{extra_data}{qos_msg} = [@parsed_messages]; + for my $station (@route_after) { if ( @{$station} > 1 ) { my $times = $station->[1]; diff --git a/lib/Travelynx/Command/database.pm b/lib/Travelynx/Command/database.pm index fab5fa7..e561373 100644 --- a/lib/Travelynx/Command/database.pm +++ b/lib/Travelynx/Command/database.pm @@ -659,6 +659,36 @@ my @migrations = ( } ); }, + + # v14 -> v15 + sub { + my ($db) = @_; + $db->query( + qq{ + alter table in_transit add column data jsonb; + create or replace view in_transit_str as select + user_id, + train_type, train_line, train_no, train_id, + extract(epoch from checkin_time) as checkin_ts, + extract(epoch from sched_departure) as sched_dep_ts, + extract(epoch from real_departure) as real_dep_ts, + dep_stations.ds100 as dep_ds100, + dep_stations.name as dep_name, + extract(epoch from checkout_time) as checkout_ts, + extract(epoch from sched_arrival) as sched_arr_ts, + extract(epoch from real_arrival) as real_arr_ts, + arr_stations.ds100 as arr_ds100, + arr_stations.name as arr_name, + cancelled, route, messages, + dep_platform, arr_platform, data + from in_transit + join stations as dep_stations on dep_stations.id = checkin_station_id + left join stations as arr_stations on arr_stations.id = checkout_station_id + ; + update schema_version set version = 15; + } + ); + }, ); sub setup_db { diff --git a/templates/_checked_in.html.ep b/templates/_checked_in.html.ep index df5d260..184b11a 100644 --- a/templates/_checked_in.html.ep +++ b/templates/_checked_in.html.ep @@ -114,7 +114,7 @@

% } - % if (@{$journey->{messages} // []} > 0 and $journey->{messages}[0]) { + % if (@{$journey->{messages} // []} or @{$journey->{extra_data}{him_msg} // []} or @{$journey->{extra_data}{qos_msg} // []}) {

    % for my $message (reverse @{$journey->{messages} // []}) { @@ -122,6 +122,14 @@
  • warning <%= $message->[0]->strftime('%H:%M') %>: <%= $message->[1] %>
  • % } % } + % if ($journey->{departure_countdown} > 0) { + % for my $message (@{$journey->{extra_data}{qos_msg} // []}) { +
  • info <%= $message->[0]->strftime('%H:%M') %>: <%= $message->[1] %>
  • + % } + % } + % for my $message (@{$journey->{extra_data}{him_msg} // []}) { +
  • info <%= $message->{header} %> <%= $message->{lead} %>
  • + % }

% }