diff options
Diffstat (limited to 'lib/HomePanel/Driver.pm')
-rw-r--r-- | lib/HomePanel/Driver.pm | 86 |
1 files changed, 47 insertions, 39 deletions
diff --git a/lib/HomePanel/Driver.pm b/lib/HomePanel/Driver.pm index f5a253d..e9ea31f 100644 --- a/lib/HomePanel/Driver.pm +++ b/lib/HomePanel/Driver.pm @@ -1,40 +1,44 @@ package HomePanel::Driver; use Moo; -use 5.10.0; +use v5.36; use IO::Async::Loop; use IO::Async::Timer::Periodic; -use HomePanel::AsyncUA; +use Net::Async::HTTP; +use Future::AsyncAwait; use WebService::ForecastIo; use WebService::TFL::Bus; -use WebService::TFL::Bus::Request; +use WebService::TFL::Bus::Response; use WebService::TFL::TubeStatus; use HomePanel::Render; use Types::Path::Tiny qw(AbsFile AbsPath); +use Types::Standard qw(ArrayRef Str StrictNum); use Try::Tiny; -#use Devel::Cycle; use curry::weak; -use namespace::autoclean; +use namespace::clean; +use Data::Dumper; has loop => ( is => 'lazy' ); sub _build_loop { IO::Async::Loop->new() } has user_agent => ( is => 'lazy' ); sub _build_user_agent { - #HomePanel::AsyncUA->new({loop=>$_[0]->loop}); - require LWP::UserAgent; - return LWP::UserAgent->new(timeout=>20); + my ($self) = @_; + my $ua = Net::Async::HTTP->new( + max_connections_per_host => 1, + stall_timeout => 10, + decode_content => 1, + ); + $self->loop->add($ua); + return $ua; } -has forecast_request => ( +has [qw(forecast_latitude forecast_longitude)] => ( + isa => StrictNum, is => 'ro', - default => sub { +{ - latitude => 51.54, - longitude => -0.37, - exclude => ['flags','sources'], - }; }, + required => 1, ); -has forecast_response => ( is => 'rw' ); has forecast_key => ( + isa => Str, is => 'ro', required => 1, ); @@ -46,6 +50,7 @@ sub _build_forecast { user_agent => $self->user_agent, }); } +has forecast_response => ( is => 'rw' ); has forecast_timer => ( is => 'lazy' ); sub _build_forecast_timer { my ($self) = @_; @@ -56,24 +61,20 @@ sub _build_forecast_timer { } sub forecast_timer_cb { my ($self) = @_; - $self->forecast_response( - $self->forecast->request( - $self->forecast_request - ) - ); + + $self->forecast->request({ + latitude => $self->forecast_latitude, + longitude => $self->forecast_longitude, + exclude => ['flags','sources'], + })->then(sub { $self->forecast_response(shift) })->retain; } -has bus_request => ( +has bus_stop_ids => ( is => 'ro', - default => sub { - WebService::TFL::Bus::Request->new({ - StopPointName => 'Hotspur Road', - #Towards => 'Islip Manor', - ReturnList => [qw(StopID StopCode1 VisitNumber TripID VehicleID LineID LineName DirectionID DestinationText DestinationName EstimatedTime)], -}); - }, + required => 1, + isa => ArrayRef->of(Str)->plus_coercions(Str, sub { [ $_ ] }), + coerce => 1, ); -has bus_response => ( is => 'rw' ); has bus => ( is => 'lazy', ); @@ -82,6 +83,7 @@ sub _build_bus { user_agent => $_[0]->user_agent, }); } +has bus_response => ( is => 'rw' ); has bus_timer => ( is => 'lazy' ); sub _build_bus_timer { my ($self) = @_; @@ -92,11 +94,17 @@ sub _build_bus_timer { } sub bus_timer_cb { my ($self) = @_; - $self->bus_response( - $self->bus->request( - $self->bus_request - ) - ); + + Future->wait_all( + map { $self->bus->request($_) } $self->bus_stop_ids->@* + )->then( + sub { + my @done_results = map { $_->result } grep { $_->is_done } @_; + $self->bus_response( + WebService::TFL::Bus::Response->new_merged(@done_results) + ); + } + )->retain; }; has tube => ( @@ -118,9 +126,9 @@ sub _build_tube_timer { } sub tube_timer_cb { my ($self) = @_; - $self->tube_response( - $self->tube->request() - ); + + $self->tube->request( + )->then(sub { $self->tube_response(shift) })->retain; } has writer_timer => ( is => 'lazy' ); @@ -170,6 +178,8 @@ sub _build_render { sub write_page { my ($self) = @_; + return unless $self->forecast_response; + my $output = $self->render->render({ forecast => $self->forecast_response, bus => $self->bus_response, @@ -177,8 +187,6 @@ sub write_page { }); $self->output_file->spew_utf8($output); - - #find_cycle($self); } sub start { |