package NetHirc::Stats;
use strict;
use warnings;
use constant NHS_SERVER => 4;
use constant NHS_NICK => 3;
use constant NHS_BYTES => 2;
use constant NHS_WORDS => 1;
use constant NHS_LINES => 0;
sub new
{
my $proto = shift;
my $class = ref $proto || $proto;
return bless {}, $class;
}
sub add
{
my $self = shift;
my $server = shift;
my $who = shift;
my $what = shift;
my $bytes = length($what);
my @words = split(' ', $what);
$self->{$server}->{$who}->[NHS_BYTES] += $bytes;
$self->{$server}->{$who}->[NHS_WORDS] += @words;
$self->{$server}->{$who}->[NHS_LINES] += 1;
}
sub clear_server
{
my $self = shift;
my $server = shift;
delete $self->{$server};
}
sub clear_all
{
my $self = shift;
for my $s (keys %$self)
{
$self->clear_server($s);
}
}
sub report
{
my $self = shift;
my $server = shift;
my $stats = $self->{$server};
my @report = map {
[
$stats->{$_}->[NHS_LINES],
$stats->{$_}->[NHS_WORDS],
$stats->{$_}->[NHS_BYTES],
$_,
$server,
]
} keys %$stats;
@report = sort my_way @report;
return @report;
}
sub report_all
{
my $self = shift;
my @reports = map { [ $self->report($_) ] } keys %$self;
return @reports;
}
sub my_way
{
$a->[NHS_LINES] <=> $b->[NHS_LINES] ||
$a->[NHS_WORDS] <=> $b->[NHS_WORDS] ||
$a->[NHS_BYTES] <=> $b->[NHS_BYTES] ||
$a->[NHS_NICK] cmp $b->[NHS_NICK] ||
$a->[NHS_SERVER] cmp $b->[NHS_SERVER]
}
1;
__END__
syntax highlighted by Code2HTML, v. 0.9.1