summaryrefslogtreecommitdiff
path: root/lib/HomePanel/Driver.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/HomePanel/Driver.pm')
-rw-r--r--lib/HomePanel/Driver.pm86
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 {