diff options
Diffstat (limited to 'lib/HomePanel')
-rw-r--r-- | lib/HomePanel/AsyncUA.pm | 32 | ||||
-rw-r--r-- | lib/HomePanel/Driver.pm | 86 | ||||
-rw-r--r-- | lib/HomePanel/Render.pm | 22 |
3 files changed, 59 insertions, 81 deletions
diff --git a/lib/HomePanel/AsyncUA.pm b/lib/HomePanel/AsyncUA.pm deleted file mode 100644 index d74e4aa..0000000 --- a/lib/HomePanel/AsyncUA.pm +++ /dev/null @@ -1,32 +0,0 @@ -package HomePanel::AsyncUA; -use Moo; -use namespace::autoclean; -use Net::Async::HTTP; - -has loop => ( - is => 'ro', - required => 1, - weak => 1, -); - -has agent => ( - is => 'lazy', -); -sub _build_agent { - my ($self) = @_; - - my $agent = Net::Async::HTTP->new( - max_connections_per_host => 1, - stall_timeout => 10, - ); - $self->loop->add($agent); - return $agent; -} - -sub get { - my ($self,$uri) = @_; - - return $self->agent->GET($uri)->get -} - -1; 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 { diff --git a/lib/HomePanel/Render.pm b/lib/HomePanel/Render.pm index fe165e3..c16e9c8 100644 --- a/lib/HomePanel/Render.pm +++ b/lib/HomePanel/Render.pm @@ -6,6 +6,7 @@ use Template::Stash::ForceUTF8; use Template; use DateTime; use DateTime::Format::Duration; +use namespace::clean; has [qw(provider stash template)] => ( is => 'lazy', @@ -36,16 +37,17 @@ has template_file => ( { my %icon_for=( - 'clear-day' => '2', - 'clear-night' => '3', - rain => '18', - snow => '23', - sleet => '24', - wind => '6', - fog => '13', - cloudy => '14', - 'partly-cloudy-day' => '8', - 'partly-cloudy-night' => '9', + 'clear-day' => 'sun_day', + 'clear' => 'sun_day', + 'clear-night' => 'sun_night', + rain => 'rain', + snow => 'snow', + sleet => 'sleet', + wind => 'wind', + fog => 'fog', + cloudy => 'cloudy', + 'partly-cloudy-day' => 'cloud_day', + 'partly-cloudy-night' => 'cloud_night', ); sub icon_for { my ($status) = @_; |