Wolfram|Alpha IRC script
by CyberShadow on Jan.02, 2011, under Code
If you’re hanging out on the same GameSurge channel(s) as me, you probably know about Byte‘s tehh6x bot. I’ve recently added a Wolfram|Alpha command to it, allowing it to query W|A and return the results in a somewhat IRC-compatible format. Here’s the code:
#!/usr/bin/perl
use strict;
use warnings;
use URI::Escape;
use LWP::UserAgent;
use HTML::Entities;
sub uhoh {
print "Timeout.\n";
exit
}
my $query = <STDIN>;
$query =~ s/\n//;
$SIG{ALRM} = \&uhoh;
alarm(10);
my $url = 'http://www.wolframalpha.com/input/?i=' .
uri_escape( $query, "^A-Za-z0-9" );
my $ua = LWP::UserAgent->new( agent => 'eggdrop/1.6' );
my $response = $ua->get( $url );
$response->is_success or
die "$url: ", $response->status_line;
my $content = $response->content;
my @captions = $content =~ m|<h2>(.*?)</h2>|g;
my @results = $content =~ m|alt="(.*?)"|g;
if ( scalar(@captions) ) {
@results = map {
$_ =~ /^link to \/input\/\?i=/ ? () : $_
} @results[1..$#results];
my @lines = map {
my $result = $results[$_];
if (length($result) > 300) {
while (length($result) > 300 && $result =~ /\\n/) {
$result =~ s/^(.*)\\n.*$/$1/;
}
$result .= "\\n(...)"
}
(length($result)>0 && length($result)<300) ?
"$captions[$_] $result\n" : ()
} 0..$#captions;
#@lines = grep {!/\\n/} @lines; # skip multi-line pods
if ( scalar(@lines) > 1 ) {
my $result = join("",@lines);
$result = decode_entities($result);
$result =~ s/ \| / - /g;
$result =~ s/\\n/ | /g;
$result =~ s/\\(['"])/$1/g;
$result =~ s/\((open|close) curly quote\)/'/g;
$result =~ s/\((open|close) curly double quote\)/"/g;
print $result;
} else {
print "$url\n";
}
} else {
print "?\n";
}