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__