Alice
view release on metacpan or search on metacpan
lib/Alice/Role/IRCEvents.pm view on Meta::CPAN
package Alice::Role::IRCEvents;
use AnyEvent;
use Any::Moose 'Role';
use IRC::Formatting::HTML qw/irc_to_html/;
use AnyEvent::IRC::Util qw/split_prefix/;
use List::Util qw/min/;
use Try::Tiny;
use Class::Throwable qw/InvalidNetwork DisconnectError ConnectError/;
our %EVENTS;
sub build_events {
my ($self, $irc) = @_;
return +{
map {
my $event = $_;
$event => sub {
my @args = @_; # we don't need the client
shift @args;
AE::log trace => "$event event for " . $irc->name;
try {
$EVENTS{$event}->($self, $irc, @args);
}
catch {
AE::log debug => "Error in $event: $_";
$self->send_info("Please report this bug! $_");
}
}
} keys %EVENTS
}
}
sub irc_event {
my ($name, $code) = @_;
if ($code) {
if (ref $name eq 'ARRAY') {
irc_event($_, $code) for @$name;
return;
}
$name = "irc_$name" if $name =~ /^\d+$/;
}
$EVENTS{$name} = $code;
}
irc_event connect => sub {
my ($self, $irc, $err) = @_;
$irc->is_connecting(0);
if ($irc->cl->{socket}) {
$irc->cl->{socket}->rbuf_max(1024 * 10); # 10K max read buffer
}
if (defined $err) {
$self->send_info($irc->name, "connect error: $err");
$self->reconnect_irc($irc->name);
return;
}
$self->send_info($irc->name, "connected");
$irc->connect_time(time);
$self->broadcast({
type => "action",
event => "connect",
network => $irc->name,
});
my $config = $self->config->servers->{$irc->name};
$irc->cl->register(
$config->{nick}, $config->{username}, $config->{ircname}, $config->{password}
);
};
irc_event registered => sub {
my ($self, $irc) = @_;
my $config = $self->config->servers->{$irc->name};
$irc->reset_reconnect_count;
$irc->cl->{connected} = 1; # AE::IRC seems broken here...
my @commands = ();
( run in 3.627 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )