Amethyst
view release on metacpan or search on metacpan
Amethyst/Brain/Infobot/Module/Exchange.pm view on Meta::CPAN
package Amethyst::Brain::Infobot::Module::Exchange;
use strict;
use vars qw(@ISA
%CODE2CODE %TLD2CODE %CURR2CODE %COUNTRY2CODE
%CODE2CURR
$REFERER $CONVERTER);
use Data::Dumper;
use POE;
use POE::Component::Client::UserAgent;
use HTTP::Request::Common;
use HTTP::Response;
use LWP::UserAgent; # For init
use Amethyst::Message;
use Amethyst::Brain::Infobot;
use Amethyst::Brain::Infobot::Module;
@ISA = qw(Amethyst::Brain::Infobot::Module);
sub new {
my $class = shift;
my $self = $class->SUPER::new(
Name => 'Exchange',
Regex => qr/^(?:ex)?change\s+(\d+)\s+(\w+)\s+(?:into|to|for)\s+(\w+)/x,
Usage => '(ex)?change 100 USD for DEM',
Description => "Convert currencies",
@_
);
return bless $self, $class;
}
sub init {
my $self = shift;
eval { spawn POE::Component::Client::UserAgent; };
if ($@) {
die $@ unless $@ =~ /^alias is in use by another session/;
}
$REFERER = 'http://www.xe.net/ucc/full.shtml';
$CONVERTER ='http://www.xe.net/ucc/convert.cgi';
my $ua = new LWP::UserAgent;
my $uri = new URI($REFERER);
my $request = new HTTP::Request(GET => $uri);
print STDERR "Requesting $uri\n";
my $response = $ua->request($request);
unless ($response->is_success) {
print STDERR $response->error_as_HTML;
die "Failed to contact currency converter";
}
my $html = $response->content;
$html =~ s|.*<SELECT[^>]*>(.*?)</SELECT.*|$1|s;
my @data =
map {
[ $_ =~ /=\"([^\"]+)\">(.*?)(?:,\s*(.*?))? \(...\)</g ]
}
grep /\S/,
split /\n/, $html;
%CURR2CODE = map { defined $_->[2]
? (lc $_->[2] => uc $_->[0])
: () } @data;
%COUNTRY2CODE = map { lc $_->[1] => uc $_->[0] } @data;
%CODE2CODE = map { lc $_->[0] => uc $_->[0] } @data;
%CODE2CURR = reverse %CURR2CODE;
TLD:
while (<DATA>) {
chomp;
my ($tld, $country) = split /\s+/, $_, 2;
if (exists $COUNTRY2CODE{lc $country}) {
$TLD2CODE{lc $tld} = $COUNTRY2CODE{lc $country};
next TLD;
}
($tld, $country) = split /\s+/, $_, 3;
if (exists $COUNTRY2CODE{lc $country}) {
$TLD2CODE{lc $tld} = $COUNTRY2CODE{lc $country};
next TLD;
}
( run in 0.715 second using v1.01-cache-2.11-cpan-39bf76dae61 )