From 9d928f5cf6bb4ec857bf2b300894d5fee5ec61e2 Mon Sep 17 00:00:00 2001 From: Birte Kristina Friesel Date: Sat, 25 Nov 2023 10:02:01 +0100 Subject: Add support for stop-specific messages in journeys --- lib/Travel/Status/DE/HAFAS/Journey.pm | 26 ++++++++++++++------------ lib/Travel/Status/DE/HAFAS/Stop.pm | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 13 deletions(-) (limited to 'lib/Travel/Status/DE/HAFAS') diff --git a/lib/Travel/Status/DE/HAFAS/Journey.pm b/lib/Travel/Status/DE/HAFAS/Journey.pm index d8d63ff..eb00272 100644 --- a/lib/Travel/Status/DE/HAFAS/Journey.pm +++ b/lib/Travel/Status/DE/HAFAS/Journey.pm @@ -8,7 +8,8 @@ use 5.014; use parent 'Class::Accessor'; use DateTime::Format::Strptime; -use List::Util qw(any); +use List::Util qw(any); +use Scalar::Util qw(weaken); use Travel::Status::DE::HAFAS::Stop; our $VERSION = '5.00'; @@ -110,17 +111,18 @@ sub new { for my $stop ( @{ $journey->{stopL} // [] } ) { my $loc = $locL->[ $stop->{locX} ]; - push( - @stops, - { - loc => $loc, - stop => $stop, - common => $opt{common}, - date => $date, - datetime_ref => $datetime_ref, - strp_obj => $hafas->{strptime_obj}, - } - ); + my $stopref = { + loc => $loc, + stop => $stop, + common => $opt{common}, + hafas => $hafas, + date => $date, + datetime_ref => $datetime_ref, + }; + + weaken( $stopref->{hafas} ); + + push( @stops, $stopref ); $route_end = $loc->name; } diff --git a/lib/Travel/Status/DE/HAFAS/Stop.pm b/lib/Travel/Status/DE/HAFAS/Stop.pm index 5763465..5d2ab36 100644 --- a/lib/Travel/Status/DE/HAFAS/Stop.pm +++ b/lib/Travel/Status/DE/HAFAS/Stop.pm @@ -29,7 +29,8 @@ sub new { my $common = $opt{common}; my $date = $opt{date}; my $datetime_ref = $opt{datetime_ref}; - my $strp_obj = $opt{strp_obj}; + my $hafas = $opt{hafas}; + my $strp_obj = $opt{hafas}{strptime_obj}; my $sched_arr = $stop->{aTimeS}; my $rt_arr = $stop->{aTimeR}; @@ -69,6 +70,21 @@ sub new { my $arr_cancelled = $stop->{aCncl}; my $dep_cancelled = $stop->{dCncl}; + my @messages; + for my $msg ( @{ $stop->{msgL} // [] } ) { + if ( $msg->{type} eq 'REM' and defined $msg->{remX} ) { + push( @messages, + $hafas->add_message( $opt{common}{remL}[ $msg->{remX} ] ) ); + } + elsif ( $msg->{type} eq 'HIM' and defined $msg->{himX} ) { + push( @messages, + $hafas->add_message( $opt{common}{himL}[ $msg->{himX} ], 1 ) ); + } + else { + say "Unknown message type $msg->{type}"; + } + } + my $tco = {}; for my $tco_id ( @{ $stop->{dTrnCmpSX}{tcocX} // [] } ) { my $tco_kv = $common->{tcocL}[$tco_id]; @@ -94,6 +110,7 @@ sub new { is_changed_platform => $changed_platform, platform => $rt_platform // $sched_platform, load => $tco, + messages => \@messages, }; bless( $ref, $obj ); @@ -121,6 +138,15 @@ sub handle_day_change { return $timestr; } +sub messages { + my ($self) = @_; + + if ( $self->{messages} ) { + return @{ $self->{messages} }; + } + return; +} + sub TO_JSON { my ($self) = @_; @@ -225,6 +251,12 @@ Departure or arrival delay in minutes. Direction signage from this stop on, undef if unchanged. +=item $journey->messages + +List of Travel::Status::DE::HAFAS::Message(3pm) instances related to this stop. +These typically refer to delay reasons, platform changes, or changes in the +line number / direction heading. + =item $stop->rt_platform Actual platform. -- cgit v1.2.3