/usr/local/CPAN/mobirc/App/Mobirc/Model/Server.pm
package App::Mobirc::Model::Server;
use strict;
use Moose;
use App::Mobirc::Model::Channel;
use Carp;
use App::Mobirc::Util;
has channel_map => (
is => 'rw',
isa => 'HashRef',
default => sub { +{} },
);
sub add_channel {
my ($self, $channel) = @_;
croak "missing channel" unless $channel;
$self->channel_map->{$channel->name} = $channel;
}
sub channels {
my $self = shift;
my @channels = values %{ $self->channel_map };
return wantarray ? @channels : \@channels;
}
sub get_channel {
my ($self, $name) = @_;
croak "channel name is flagged utf8" unless Encode::is_utf8($name);
croak "invalid channel name : $name" if $name =~ / /;
return $self->channel_map->{$name} ||= App::Mobirc::Model::Channel->new($self, $name);
}
sub delete_channel {
my ($self, $name) = @_;
croak "channel name is flagged utf8" unless Encode::is_utf8($name);
delete $self->channel_map->{$name};
}
# shortcut
sub keyword_channel {
my $self = shift;
$self->get_channel(U '*keyword*');
}
# ORDER BY unread_lines, last_updated_at;
sub channels_sorted {
my $self = shift;
my $channels = [
reverse
map {
$_->[0];
}
sort {
$a->[1] <=> $b->[1] ||
$a->[2] <=> $b->[2]
}
map {
my $unl = $_->unread_lines ? 1 : 0;
my $buf = $_->message_log || [];
my $last =
(grep {
$_->{class} eq "public" ||
$_->{class} eq "notice"
} @{ $buf })[-1] || {};
my $time = ($last->{time} || 0);
[$_, $unl, $time];
}
$self->channels
];
wantarray ? @$channels : $channels;
}
__PACKAGE__->meta->make_immutable;
1;