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__