]> git.donarmstrong.com Git - infobot.git/commitdiff
copied from infobot
authortimriker <timriker@c11ca15a-4712-0410-83d8-924469b57eb5>
Mon, 11 Nov 2002 21:32:23 +0000 (21:32 +0000)
committertimriker <timriker@c11ca15a-4712-0410-83d8-924469b57eb5>
Mon, 11 Nov 2002 21:32:23 +0000 (21:32 +0000)
git-svn-id: https://svn.code.sf.net/p/infobot/code/trunk@616 c11ca15a-4712-0410-83d8-924469b57eb5

blootbot/src/Modules/Exchange.pl [new file with mode: 0644]

diff --git a/blootbot/src/Modules/Exchange.pl b/blootbot/src/Modules/Exchange.pl
new file mode 100644 (file)
index 0000000..d60e822
--- /dev/null
@@ -0,0 +1,395 @@
+#!/usr/bin/perl
+
+# exchange.pl - currency exchange "module"
+#
+# Last update: 990818 08:30:10, bobby@bofh.dk
+#
+
+BEGIN {
+    eval qq{
+       use LWP::UserAgent;
+       use HTTP::Request::Common qw(POST GET);
+    };
+
+    $no_exchange++ if($@);
+}
+
+sub exchange {
+    my($From, $To, $Amount) = @_;
+
+    return "exchange.pl: not configured. needs LWP::UserAgent and HTTP::Request::Common" 
+       if( $no_exchange );
+
+    my $retval = '';
+
+    my $ua = new LWP::UserAgent;
+    $ua->agent("Mozilla/4.5 " . $ua->agent);        # Let's pretend
+    if (my $proxy = main::getparam('httpproxy')) { $ua->proxy('http', $proxy) };
+    $ua->timeout(10);
+
+    my $Referer = 'http://www.xe.net/ucc/full.shtml';
+    my $Converter='http://www.xe.net/ucc/convert.cgi';
+
+    # Get a list of currency abbreviations...
+    my $grab = GET $Referer;
+    my $reply = $ua->request($grab);
+    if (!$reply->is_success) {
+       return "EXCHANGE: ".$reply->status_line;
+    }
+    my $html = $reply->as_string;
+    my %Currencies = (grep /\S+/,
+           ($html =~ /option value="([^"]+)">.*?,\s*([^<]+)</gi)
+       );
+
+    my %CurrLookup = reverse ($html =~ /option value="([^"]+)">([^<]+)</gi);
+
+    %tld2country = &GetTlds;
+    if( $From =~ /^\.(\w\w)$/ ){       # Probably a tld
+       $From = $tld2country{uc $1};
+    }
+    if( $To =~ /^\.(\w\w)$/ ){ # Probably a tld
+       $To = $tld2country{uc $1};
+    }
+
+    if($#_ == 0){
+       # Country lookup
+       # crysflame++ for the space fix. 
+       $retval = '';
+       foreach my $Found (grep /$From/i, keys %CurrLookup){
+           $Found =~ s/,/ uses/g;
+           $retval .= "$Found, ";
+       }
+       $retval =~ s/(?:, )?\|?$//;
+       return substr($retval, 0, 510);
+    }else{
+
+       # Make sure that $Amount is of the form \d+(\.\d\d)?
+       $Amount =~ s/[,.](\d\d)$/\01$1/;
+       $Amount =~ s/[,.]//g;
+       $Amount =~ s/\01/./;
+
+       # Get the exact currency abbreviations
+       my $newFrom = &GetAbb($From, %CurrLookup);
+       my $newTo = &GetAbb($To, %CurrLookup);
+
+       $From = $newFrom if $newFrom;
+       $To   = $newTo   if $newTo;
+
+       if( exists $Currencies{$From} and exists $Currencies{$To} ){
+
+           my $req = POST $Converter,
+                       [   timezone    => 'UTC',
+                           From        => $From,
+                           To          => $To,
+                           Amount      => $Amount,
+                       ];
+
+           # Falsify where we came from
+           $req->referer($Referer);
+
+           my $res = $ua->request($req);                   # Submit request
+
+           if ($res->is_success) {                         # Went through ok
+               my $html = $res->as_string;
+
+               my ($When, $Cfrom, $Cto) =
+                   grep /\S+/, ($html =~ m/ as of (\d{4}\.\d\d.\d\d\s\d\d:\d\d:\d\d\s\S+)|(\d[\d,.]+)\s*$From|(\d[\d,.]+)\s* $To/gi);
+
+               if ($When) {
+                   return "$Cfrom ($Currencies{$From}) makes ".
+                       "$Cto ($Currencies{$To})"; # ." ($When)\n";
+               } else {
+                   return "i got some error trying that";
+               }
+           } else {                                        # Oh dear.
+               return "EXCHANGE: ". $res->status_line;
+           }
+       }else{
+           return "Don't know about \"$From\" as a currency" if( ! exists $Currencies{$From} );
+           return "Don't know about \"$To\" as a currency" if( ! exists $Currencies{$To} );
+       }
+    }
+}
+
+sub GetAbb {
+    my($LookFor,%Hash) = @_;
+
+    my $Found = (grep /$LookFor/i, keys %Hash)[0];
+    $Found =~ m/\((\w\w\w)\)/;
+    return $1;
+}
+
+sub GetTlds {
+       my %Hash = (
+                       "AF", "AFGHANISTAN",
+                       "AL", "ALBANIA",
+                       "DZ", "ALGERIA",
+                       "AS", "AMERICAN SAMOA",
+                       "AD", "ANDORRA",
+                       "AO", "ANGOLA",
+                       "AI", "ANGUILLA",
+                       "AQ", "ANTARCTICA",
+                       "AG", "ANTIGUA AND BARBUDA",
+                       "AR", "ARGENTINA",
+                       "AM", "ARMENIA",
+                       "AW", "ARUBA",
+                       "AU", "AUSTRALIA",
+                       "AT", "AUSTRIA",
+                       "AZ", "AZERBAIJAN",
+                       "BS", "BAHAMAS",
+                       "BH", "BAHRAIN",
+                       "BD", "BANGLADESH",
+                       "BB", "BARBADOS",
+                       "BY", "BELARUS",
+                       "BE", "BELGIUM",
+                       "BZ", "BELIZE",
+                       "BJ", "BENIN",
+                       "BM", "BERMUDA",
+                       "BT", "BHUTAN",
+                       "BO", "BOLIVIA",
+                       "BA", "BOSNIA AND HERZEGOWINA",
+                       "BW", "BOTSWANA",
+                       "BV", "BOUVET ISLAND",
+                       "BR", "BRAZIL",
+                       "IO", "BRITISH INDIAN OCEAN TERRITORY",
+                       "BN", "BRUNEI DARUSSALAM",
+                       "BG", "BULGARIA",
+                       "BF", "BURKINA FASO",
+                       "BI", "BURUNDI",
+                       "KH", "CAMBODIA",
+                       "CM", "CAMEROON",
+                       "CA", "CANADA",
+                       "CV", "CAPE VERDE",
+                       "KY", "CAYMAN ISLANDS",
+                       "CF", "CENTRAL AFRICAN REPUBLIC",
+                       "TD", "CHAD",
+                       "CL", "CHILE",
+                       "CN", "CHINA",
+                       "CX", "CHRISTMAS ISLAND",
+                       "CC", "COCOS (KEELING) ISLANDS",
+                       "CO", "COLOMBIA",
+                       "KM", "COMOROS",
+                       "CG", "CONGO",
+                       "CD", "CONGO, THE DEMOCRATIC REPUBLIC OF THE",
+                       "CK", "COOK ISLANDS",
+                       "CR", "COSTA RICA",
+                       "CI", "COTE D'IVOIRE",
+                       "HR", "CROATIA (local name: Hrvatska)",
+                       "CU", "CUBA",
+                       "CY", "CYPRUS",
+                       "CZ", "CZECH REPUBLIC",
+                       "DK", "DENMARK",
+                       "DJ", "DJIBOUTI",
+                       "DM", "DOMINICA",
+                       "DO", "DOMINICAN REPUBLIC",
+                       "TP", "EAST TIMOR",
+                       "EC", "ECUADOR",
+                       "EG", "EGYPT",
+                       "SV", "EL SALVADOR",
+                       "GQ", "EQUATORIAL GUINEA",
+                       "ER", "ERITREA",
+                       "EE", "ESTONIA",
+                       "ET", "ETHIOPIA",
+                       "FK", "FALKLAND ISLANDS (MALVINAS)",
+                       "FO", "FAROE ISLANDS",
+                       "FJ", "FIJI",
+                       "FI", "FINLAND",
+                       "FR", "FRANCE",
+                       "FX", "FRANCE, METROPOLITAN",
+                       "GF", "FRENCH GUIANA",
+                       "PF", "FRENCH POLYNESIA",
+                       "TF", "FRENCH SOUTHERN TERRITORIES",
+                       "GA", "GABON",
+                       "GM", "GAMBIA",
+                       "GE", "GEORGIA",
+                       "DE", "GERMANY",
+                       "GH", "GHANA",
+                       "GI", "GIBRALTAR",
+                       "GR", "GREECE",
+                       "GL", "GREENLAND",
+                       "GD", "GRENADA",
+                       "GP", "GUADELOUPE",
+                       "GU", "GUAM",
+                       "GT", "GUATEMALA",
+                       "GN", "GUINEA",
+                       "GW", "GUINEA-BISSAU",
+                       "GY", "GUYANA",
+                       "HT", "HAITI",
+                       "HM", "HEARD AND MC DONALD ISLANDS",
+                       "VA", "HOLY SEE (VATICAN CITY STATE)",
+                       "HN", "HONDURAS",
+                       "HK", "HONG KONG",
+                       "HU", "HUNGARY",
+                       "IS", "ICELAND",
+                       "IN", "INDIA",
+                       "ID", "INDONESIA",
+                       "IR", "IRAN (ISLAMIC REPUBLIC OF)",
+                       "IQ", "IRAQ",
+                       "IE", "IRELAND",
+                       "IL", "ISRAEL",
+                       "IT", "ITALY",
+                       "JM", "JAMAICA",
+                       "JP", "JAPAN",
+                       "JO", "JORDAN",
+                       "KZ", "KAZAKHSTAN",
+                       "KE", "KENYA",
+                       "KI", "KIRIBATI",
+                       "KP", "KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF",
+                       "KR", "KOREA, REPUBLIC OF",
+                       "KW", "KUWAIT",
+                       "KG", "KYRGYZSTAN",
+                       "LA", "LAO PEOPLE'S DEMOCRATIC REPUBLIC",
+                       "LV", "LATVIA",
+                       "LB", "LEBANON",
+                       "LS", "LESOTHO",
+                       "LR", "LIBERIA",
+                       "LY", "LIBYAN ARAB JAMAHIRIYA",
+                       "LI", "LIECHTENSTEIN",
+                       "LT", "LITHUANIA",
+                       "LU", "LUXEMBOURG",
+                       "MO", "MACAU",
+                       "MK", "MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF",
+                       "MG", "MADAGASCAR",
+                       "MW", "MALAWI",
+                       "MY", "MALAYSIA",
+                       "MV", "MALDIVES",
+                       "ML", "MALI",
+                       "MT", "MALTA",
+                       "MH", "MARSHALL ISLANDS",
+                       "MQ", "MARTINIQUE",
+                       "MR", "MAURITANIA",
+                       "MU", "MAURITIUS",
+                       "YT", "MAYOTTE",
+                       "MX", "MEXICO",
+                       "FM", "MICRONESIA, FEDERATED STATES OF",
+                       "MD", "MOLDOVA, REPUBLIC OF",
+                       "MC", "MONACO",
+                       "MN", "MONGOLIA",
+                       "MS", "MONTSERRAT",
+                       "MA", "MOROCCO",
+                       "MZ", "MOZAMBIQUE",
+                       "MM", "MYANMAR",
+                       "NA", "NAMIBIA",
+                       "NR", "NAURU",
+                       "NP", "NEPAL",
+                       "NL", "NETHERLANDS",
+                       "AN", "NETHERLANDS ANTILLES",
+                       "NC", "NEW CALEDONIA",
+                       "NZ", "NEW ZEALAND",
+                       "NI", "NICARAGUA",
+                       "NE", "NIGER",
+                       "NG", "NIGERIA",
+                       "NU", "NIUE",
+                       "NF", "NORFOLK ISLAND",
+                       "MP", "NORTHERN MARIANA ISLANDS",
+                       "NO", "NORWAY",
+                       "OM", "OMAN",
+                       "PK", "PAKISTAN",
+                       "PW", "PALAU",
+                       "PA", "PANAMA",
+                       "PG", "PAPUA NEW GUINEA",
+                       "PY", "PARAGUAY",
+                       "PE", "PERU",
+                       "PH", "PHILIPPINES",
+                       "PN", "PITCAIRN",
+                       "PL", "POLAND",
+                       "PT", "PORTUGAL",
+                       "PR", "PUERTO RICO",
+                       "QA", "QATAR",
+                       "RE", "REUNION",
+                       "RO", "ROMANIA",
+                       "RU", "RUSSIAN FEDERATION",
+                       "RW", "RWANDA",
+                       "KN", "SAINT KITTS AND NEVIS",
+                       "LC", "SAINT LUCIA",
+                       "VC", "SAINT VINCENT AND THE GRENADINES",
+                       "WS", "SAMOA",
+                       "SM", "SAN MARINO",
+                       "ST", "SAO TOME AND PRINCIPE",
+                       "SA", "SAUDI ARABIA",
+                       "SN", "SENEGAL",
+                       "SC", "SEYCHELLES",
+                       "SL", "SIERRA LEONE",
+                       "SG", "SINGAPORE",
+                       "SK", "SLOVAKIA (Slovak Republic)",
+                       "SI", "SLOVENIA",
+                       "SB", "SOLOMON ISLANDS",
+                       "SO", "SOMALIA",
+                       "ZA", "SOUTH AFRICA",
+                       "GS", "SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS",
+                       "ES", "SPAIN",
+                       "LK", "SRI LANKA",
+                       "SH", "ST. HELENA",
+                       "PM", "ST. PIERRE AND MIQUELON",
+                       "SD", "SUDAN",
+                       "SR", "SURINAME",
+                       "SJ", "SVALBARD AND JAN MAYEN ISLANDS",
+                       "SZ", "SWAZILAND",
+                       "SE", "SWEDEN",
+                       "CH", "SWITZERLAND",
+                       "SY", "SYRIAN ARAB REPUBLIC",
+                       "TW", "TAIWAN, PROVINCE OF CHINA",
+                       "TJ", "TAJIKISTAN",
+                       "TZ", "TANZANIA, UNITED REPUBLIC OF",
+                       "TH", "THAILAND",
+                       "TG", "TOGO",
+                       "TK", "TOKELAU",
+                       "TO", "TONGA",
+                       "TT", "TRINIDAD AND TOBAGO",
+                       "TN", "TUNISIA",
+                       "TR", "TURKEY",
+                       "TM", "TURKMENISTAN",
+                       "TC", "TURKS AND CAICOS ISLANDS",
+                       "TV", "TUVALU",
+                       "UG", "UGANDA",
+                       "UA", "UKRAINE",
+                       "AE", "UNITED ARAB EMIRATES",
+                       "GB", "UNITED KINGDOM",
+                       "US", "UNITED STATES",
+                       "UM", "UNITED STATES MINOR OUTLYING ISLANDS",
+                       "UY", "URUGUAY",
+                       "UZ", "UZBEKISTAN",
+                       "VU", "VANUATU",
+                       "VE", "VENEZUELA",
+                       "VN", "VIET NAM",
+                       "VG", "VIRGIN ISLANDS (BRITISH)",
+                       "VI", "VIRGIN ISLANDS (U.S.)",
+                       "WF", "WALLIS AND FUTUNA ISLANDS",
+                       "EH", "WESTERN SAHARA",
+                       "YE", "YEMEN",
+                       "YU", "YUGOSLAVIA",
+                       "ZM", "ZAMBIA",
+                       "ZW", "ZIMBABWE",
+                       );
+    return %Hash;
+}
+
+"That's all folks ;-)";
+
+__END__
+
+=head1 NAME
+
+exchange.pl - Exchange between currencies
+
+=head1 PREREQUISITES
+
+       LWP::UserAgent
+       HTTP::Request::Common
+
+=head1 PARAMETERS
+
+exchange
+
+=head1 PUBLIC INTERFACE
+
+       Exchange <amount> <currency> for|[in]to <currency>
+
+=head1 DESCRIPTION
+
+Contacts C<www.xe.net> and grabs the exchange rates; warning - the
+currency code is a bit cranky.
+
+=head1 AUTHORS
+
+Bobby <bobby@bofh.dk>