]> git.donarmstrong.com Git - infobot.git/blobdiff - src/Modules/Weather.pl
* Accidentally left in a debug output
[infobot.git] / src / Modules / Weather.pl
index 1b3badec58f6963f6eee5794b909fbcdd994d6d2..516e357f8d9eef814988d48496d2164ac37a2eb5 100644 (file)
@@ -10,8 +10,8 @@ package Weather;
 #           put in a timeout.
 
 my $no_weather;
-my $cache_time = 60 * 40 ; # 40 minute cache time
-my $default = 'KAGC';
+my $cache_time = 60 * 40;    # 40 minute cache time
+my $default    = 'KAGC';
 
 BEGIN {
     $no_weather = 0;
@@ -20,106 +20,132 @@ BEGIN {
 }
 
 sub Weather {
-       my ($args) = @_;
-       &::performStrictReply(&queryText($args));
-       return;
+    my ($args) = @_;
+    &::performStrictReply( &queryText( $args, 'weather' ) );
+    return;
+}
+
+sub Metar {
+    my ($args) = @_;
+    &::performStrictReply( &queryText( $args, 'metar' ) );
+    return;
 }
 
 sub queryText {
     my ($station) = shift;
+    my ($wxmode)  = shift;
     my $result;
 
     $station = uc($station);
     $station =~ s/for //i;
 
     if ($no_weather) {
-       return 0;
-    } else {
-
-       if (exists $cache{$station}) {
-           my ($time, $response) = split $; , $cache{$station};
-           if ((time() - $time) < $cache_time) {
-               return $response;
-           }
-       }
-
-       my $ua = new LWP::UserAgent;
-       $ua->proxy('http', $::param{'httpProxy'}) if (&::IsParam("httpProxy"));
-
-       $ua->timeout(10);
-       my $request = new HTTP::Request('GET', "http://weather.noaa.gov/weather/current/$station.html");
-       my $response = $ua->request($request); 
-
-       if (!$response->is_success) {
-           if ($response->code == 404) {
-               return "I can't find station code \"$station\""
-                   . " (see http://www.nws.noaa.gov/oso/site.shtml"
-                   . " for ICAO locations codes).";
-           } else {
-               return "Something failed in connecting to the NOAA web"
-                   . " server. Try again later.";
-           }
-       }
-
-       $content = $response->content;
-       $content =~ s|.*?<BODY[^>]*>||is;
-       #$content =~ s|.*?current weather conditions.*?<BR>([^<]*?)\s*<.*?</TR>||is;
-       $content =~ s|.*?current weather conditions[^<]*(<[^>]+>\s*)+||is;
-       $content =~ s|([^<]*?)\s*<.*?</TR>||is;
-       my $place = $1;
-       chomp $place;
-
-       $content =~ s|.*?<TR>(?:\s*<[^>]+>)*\s*([^<]+)\s<.*?</TR>||is;
-       my $id = $1;
-       chomp $id;
-
-       $content =~ s|.*?conditions at.*?</TD>||is;
-
-       #$content =~ s|.*?<OPTION SELECTED>\s+([^<]+)\s<OPTION>.*?</TR>||s; # local time
-       $content =~ s|.*?<BR>\s+([^<]+?)\s*</FORM>.*?</TR>||s; # UTC
-       my $time = $1;
-       $time =~ s/-//g;
-       $time =~ s/\s+/ /g;
-
-       $content =~ s|\s(.*?)<TD COLSPAN=2>||s;
-       my $features = $1;
-
-       while ($features =~ s|.*?<TD ALIGN[^>]*>(?:\s*<[^>]+>)*\s+([^<]+?)\s+<.*?<TD>(?:\s*<[^>]+>)*\s+([^<]+?)\s<.*?/TD>||s) {
-           my ($f,$v) = ($1, $2);
-           chomp $f; chomp $v;
-           $feat{$f} = $v;
-       }
-
-       $content =~ s|.*?>(\d+\S+\s+\(\S+\)).*?</TD>||s;  # max temp;
-       $max_temp = $1;
-       $content =~ s|.*?>(\d+\S+\s+\(\S+\)).*?</TD>||s;
-       $min_temp = $1;
-
-       if ($time) {
-           $result = "$place; $id; last updated: $time";
-           foreach (sort keys %feat) {
-               next if $_ eq 'ob';
-               $result .= "; $_: $feat{$_}";
-           }
-           my $t = time();
-           $cache{$station} = join $;, $t, $result;
-       } else {
-           $result = "I can't find that station code (see http://weather.noaa.gov/weather/curcond.html for locations and codes)";
-       }
-       return $result;
+        return 0;
+    }
+    else {
+
+        if ( exists $cache{$station} ) {
+            my ( $time, $response ) = split $;, $cache{$station};
+            if ( ( time() - $time ) < $cache_time ) {
+                return $response;
+            }
+        }
+
+        my $ua = new LWP::UserAgent;
+        $ua->proxy( 'http', $::param{'httpProxy'} )
+          if ( &::IsParam('httpProxy') );
+
+        $ua->timeout(10);
+        my $request =
+          new HTTP::Request( 'GET',
+            "http://weather.noaa.gov/weather/current/$station.html" );
+        my $response = $ua->request($request);
+
+        if ( !$response->is_success ) {
+            if ( $response->code == 404 ) {
+                return "I can't find station code \"$station\""
+                  . " (see http://www.nws.noaa.gov/oso/site.shtml"
+                  . " or http://www.nws.noaa.gov/tg/siteloc.shtml"
+                  . " for ICAO locations codes).";
+            }
+            else {
+                return 'Something failed in connecting to the NOAA web'
+                  . " server. Try again later.";
+            }
+        }
+
+        $content = $response->content;
+        $content =~ s|.*?<BODY[^>]*>||is;
+
+    #$content =~ s|.*?current weather conditions.*?<BR>([^<]*?)\s*<.*?</TR>||is;
+        $content =~ s|.*?current weather conditions[^<]*(<[^>]+>\s*)+||is;
+        $content =~ s|([^<]*?)\s*<.*?</TR>||is;
+        my $place = $1;
+        chomp $place;
+
+        $content =~ s|.*?<TR>(?:\s*<[^>]+>)*\s*([^<]+)\s<.*?</TR>||is;
+        my $id = $1;
+        chomp $id;
+
+        $content =~ s|.*?conditions at.*?</TD>||is;
+
+#$content =~ s|.*?<OPTION SELECTED>\s+([^<]+)\s<OPTION>.*?</TR>||s; # local time
+        $content =~ s|.*?<BR>\s+([^<]+?)\s*</FORM>.*?</TR>||s;    # UTC
+        my $time = $1;
+        $time =~ s/-//g;
+        $time =~ s/\s+/ /g;
+
+        $content =~ s|\s(.*?)<TD COLSPAN=2>||s;
+        my $features = $1;
+
+        while ( $features =~
+s|.*?<TD ALIGN[^>]*>(?:\s*<[^>]+>)*\s+([^<]+?)\s+<.*?<TD>(?:\s*<[^>]+>)*\s+([^<]+?)\s<.*?/TD>||s
+          )
+        {
+            my ( $f, $v ) = ( $1, $2 );
+            chomp $f;
+            chomp $v;
+            $feat{$f} = $v;
+        }
+
+        $content =~ s|.*?>(\d+\S+\s+\(\S+\)).*?</TD>||s;    # max temp;
+        $max_temp = $1;
+        $content =~ s|.*?>(\d+\S+\s+\(\S+\)).*?</TD>||s;
+        $min_temp = $1;
+
+        if ($time) {
+            if ( $wxmode eq 'metar' && defined( $feat{'ob'} ) ) {
+                return ( 'METAR ' . $place . ": " . $feat{'ob'} );
+            }
+
+            $result = "$place; $id; last updated: $time";
+            foreach ( sort keys %feat ) {
+                next if $_ eq 'ob';
+                $result .= "; $_: $feat{$_}";
+            }
+            my $t = time();
+            $cache{$station} = join $;, $t, $result;
+        }
+        else {
+            $result =
+"I can't find that station code (see http://weather.noaa.gov/weather/curcond.html for locations and codes)";
+        }
+        return $result;
     }
 }
 
 if (0) {
-    if (-t STDIN) {
-       my $result = Weather::NOAA::get($default);
-       $result =~ s/; /\n/g;
-       print "\n$result\n\n";
+    if ( -t STDIN ) {
+        my $result = Weather::NOAA::get($default);
+        $result =~ s/; /\n/g;
+        print "\n$result\n\n";
     }
 }
 
 1;
 
+# vim:ts=4:sw=4:expandtab:tw=80
+
 __END__
 
 =head1 NAME