package NetHirc::Counter;
use strict;
use warnings;
use IO::File;
use POE qw(Kernel Session Wheel::ReadWrite);
use POSIX ();
use YAML ();
use NetHirc::Stats;
use NetHirc::Util;
my @events = qw(
_start
_stop
add
begin
end
show
show_all
clear
clear_all
);
sub new
{
shift;
POE::Session->create(
'package_states' => [ 'NetHirc::Counter' => [ @events ] ],
'args' => [ @_ ],
);
}
sub _start
{
my $kernel = $_[KERNEL];
$kernel->alias_set('nethirc_counter');
}
sub begin
{
debug('n', "begin");
my ($heap, $filename, $success, $fail) = @_[HEAP, ARG0..ARG2];
my $counter;
eval {
$counter = YAML::LoadFile($filename) if (-r $filename);
};
if ($@)
{
$fail->($@);
return;
}
$counter ||= NetHirc::Stats->new();
$heap->{'filename'} = $filename;
$heap->{'counter'} = $counter;
$success->();
}
sub _stop
{
my $heap = $_[HEAP];
my $filename = $heap->{'filename'};
my $counter = $heap->{'counter'};
eval { YAML::DumpFile($filename, $counter) if $counter; };
delete $heap->{'filename'};
delete $heap->{'counter'};
}
sub end
{
debug('n', "end");
my ($heap, $success, $fail) = @_[HEAP, ARG0];
my $filename = $heap->{'filename'};
my $counter = $heap->{'counter'};
eval { YAML::DumpFile($filename, $counter); };
if ($@)
{
$fail->($@->{'msg'});
}
else
{
$success->($filename);
}
delete $heap->{'filename'};
delete $heap->{'counter'};
}
sub add
{
debug('n', "add");
my ($heap, $server, $who, $what) = @_[HEAP, ARG0..ARG2];
my $counter = $heap->{'counter'};
return unless $counter;
$counter->add($server, $who, $what);
}
sub clear
{
my ($heap, $server) = @_[HEAP, ARG0];
my $counter = $heap->{'counter'};
$counter->clear_server($server);
}
sub clear_all
{
my $heap = $_[HEAP];
my $counter = $heap->{'counter'};
$counter->clear_all();
}
sub show
{
my ($heap, $server, $pb) = @_[HEAP, ARG0, ARG1];
my $counter = $heap->{'counter'};
my @report = $counter->report($server);
$pb->(@report);
}
sub show_all
{
my ($heap, $pb) = @_[HEAP, ARG0];
my $counter = $heap->{'counter'};
my @reports = $counter->report_all();
$pb->(@reports);
}
1;
__END__
syntax highlighted by Code2HTML, v. 0.9.1