3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-12-23 19:22:40 +01:00
pbot/modules/weather.pl
Pragmatic Software 73b793295b todo! add support for admin management - needs support for adding/removing/saving!
todo! multi-channel support pathetic (note 12/08/09, fixed multi-channel for anti-flood and for ignore)
todo! most of this crap needs to be refactored (note 11/23/09, refactored execute_module)

0.4.1 (12/08/09): improved anti-flood system to be significantly more accurate and per-channel
                  added per-nick-per-channel message history using %flood_watch
                  add per-channel support to ignore system
                  automatically remove message history for nicks that haven't spoken in one day (run once per hour)
                  do not ignore !login command
0.3.16(11/23/09): refactored module execution to execute_module() subroutine
                  added trigger to execute get_title.pl module when URL is
                  detected in regular untriggered chat
0.3.15(11/20/09): replace 'me' with '$nick' in arguments
2009-12-09 01:08:12 +00:00

224 lines
4.4 KiB
Perl
Executable File

#!/usr/bin/perl -I /home/msmud/lib/lib/perl5/site_perl/5.10.0/
use LWP::Simple;
my ($text, $weather, $location, $date, $i, $day, @days);
if($#ARGV < 0)
{
print "Try again. Please specify the location you would like weather for.\n";
die;
}
$location = join("+", @ARGV);
$location =~ s/,/%2C/;
if($location =~ m/\+-(.*)/)
{
$date = $1;
$location =~ s/\+-.*//;
}
$i = 0;
$text = get("http://weather.yahoo.com/search/weather2?p=$location");
$location =~ s/\+/ /g;
$location =~ s/%2C/,/g;
if($text =~ m/No match found/)
{
print "$location is not a valid location for this service.\n";
die;
}
my $found = 0;
my $buf;
if($text =~ m/location matches\:/g)
{
$buf = "Multiple locations found: ";
while($text =~ m/<a\shref="\/forecast\/(.*?)">(.*?)<\/a>/g)
{
$i = $1;
$weather = $2;
$weather =~ s/<b>//g;
$weather =~ s/<\/b>//g;
$weather =~ s/^\s+//;
$buf = $buf . "$weather - ";
if($location =~ m/$weather/i)
{
$text = get("http://weather.yahoo.com/forecast/$i");
$found = 1;
}
}
$buf = $buf. "please specify one of these.\n";
if (not $found)
{
print $buf;
die;
}
}
my ($update, $temp, $high, $low, $tempc, $highc, $lowc, $cond,
$today, $tonight, $country, $state, $city, $humid, $wind,
$sunup, $sundown, $feels, $feelsc);
$text =~ m/<a href="\/">Weather<\/a>\s>/g;
$text =~ m/<a href=.*?>(.*?)<\/a>\s>/g;
$country = $1;
if($country eq "North America")
{
$text =~ m/<a href=.*?>(.*?)<\/a>\s>/g;
$country = $1;
}
if($country ne "Canada")
{
$text =~ m/<a href=.*?>(.*?)<\/a>\s>/g;
$state = $1;
}
$text =~ m/^(.*?)<\/b><\/font>/mg;
$city = $1;
$update = $1
if $text =~ m/at:\s(.*?)<\/font><\/td>/gi;
while($text =~
m/<td\swidth\=\".*?align\=center\scolspan\=.*?\sface\=.*?\s.*?<b>(.*?)<\/b>/g)
{
push(@days, $1);
}
foreach $day (@days)
{
if($date =~ m/$day/i)
{
$date = $i;
last;
}
$i = $i + 1;
}
if($i > 4 && $date ne "")
{
print("\'$date\' is not a valid day, valid days for $country, $state, $city are: ",
join(" ", @days[1,2,3,4]), "\n");
die;
}
$text =~ m/Currently:/g;
$temp = $1
if($text =~ m/<b>(.*?)&deg/g);
if($date == 0)
{
$text =~ m/Arial\ssize=2>(.*?)</g;
$cond = $1
}
else
{
for($i = 0; $i <= $date; $i++)
{
$text =~ m/<td\salign.*?\scolspan.*?size=2>(.*?)&/mgi;
$cond = $1;
}
}
if($cond eq "Unknown")
{
for($i = 0; $i <= $date; $i++)
{
$text =~ m/<td\salign.*?\scolspan.*?size=2>(.*?)&/mgi;
$cond = $1;
}
}
for($i = 0; $i <= $date; $i++)
{
$text =~
m/<td\salign=right\scolspan=1.*?face=Arial>High\:.*?size=3\sface=Arial>\n\s\s(.*?)\&/sgi;
$high = $1;
}
for($i = 0; $i <= $date; $i++)
{
$text =~
m/<td\salign=right\scolspan=1.*?face=Arial>Low\:.*?size=3\sface=Arial>\n\s(.*?)\&/sgi;
$low = $1;
}
if($text =~ m/More Current Conditions<\/b>/g)
{
$text =~ m/Feels Like:/g;
$feels = $1
if($text =~ m/size=2>\n(.*?)&deg/sg);
$text =~ m/Wind:/g;
$wind = $1
if($text =~ m/size=2>\n(.*?)</sg);
$wind =~ s/\n//g;
$wind =~ s/\r//g;
$text =~ m/Humidity:/g;
$humid = $1
if($text =~ m/size=2>\n(.*?)\n/sg);
$text =~ m/Sunrise:/g;
$sunup = $1
if($text =~ m/size=2>\n(.*?)</sg);
$text =~ m/Sunset:/g;
$sundown = $1
if($text =~ m/size=2>\n(.*?)</sg);
}
$today = "Today: $1"
if $text =~ m/<b>Today:<\/b>\s(.*?)<p>/g;
$tonight = "Tonight: $1"
if $text =~ m/<b>Tonight:<\/b>\s(.*?)<p>/g;
$feelsc = int(5/9*($feels - 32));
$tempc = int(5/9*($temp - 32));
$highc = int(5/9*($high - 32));
$lowc = int(5/9*($low - 32));
if($date > 0)
{
$date = "[".$days[$date]."] ";
}
$date =~ s/Mon/Monday/i;
$date =~ s/Tue/Tuesday/i;
$date =~ s/Wed/Wednesday/i;
$date =~ s/Thu/Thursday/i;
$date =~ s/Fri/Friday/i;
$date =~ s/Sat/Saturday/i;
$date =~ s/Sun/Sunday/i;
if($date eq "")
{
print "$country, $state, $city (Updated $update): Temp: ".$temp."F/".$tempc."C (Feels like: $feels"."F/".$feelsc."C), ".
"High: ".$high."F/".$highc."C, Low: ".$low."F/".$lowc."C, ".
"Sky: $cond, Humidity: $humid, Wind: $wind, Sunrise: $sunup, Sunset: $sundown, $today $tonight\n";
}
else
{
print "$country, $state, $city (Updated $update): $date".
"High: ".$high."F/".$highc."C, Low: ".$low."F/".$lowc."C, ".
"Sky: $cond.\n";
}