#!/usr/bin/perl use strict; ## CONFIGURATION my $SERVER = "irc.perl.org"; my $NICK = "search_merlyn_text"; my @CHANNELS = qw(#search_merlyn_text #search_merlyn_text2); ## END CONFIGURATION use POE; BEGIN { package MyBot; use POE qw(Component::IRC); use base POE::Session::Attribute::; use Yahoo::Search AppId => 'YahooDemo'; sub full_to_nick { (shift =~ /(.*?)!/)[0] } sub _start : Package { my ($heap) = @_[HEAP]; my $irc = $heap->{irc} = POE::Component::IRC->spawn; }; sub irc_registered : Package { # client is ready to connect my ($sender) = @_[SENDER]; my $irc = $sender->get_heap; ## warn "trying to connect"; $irc->yield(connect => {server => $SERVER, nick => $NICK}); }; sub irc_255 : Package { # server is done blabbering my ($sender) = @_[SENDER]; my $irc = $sender->get_heap; ## warn "trying to join @CHANNELS"; $irc->yield(join => $_) for @CHANNELS; }; sub irc_join : Package { # server says we joined my ($sender) = @_[SENDER]; my $irc = $sender->get_heap; my ($who, $channel) = @_[ARG0..ARG1]; $who = full_to_nick($who); ## warn "$who joined $channel"; if ($who eq $NICK) { $irc->yield(privmsg => $channel => "Hello! I search merlyn's columns at http://www.stonehenge.com/merlyn/columns.html!"); } }; sub irc_public : Package { # public message in a channel my ($sender) = @_[SENDER]; my $irc = $sender->get_heap; my ($who, $channels, $message) = @_[ARG0..ARG2]; $who = full_to_nick($who); ## warn "$who said $message in @$channels"; if ($message =~ /^\Q$NICK\E(?:,|:)\s*(.*)/) { my $search = $1; $_[KERNEL]->yield(search => $irc, $channels, $search, "$who: "); } }; sub irc_msg : Package { # private message to me my ($sender) = @_[SENDER]; my $irc = $sender->get_heap; my ($who, $me, $message) = @_[ARG0..ARG2]; $who = full_to_nick($who); ## warn "$who said $message to me"; $_[KERNEL]->yield(search => $irc, [$who], $message); }; sub irc_ctcp_action : Package { # public emote my ($sender) = @_[SENDER]; my $irc = $sender->get_heap; my ($who, $channels, $message) = @_[ARG0..ARG2]; $who = full_to_nick($who); ## warn "$who *$message* in @$channels"; }; sub search : Package { # time for us to search my ($irc, $channels, $search, $prefix) = @_[ARG0..ARG3]; ## warn "@$channels wants to see $prefix [results of $search]"; my @results; for my $result (Yahoo::Search->Results (Doc => "site:stonehenge.com $search", Count => 20)) { next unless $result->Url =~ /col\d\w*\.html$/; ## return results as mediawiki-like links push @results, sprintf "[%s %s]", $result->Url, $result->Title; last if @results >= 3; } @results = "Nothing. Please let Randal know of your great column idea!" unless @results; $prefix ||= ""; $irc->yield(privmsg => $channels => "${prefix}$search: @results"); }; sub _default : Package { our $IGNORE_THESE ||= { map { $_ => 1 } qw(_child irc_plugin_add irc_isupport irc_snotice irc_connected irc_mode irc_ping irc_part irc_001 irc_002 irc_003 irc_004 irc_005 irc_250 irc_251 irc_252 irc_254 irc_255 irc_265 irc_266 irc_353 irc_366 irc_372 irc_375 irc_376 ) }; return if $IGNORE_THESE->{$_[ARG0]}; printf "%s: session %s caught an unhandled %s event.\n", scalar localtime(), $_[SESSION]->ID, $_[ARG0]; print "The $_[ARG0] event was given these parameters: ", join(" ", map({"ARRAY" eq ref $_ ? "[@$_]" : "$_"} @{$_[ARG1]})), "\n"; 0; # false for signals }; } MyBot->spawn; $poe_kernel->run;