Alice
view release on metacpan or search on metacpan
lib/Alice.pm view on Meta::CPAN
}
}
sub connect_actions {
my $self = shift;
map {
$_->join_action,
$_->nicks_action($self->window_nicks($_))
} $self->windows;
}
sub find_window {
my ($self, $title, $irc) = @_;
return $self->info_window if $title eq "info";
my $id = $self->_build_window_id($title, $irc->name);
if (my $window = $self->get_window($id)) {
return $window;
}
}
sub alert {
my ($self, $message) = @_;
return unless $message;
$self->broadcast({
type => "action",
event => "alert",
body => $message,
});
}
sub create_window {
my ($self, $title, $irc) = @_;
my $id = $self->_build_window_id($title, $irc->name);
my $window = Alice::Window->new(
title => $title,
type => $irc->is_channel($title) ? "channel" : "privmsg",
network => $irc->name,
id => $id,
buffer => $self->_build_window_buffer($id),
render => sub { $self->render(@_) },
);
if ($window->is_channel) {
my $config = $self->config->servers->{$window->network};
$config->{channels} = [uniq $title, @{$config->{channels}}];
$self->config->write;
}
$self->add_window($window);
return $window;
}
sub _build_window_buffer {
my ($self, $id) = @_;
Alice::MessageBuffer->new(
id => $id,
store => $self->message_store,
);
}
sub _build_window_id {
my ($self, $title, $network) = @_;
md5_hex(encode_utf8(lc $self->user."-$title-$network"));
}
sub find_or_create_window {
my ($self, $title, $irc) = @_;
return $self->info_window if $title eq "info";
if (my $window = $self->find_window($title, $irc)) {
return $window;
}
$self->create_window($title, $irc);
}
sub sorted_windows {
my $self = shift;
my %o = map {
$self->config->order->[$_] => sprintf "%02d", $_ + 2
} (0 .. @{$self->config->order} - 1);
$o{$self->info_window->id} = "01";
my $prefix = scalar @{$self->config->order} + 1;
map {$_->[1]}
sort {$a->[0] cmp $b->[0]}
map {[($o{$_->id} || $o{$_->title} || $prefix.$_->sort_name), $_]}
$self->windows;
}
sub close_window {
my ($self, $window) = @_;
AE::log debug => "sending a request to close a tab: " . $window->title;
$self->broadcast($window->close_action);
if ($window->is_channel) {
my $irc = $self->get_irc($window->network);
my $config = $self->config->servers->{$window->network};
$config->{channels} = [grep {$_ ne $window->title} @{$config->{channels}}];
$self->config->write;
}
$self->remove_window($window->id) if $window->type ne "info";
}
sub add_irc_server {
my ($self, $name, $config) = @_;
$self->config->servers->{$name} = $config;
my $irc = Alice::IRC->new(name => $name);
$self->add_irc($irc);
$self->connect_irc($name) if $config->{autoconnect};
}
sub reload_config {
my ($self, $new_config) = @_;
my %prev = map {$_ => $self->config->servers->{$_}{ircname} || ""}
keys %{ $self->config->servers };
if ($new_config) {
( run in 1.305 second using v1.01-cache-2.11-cpan-39bf76dae61 )