2014-05-13 06:59:06 -07:00
|
|
|
package DDG::Goodie::Zodiac;
|
2016-01-06 09:45:21 -08:00
|
|
|
# ABSTRACT: Find the Zodiac for a given date.
|
2014-05-13 06:59:06 -07:00
|
|
|
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
|
2016-01-06 09:45:21 -08:00
|
|
|
use DDG::Goodie;
|
|
|
|
with 'DDG::GoodieRole::Dates';
|
|
|
|
|
|
|
|
use DateTime;
|
2016-02-18 08:40:39 -08:00
|
|
|
use JSON::MaybeXS;
|
2014-05-13 06:59:06 -07:00
|
|
|
|
2016-01-06 09:45:21 -08:00
|
|
|
zci is_cached => 0;
|
2014-05-13 06:59:06 -07:00
|
|
|
zci answer_type => "zodiac";
|
|
|
|
|
2016-01-06 09:45:21 -08:00
|
|
|
my @triggers = ('zodiac', 'zodiac sign',
|
|
|
|
'starsign', 'star sign');
|
|
|
|
|
|
|
|
triggers startend => @triggers;
|
|
|
|
|
2014-05-13 06:59:06 -07:00
|
|
|
|
2016-01-06 09:44:44 -08:00
|
|
|
my $json = share('dates.json')->slurp;
|
|
|
|
my $decoded = decode_json($json);
|
|
|
|
my $zodiacs = $decoded->{'zodiacs'};
|
|
|
|
|
|
|
|
sub make_zodiac_date {
|
|
|
|
my ($year, $date) = @_;
|
|
|
|
return DateTime->new(
|
|
|
|
day => $date->[0],
|
|
|
|
month => $date->[1],
|
|
|
|
year => $year,
|
|
|
|
);
|
|
|
|
}
|
2015-11-28 02:03:18 -08:00
|
|
|
|
2016-01-06 09:44:44 -08:00
|
|
|
sub is_zodiac {
|
|
|
|
my ($date, $zodiac) = @_;
|
|
|
|
my $zodiac_start = make_zodiac_date($date->year, $zodiac->{start});
|
|
|
|
my $zodiac_end = make_zodiac_date($date->year, $zodiac->{end});
|
|
|
|
if ($zodiac_end->month == 1) {
|
|
|
|
return $date->day <= $zodiac_end->day if $date->month == 1;
|
|
|
|
return $date->day >= $zodiac_start->day if $date->month == 12;
|
|
|
|
};
|
|
|
|
return $zodiac_start <= $date && $date <= $zodiac_end;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub get_zodiac_for {
|
|
|
|
my $date = shift;
|
|
|
|
foreach my $zodiac (@$zodiacs) {
|
|
|
|
return ucfirst($zodiac->{name}) if is_zodiac($date, $zodiac);
|
|
|
|
};
|
|
|
|
}
|
2015-11-27 11:44:22 -08:00
|
|
|
|
2016-01-06 09:45:21 -08:00
|
|
|
my @colors = qw(bg-clr--blue-light
|
|
|
|
bg-clr--green
|
|
|
|
bg-clr--red
|
|
|
|
bg-clr--grey);
|
|
|
|
|
2015-11-27 11:44:22 -08:00
|
|
|
sub element_sign {
|
2016-01-06 09:45:21 -08:00
|
|
|
my $zodiac = shift;
|
|
|
|
return $colors[0] if $zodiac =~ /(cancer|scorpius|pisces)/i;
|
|
|
|
return $colors[1] if $zodiac =~ /(taurus|virgo|capricornus)/i;
|
|
|
|
return $colors[2] if $zodiac =~ /(aries|sagittarius|leo)/i;
|
|
|
|
return $colors[3] if $zodiac =~ /(libra|gemini|aquarius)/i;
|
2015-11-27 11:44:22 -08:00
|
|
|
}
|
2015-01-31 11:03:07 -08:00
|
|
|
|
2016-01-06 09:45:21 -08:00
|
|
|
sub get_image {
|
|
|
|
my $zodiac = shift;
|
|
|
|
my $image_path = "/share/goodie/zodiac/@{[lc($zodiac)]}.png";
|
|
|
|
my $icon = "@{[element_sign $zodiac]} circle";
|
|
|
|
return ($image_path, $icon);
|
|
|
|
}
|
2015-02-04 14:08:26 -08:00
|
|
|
|
2016-01-06 09:45:21 -08:00
|
|
|
handle remainder => sub {
|
|
|
|
my $date_string = $_;
|
|
|
|
$date_string =~ s/^\s*(for|on)\s*//;
|
2016-01-06 09:44:44 -08:00
|
|
|
|
2016-01-06 09:45:21 -08:00
|
|
|
my $zodiac_date = parse_datestring_to_date($date_string) or return;
|
2016-01-06 09:44:44 -08:00
|
|
|
|
2016-01-06 09:45:21 -08:00
|
|
|
my $zodiac = get_zodiac_for $zodiac_date or return;
|
|
|
|
my $formatted_input = "Zodiac for @{[date_output_string($zodiac_date)]}";
|
|
|
|
my ($image_path, $icon) = get_image $zodiac;
|
2015-02-04 14:08:26 -08:00
|
|
|
|
2016-01-06 09:45:21 -08:00
|
|
|
return $zodiac, structured_answer => {
|
|
|
|
id => "zodiac",
|
2015-11-28 02:51:27 -08:00
|
|
|
name => "Answer",
|
2015-11-26 10:33:34 -08:00
|
|
|
data => {
|
2016-01-06 09:45:21 -08:00
|
|
|
image => $image_path,
|
|
|
|
title => $zodiac,
|
|
|
|
subtitle => $formatted_input,
|
2015-11-26 10:33:34 -08:00
|
|
|
},
|
|
|
|
templates => {
|
2016-01-06 09:45:21 -08:00
|
|
|
group => "icon",
|
2015-11-26 13:28:27 -08:00
|
|
|
elClass => {
|
2016-01-06 09:45:21 -08:00
|
|
|
iconImage => $icon,
|
2015-11-27 11:44:22 -08:00
|
|
|
},
|
|
|
|
variants => {
|
|
|
|
iconImage => 'large'
|
2015-11-26 13:28:27 -08:00
|
|
|
}
|
2015-11-26 10:33:34 -08:00
|
|
|
}
|
2015-02-04 14:08:26 -08:00
|
|
|
};
|
2014-05-13 06:59:06 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
1;
|