Adam
view release on metacpan or search on metacpan
lib/Adam.pm view on Meta::CPAN
package Adam;
# ABSTRACT: The patriarch of IRC Bots
our $VERSION = '1.003';
use MooseX::POE;
use namespace::autoclean;
use POE::Component::IRC::Common qw( :ALL );
use POE qw(
Component::IRC::State
Component::IRC::Plugin::PlugMan
Component::IRC::Plugin::Connector
Component::IRC::Plugin::ISupport
Component::IRC::Plugin::NickReclaim
Component::IRC::Plugin::BotAddressed
Component::IRC::Plugin::AutoJoin
);
use MooseX::Aliases;
use Adam::Logger::Default;
with qw(
MooseX::SimpleConfig
MooseX::Getopt
);
has logger => (
does => 'Adam::Logger::API',
is => 'ro',
traits => ['NoGetopt'],
lazy_build => 1,
handles => 'Adam::Logger::API',
);
sub _build_logger { Adam::Logger::Default->new() }
has nickname => (
isa => 'Str',
reader => 'get_nickname',
alias => 'nick',
traits => ['Getopt'],
cmd_flag => 'nickname',
required => 1,
builder => 'default_nickname',
);
sub default_nickname { $_[0]->meta->name }
has server => (
isa => 'Str',
reader => 'get_server',
traits => ['Getopt'],
cmd_flag => 'server',
required => 1,
builder => 'default_server',
);
sub default_server { 'irc.perl.org' }
has port => (
isa => 'Int',
reader => 'get_port',
traits => ['Getopt'],
cmd_flag => 'port',
required => 1,
builder => 'default_port',
);
sub default_port { 6667 }
has channels => (
isa => 'ArrayRef',
reader => 'get_channels',
traits => ['Getopt'],
cmd_flag => 'channels',
builder => 'default_channels',
auto_deref => 1,
);
sub default_channels { [] }
has owner => (
isa => 'Str',
accessor => 'get_owner',
traits => ['Getopt'],
cmd_flag => 'owner',
builder => 'default_owner',
);
sub default_owner { 'perigrin!~perigrin@217.168.150.167' }
has username => (
isa => 'Str',
accessor => 'get_username',
traits => ['Getopt'],
cmd_flag => 'username',
builder => 'default_username',
);
sub default_username { 'adam' }
has password => (
isa => 'Str',
accessor => 'get_password',
traits => ['Getopt'],
cmd_flag => 'password',
builder => 'default_password',
);
sub default_password { '' }
has flood => (
isa => 'Bool',
reader => 'can_flood',
traits => ['Getopt'],
cmd_flag => 'flood',
builder => 'default_flood',
);
sub default_flood { 0 }
has plugins => (
isa => 'HashRef',
traits => [ 'Hash', 'NoGetopt' ],
lazy => 1,
auto_deref => 1,
builder => 'default_plugins',
handles => {
plugin_names => 'keys',
get_plugin => 'get',
has_plugins => 'count'
}
);
sub core_plugins {
return {
'Core_Connector' => 'POE::Component::IRC::Plugin::Connector',
'Core_BotAddressed' => 'POE::Component::IRC::Plugin::BotAddressed',
'Core_AutoJoin' => POE::Component::IRC::Plugin::AutoJoin->new(
Channels => { map { $_ => '' } @{ $_[0]->get_channels } },
),
'Core_NickReclaim' =>
POE::Component::IRC::Plugin::NickReclaim->new( poll => 30 ),
};
}
sub custom_plugins { {} }
sub default_plugins {
return { %{ $_[0]->core_plugins }, %{ $_[0]->custom_plugins } };
}
has plugin_manager => (
isa => 'POE::Component::IRC::Plugin::PlugMan',
is => 'ro',
lazy_build => 1,
);
sub _build_plugin_manager {
POE::Component::IRC::Plugin::PlugMan->new(
botowner => $_[0]->get_owner,
debug => 1
);
}
before 'START' => sub {
my ($self) = @_;
$self->plugin_add( 'PlugMan' => $self->plugin_manager );
};
has poco_irc_args => (
isa => 'HashRef',
accessor => 'get_poco_irc_args',
traits => [ 'Hash', 'Getopt' ],
cmd_flag => 'extra_args',
builder => 'default_poco_irc_args',
);
sub default_poco_irc_args {
{};
}
has poco_irc_options => (
isa => 'HashRef',
accessor => 'get_poco_irc_options',
traits => [ 'Hash', 'Getopt' ],
cmd_flag => 'extra_args',
builder => 'default_poco_irc_options',
);
sub default_poco_irc_options { { trace => 0 } }
has _irc => (
isa => 'POE::Component::IRC',
accessor => 'irc',
lazy_build => 1,
handles => {
irc_session_id => 'session_id',
server_name => 'server_name',
plugin_add => 'plugin_add',
}
);
sub _build__irc {
my $self = shift;
POE::Component::IRC::State->spawn(
Nick => $self->get_nickname,
Server => $self->get_server,
Port => $self->get_port,
Ircname => $self->get_nickname,
Options => $self->get_poco_irc_options,
Flood => $self->can_flood,
Username => $self->get_username,
Password => $self->get_password,
%{ $self->get_poco_irc_args },
);
}
sub privmsg {
my $self = shift;
POE::Kernel->post( $self->irc_session_id => privmsg => @_ );
}
sub START {
my ( $self, $heap ) = @_[ OBJECT, HEAP ];
$poe_kernel->post( $self->irc_session_id => register => 'all' );
$poe_kernel->post( $self->irc_session_id => connect => {} );
$self->info( 'connecting to ' . $self->get_server . ':' . $self->get_port );
return;
}
sub load_plugin {
my ( $self, $name, $plugin ) = @_;
$self->plugin_manager->load( $name => $plugin, bot => $self );
}
event irc_plugin_add => sub {
my ( $self, $desc, $plugin ) = @_[ OBJECT, ARG0, ARG1 ];
$self->info("loaded plugin: $desc");
if ( $desc eq 'PlugMan' ) {
$self->debug("loading other plugins");
for my $name ( sort $self->plugin_names ) {
$self->debug("loading $name");
$plugin = $self->get_plugin($name);
( run in 3.343 seconds using v1.01-cache-2.11-cpan-140bd7fdf52 )