#!/usr/bin/perl -w use Net::IRC; use strict; use LWP::UserAgent; use HTML::Entities; use HTML::Parser; use WWW::Search; use Encode; use URI::Escape; # create the IRC object my $reply; my $irc = new Net::IRC; # Setting up the browser my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'); $ua->timeout(10); $ua->env_proxy; # setting up the parser my $p = HTML::Parser->new(api_version => 3); $p->handler( start => \&html_start_handler, "tagname,self"); # Setting up the search-engine my $google = WWW::Search->new('Google', key => '4MEoDtdQFHKjCtpUhHYZ0NDRxAYxkRhE'); my $urbandictionary = WWW::Search->new('UrbanDictionary', key => 'ce3f79706283e6a097ab318a23e9703f'); sub html_start_handler { return if shift ne "title"; my $self = shift; $self->handler(text => sub { $reply = shift; }, "dtext"); $self->handler(end => sub { shift->eof if shift eq "title"; }, "tagname,self"); } # Create a connection object. You can have more than one "connection" per # IRC object, but we'll just be working with one. my $conn = $irc->newconn( Server => shift || 'se.quakenet.org', Port => shift || '6667', Nick => 'OPFS-Helper', Ircname => 'Stupid Bot', Username => 'OPFSBot' ); $conn->{channel} = shift || '#opfs'; sub join { # shift in our connection object that is passed automatically my $conn = shift; # when we connect, join our channel and greet it $conn->join($conn->{channel}); } sub on_public { # here, we get the connection object, the text of the command, and # the nick of the person who issued the command my ($conn, $command, $nick) = @_; my $result; my $response = ''; # branch off given the nature of the command $_ = $command->{args}[0]; COM: { #For google search if (/^g /) { my $query = substr($_, 2); $google->native_query($query); if ($result = $google->next_result()) { $response = $result->title . " " . $result->url . " " . $result->description . " http://www.google.com/search?q=" . uri_escape($query); $response = decode_entities($response); $response =~ s/<(([^ >]|\n)*)>//g; $conn->privmsg($conn->{channel}, encode("iso-8859-1", $response)); } last COM; } #For fileext search if (/^f /) { } #For urbandictionary search if (/^u /) { my $query = substr($_, 2); $urbandictionary->native_query($query); if ($result = $urbandictionary->next_result()) { $response = substr($result->{definition}, 0, 300) . "... " . $result->url; $conn->privmsg($conn->{channel}, $response); } last COM; } if (/((http:\/\/|www\.)[^\.]{2,}\.[\d\w\.]{2,}(\/[^ ]*)?)/) { $_ = $1; if (!(/^http:/)) { $_ = 'http://'.$_; } my $response = $ua->get($_); if ($response->is_success) { if ($response->headers->content_type eq 'text/html') { $reply = "No title set"; #my $temp = encode("utf8", $response->content); #$p->parse($temp); $p->parse($response->content); #$p->parse($response->decoded_content(charset => 'ISO-8859-1')); } else { $reply = ''; } } else { $reply = "the server timed out" } if ($reply ne '') { $reply =~ s/[\n\r]//g; $reply =~ s/^[\s]*//; #$reply = encode("iso-8859-1", $reply); } $conn->privmsg($conn->{channel}, $reply); } } } # The end of MOTD (message of the day), numbered 376 signifies we've connect $conn->add_handler('376', \&join); $conn->add_handler('422', \&join); $conn->add_handler('kick', \&join); $conn->add_handler('public', \&on_public); # start IRC $irc->start();