All pastes #756730 Raw Edit

Someone

public text v1 · immutable
#756730 ·published 2007-10-31 18:30 UTC
rendered paste body
#!perl -T

use strict;
use Irssi;
use LWP::Simple;
use LWP::UserAgent;
use CGI qw/unescapeHTML/;
use vars qw($VERSION %IRSSI);

$VERSION = '0.0.1';

%IRSSI = (
    'authors' => 'Craig Andrews',
    'contact' => 'craig@simplyspiffing.com',
    'name'    => 'lookupbot',
    'description' => 'Some kind of magical internet searcher',
    'license' => 'Craig\'s Magical Freebie License');

# Get the count and cleaned up data
sub get_data {
    my $data = shift;

    my @params = split / +/, $data;
    my $trigger = shift @params;

    my $count = 1;
    if (defined $params[0] && int($params[0]) > 0) {
        $count = shift @params;
        $count = 10 if $count > 10;
    }

    $data = join ' ', @params;
    $data =~ s/[^[:print:]]/ /g;
    $data =~ s/  */ /g;

    return ($trigger, $count, $data);
}

# Retrieve the content froma url
sub get_content {
    my ($url, $data) = @_;

    $data = CGI::escape($data);
    $url = sprintf($url, $data) if defined $data;

    my $ua = LWP::UserAgent->new(agent => "google suck");
    my $result = $ua->get($url);

    my $content;
    $content = $result->content if $result->is_success;

    return $content;
}

sub image_search {
    my $content = shift;

    my @definitions = $content =~ /imgurl=(.+?)\&/g;

    return @definitions;
}

sub define_search {
    my $content = shift;

    $content =~ s/[\n\r]+/ /g;
    my @definitions = $content =~ /(?<=<li>)(.+?)(?=<br>|<li>)/ig;

    return @definitions;
}

sub dict_search {
    my $content = shift;

    $content =~ s/[\n\r]+/ /g;
    $content = '' if $content =~ /No entry found for/;
    $content =~ s/[^[:print:]]//g;
    $content =~ s/^(.*?)(?=entr(y|ies) found for)//;
    $content =~ s/(.*?)<\/table>/$1/ig;
    $content =~ s/<\/?CITE>/"/g;

    my @definitions;
    if ($content =~ /^entry/) {
        my @tmp = $content =~ /<p>(.+?)<\/p>/ig;
        @definitions[0] = @tmp[1];
    } else {
        @definitions = $content =~ /(?<=<li>|<dd>)(.+?)(?=<br>|<li>|<\/li>|<\/dd>)/ig;
    }

    return @definitions;
}

sub thes_search {
    my $content = shift;

    my @lines = split /\n/, $content;
    @lines = grep { /(Main Entry|Synonyms|Antonyms):/ } @lines;

    my @definitions;
    foreach (@lines) {
        s/^(.*?)<b>/ /;
        s/<\/b>(.*?)<td(.*?)>/ /g;
        s/<\/td>.*$/ /;

        if (/Main Entry:/ || scalar(@definitions) == 0) {
            push @definitions, $_;
        } else {
            $definitions[@definitions - 1] .= "\n$_";
        }
    }

    return @definitions;
}

sub urban_search {
    my $content = shift;

    $content =~ s/[\n\r]+/ /g;
    $content = '' if $content =~ /is undefined/;
    $content =~ s/[^[:print:]]//g;
    my @lines = $content =~ /<div class="(def_p)">(.+?)<div class="tags">/ig;

    my @definitions;
    my $ix;
    for ($ix = 0; $ix < @lines; $ix++) {
        my $line = $lines[$ix];
        unless ($line =~ /def_p/) {
            $line =~ s/<\/p>/\n/g;
            push @definitions, $line;
        }
    }

    return @definitions;
}

sub profan_search {
    my $content = shift;

    my @matches = $content =~ /<a href="(profan_results.php\?profan=searchstory.+?)">(.+?)</gsi;
    return '' unless @matches;

    my %definitions;
    my $ix;
    for ($ix = 0; $ix < @matches; $ix+=2) {
        my $key = $matches[$ix+1];
        $key =~ tr/A-Z/a-z/;
        $definitions{$key} = $matches[$ix];
    }

    my @keys = sort keys %definitions;

    $content = get_content('http://www.viz.co.uk/profanisaurus/'.$definitions{$keys[0]});
    @matches = $content =~ /class=profandefinition>(.+)/;

    return join "\n", @matches;
}

###
# Many different lookerupperers
###

my %ENGINES = ('!image' => {'url' => 'http://images.google.co.uk/images?hl=en&q=%s',
                            'sub' => \&image_search},
               '!define' => {'url' => 'http://www.google.co.uk/search?hl=en&q=define%%3A%%20%s',
                             'sub' => \&define_search},
               '!dict' => {'url' => 'http://www.dictionary.com/search?q=%s',
                           'sub' => \&dict_search},
               '!thes' => {'url' => 'http://www.thesaurus.com/search?q=%s',
                           'sub' => \&thes_search},
               '!urban' => {'url' => 'http://www.urbandictionary.com/define.php?term=%s',
                            'sub' => \&urban_search},
               '!profan' => {'url' => 'http://www.viz.co.uk/profanisaurus/profan_results.php?profan=search&prof_search=%s',
                            'sub' => \&profan_search});

# !stuff
sub public_responder {
    my ($server, $data, $nick, $mask, $target) = @_;
    $data =~ s/`//gosm;

    my ($trigger, $count, $term) = get_data($data);

    my @definitions;
    my $found = 0;
    my $func;
    for $func (keys %ENGINES) {
        next unless $trigger eq $func;
        $found = 1;

        my $url = $ENGINES{$func}->{'url'};
        my $sub = $ENGINES{$func}->{'sub'};

        my $content = get_content($url, $term);
        @definitions = &{$sub}($content) if defined $content;
    }

# Quit if this isn't for us
    return unless $found == 1;

# Display if necessary
    if (defined @definitions && scalar(@definitions) > 0) {
        for (my $ix = 0; $ix < @definitions && $ix < $count; $ix++) {
            my @lines = split /\n/, $definitions[$ix];

            my $text;
            foreach $text (@lines) {
                next if $text =~ /^\s*$/;

# Strip HTML
                $text =~ s/<(.*?)>/ /g;
                $text = unescapeHTML($text);

# Strip non-printable characters
                $text =~ s/[^[:print:]]/ /g;

# Sort out whitespace
                $text =~ s/ +/ /g;
                $text =~ s/^ *//;
                $text =~ s/ *$//;

# And display
                $server->command("msg $target -!- $text");
            }
        }
    } else {
        $server->command("msg $target -!- No results found");
    }


}

sub kick_handler {
    my ($server, $channel, $nick, $kicker, $address, $reason) = @_;

    if ($nick eq $server->{nick}) {
        my $chanrec = $server->channel_find( $channel );
        my $password = $chanrec->{ key } if ( $chanrec );
        my $rejoinchan = $chanrec->{ name } if ( $chanrec );
        $server->send_raw("join $rejoinchan $password");
    }
}

Irssi::signal_add("message public", \&public_responder);
Irssi::signal_add("message kick", \&kick_handler);