App-Alice
view release on metacpan or search on metacpan
lib/App/Alice/IRC.pm view on Meta::CPAN
my $self = shift;
my $nick = $self->cl->nick;
if ($nick and $nick ne "") {
$self->nick_cached($nick);
return $nick;
}
return $self->nick_cached || "Failure";
}
sub windows {
my $self = shift;
return grep
{$_->type ne "info" && $_->irc->alias eq $self->alias}
$self->app->windows;
}
sub channels {
my $self = shift;
return map {$_->title} grep {$_->is_channel} $self->windows;
}
sub connect {
my $self = shift;
$self->disabled(0);
$self->increase_reconnect_count;
$self->cl->{enable_ssl} = $self->config->{ssl} ? 1 : 0;
# some people don't set these, wtf
if (!$self->config->{host} or !$self->config->{port}) {
$self->log(info => "can't connect: missing either host or port");
return;
}
$self->reconnect_count > 1 ?
$self->log(info => "reconnecting: attempt " . $self->reconnect_count)
: $self->log(debug => "connecting");
$self->cl->connect(
$self->config->{host}, $self->config->{port}
);
}
sub connected {
my ($self, $cl, $err) = @_;
if (defined $err) {
$self->log(info => "connect error: $err");
$self->reconnect();
return;
}
$self->log(info => "connected");
$self->reset_reconnect_count;
$self->connect_time(time);
$self->is_connected(1);
$self->cl->register(
$self->nick, $self->config->{username},
$self->config->{ircname}, $self->config->{password}
);
$self->broadcast({
type => "action",
event => "connect",
session => $self->alias,
windows => [map {$_->serialized} $self->windows],
});
}
sub reconnect {
my ($self, $time) = @_;
my $interval = time - $self->connect_time;
if ($interval < 15) {
$time = 15 - $interval;
$self->log(debug => "last attempt was within 15 seconds, delaying $time seconds")
}
if (!defined $time) {
# increase timer by 15 seconds each time, until it hits 5 minutes
$time = min 60 * 5, 15 * $self->reconnect_count;
}
$self->log(debug => "reconnecting in $time seconds");
$self->reconnect_timer(
AnyEvent->timer(after => $time, cb => sub {
$self->connect unless $self->is_connected;
})
);
}
sub cancel_reconnect {
my $self = shift;
$self->reconnect_timer(undef);
$self->reset_reconnect_count;
}
sub registered {
my $self = shift;
my @log;
$self->cl->enable_ping (300, sub {
$self->is_connected(0);
$self->log(debug => "ping timeout");
$self->reconnect(0);
});
for (@{$self->config->{on_connect}}) {
push @log, "sending $_";
$self->send_raw($_);
}
# merge auto-joined channel list with existing channels
my @channels = uniq @{$self->config->{channels}}, $self->channels;
for (@channels) {
push @log, "joining $_";
$self->send_srv("JOIN", split /\s+/);
( run in 0.537 second using v1.01-cache-2.11-cpan-f56aa216473 )