#!/usr/bin/perl -w
# This bot should not be run by any sane person. Really. The original idea
# was to join to a channel a bot for every module in CPAN, and have them
# announce when new versions of themselves were released, etc, etc. I can't
# remember who had this insane idea, probably sky. Anyway, this is proof of
# concept code, and inspired the changes in the source that let you put >1
# BasicBot in a single POE session.
# The problem is that with more than 30 or 40 running bots, even on the same
# machine as the IRC server, the latencies get insane. You just can't keep
# them all alive enough to stay connected and not time-out. So the idea was
# a non-starter, because I'm not running a process on the server for every
# module on CPAN. But I can think of some cases where you'd want to run 2 or
# 3 bots in a single session, to bridge networks, say, that sort of thing,
# and so heere's how I'd do it...
# Probably, this does not work.
# The bot moudle itself.
package CPANBot;
use Bot::BasicBot;
use strict;
use warnings::register;
use base 'Bot::BasicBot';
sub create {
my $class = shift;
my $nick = shift;
print STDERR "Creating $nick\n";
my $self = bless Bot::BasicBot->new( nick => $nick,
server => 'london.irc.perl.org',
no_run => 1, # don't run the bot automatically
), $class;
$self->{_delay} = shift || 1;
return $self;
}
sub connected {
my $self = shift;
print STDERR $self->nick." connected\n";
$self->join('#jerakeen');
$self->say(channel => '#jerakeen', body => 'lo, I am '.$self->nick);
}
sub said {
my $self = shift;
my $mess = shift;
print STDERR $self->nick." : ".$mess->{body}."\n";
my $nick = $self->nick;
if ($mess->{body} =~ /$nick/i) {
$self->say(channel => $mess->{channel}, body => 'I 0wnz0r you');
}
if ($nick =~ /$mess->{body}/i) {
$self->say(channel => $mess->{channel}, body => 'you 0wnz0r me');
}
}
package main;
use POE;
use CPANPLUS::Backend;
use Data::Dumper;
my $cp = new CPANPLUS::Backend;
#$cp->reload_indices(update_source => 1);
my $modules = $cp->module_tree;
#print Dumper($modules);
my @names = keys(%$modules);
my @bots;
for (@names) {
s/:+/_/g;
s/\W//g;
# next unless length($_) < 19;
next unless /^Bot/;
push @bots, $_;
print STDERR "$_!\n";
}
my $bot = {};
my $i = 0;
for (@bots) {
# this next line needs a code change to Bot::Basicbot - take the
# $poe_kernel->run line out of the run method, we don't want the bots to
# run themselves.
$bot->{$_} = CPANBot->create($_, $i)->run;
$i+= 11;
}
$poe_kernel->run();