Wolfram|Alpha IRC script

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";
}

Leave a Reply

Your email address will not be published. Required fields are marked *