summaryrefslogtreecommitdiff
path: root/lib/HomePanel
diff options
context:
space:
mode:
Diffstat (limited to 'lib/HomePanel')
-rw-r--r--lib/HomePanel/AsyncUA.pm32
-rw-r--r--lib/HomePanel/Driver.pm86
-rw-r--r--lib/HomePanel/Render.pm22
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) = @_;