115 lines
3.1 KiB
Raku
115 lines
3.1 KiB
Raku
package DDG::Goodie::UPS;
|
|
# ABSTRACT: Track a package through United Parcel Service.
|
|
|
|
use DDG::Goodie;
|
|
|
|
zci is_cached => 1;
|
|
zci answer_type => "ups";
|
|
|
|
primary_example_queries '1Z2807700371226497';
|
|
secondary_example_queries 'ups 1Z2807700371226497';
|
|
description 'Track a UPS package';
|
|
icon_url "/i/www.ups.com.ico";
|
|
name 'UPS';
|
|
code_url 'https://github.com/duckduckgo/zeroclickinfo-goodies/blob/master/lib/DDG/Goodie/UPS.pm';
|
|
category 'ids';
|
|
topics 'special_interest';
|
|
attribution web => [ 'https://www.duckduckgo.com', 'DuckDuckGo' ],
|
|
github => [ 'https://github.com/duckduckgo', 'duckduckgo'],
|
|
twitter => ['http://twitter.com/duckduckgo', 'duckduckgo'];
|
|
|
|
# Regex for ups.
|
|
my $ups_qr = qr/ups/i;
|
|
|
|
triggers query_nowhitespace_nodash => qr/
|
|
^$ups_qr.*?(1Z[0-9A-Z]{16})$|
|
|
^(1Z[0-9A-Z]{16}).*$ups_qr$|
|
|
(1Z[0-9A-Z]{16})
|
|
/xi;
|
|
|
|
# See http://answers.google.com/answers/main?cmd=threadview&id=207899.
|
|
# fixme: 1Z9999W99999999999 from http://lifehacker.com/124236/google-numbers doesn't work.
|
|
|
|
handle query_nowhitespace_nodash => sub {
|
|
# If a UPS package number (2 for exclusively).
|
|
my $is_ups = 0;
|
|
|
|
# Tracking number.
|
|
my $package_number = '';
|
|
|
|
# Checksum
|
|
my %ups_checksum = (
|
|
'A' => 2,
|
|
'B' => 3,
|
|
'C' => 4,
|
|
'D' => 5,
|
|
'E' => 6,
|
|
'F' => 7,
|
|
'G' => 8,
|
|
'H' => 9,
|
|
'I' => 0,
|
|
'J' => 1,
|
|
'K' => 2,
|
|
'L' => 3,
|
|
'M' => 4,
|
|
'N' => 5,
|
|
'O' => 6,
|
|
'P' => 7,
|
|
'Q' => 8,
|
|
'R' => 9,
|
|
'S' => 0,
|
|
'T' => 1,
|
|
'U' => 2,
|
|
'V' => 3,
|
|
'W' => 4,
|
|
'X' => 5,
|
|
'Y' => 6,
|
|
'Z' => 7,
|
|
);
|
|
|
|
if($1 || $2) {
|
|
$package_number = $1 || $2;
|
|
$is_ups = 2;
|
|
} elsif($3) {
|
|
$package_number = uc $3;
|
|
|
|
my $checksum = 0;
|
|
my @chars = split(//, $package_number);
|
|
|
|
# Skip 1Z.
|
|
@chars = @chars[ 2 .. scalar(@chars) - 1 ];
|
|
|
|
my $length = scalar(@chars);
|
|
my $char_count = 0;
|
|
my $odd_sum = 0;
|
|
my $even_sum = 0;
|
|
foreach my $char (@chars) {
|
|
$char_count++;
|
|
|
|
my $tmp_num = $char;
|
|
if ( exists $ups_checksum{$char} ) {
|
|
$tmp_num = $ups_checksum{$char};
|
|
}
|
|
|
|
if ( $char_count % 2 == 0 ) {
|
|
$even_sum += $tmp_num;
|
|
}
|
|
else {
|
|
$odd_sum += $tmp_num;
|
|
}
|
|
}
|
|
$even_sum *= 2;
|
|
$checksum = ( $odd_sum + $even_sum ) % 10;
|
|
|
|
if ($checksum eq $chars[-1]) {
|
|
$is_ups = 2;
|
|
}
|
|
}
|
|
if($is_ups == 2 ) {
|
|
return $package_number, heading => 'UPS Shipment Tracking', html => qq(Track this shipment at <a href="http://wwwapps.ups.com/WebTracking/processInputRequest?sort_by=status&tracknums_displayed=1&TypeOfInquiryNumber=T&loc=en_US&InquiryNumber1=$package_number&track.x=0&track.y=0">UPS</a>.);
|
|
}
|
|
return;
|
|
};
|
|
|
|
1;
|