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 )