package NetHirc::Log; use strict; use warnings; use constant DEFAULT_TIMEFORMAT => "%Y-%m-%d %H:%M:%S"; use IO::File; use POE qw(Kernel Session Wheel::ReadWrite); use POSIX (); use NetHirc::Util; my @events = qw( _start _stop log begin end error ); sub new { shift; POE::Session->create( 'package_states' => [ 'NetHirc::Log' => [ @events ] ], 'args' => [ @_ ], ); } sub _start { my $kernel = $_[KERNEL]; $kernel->alias_set('nethirc_log'); } sub begin { debug('l', "begin"); my ($heap, $filename, $success, $fail) = @_[HEAP, ARG0..ARG2]; my $fh = new IO::File($filename, "w"); unless ($fh) { $fail->($!); return; } my $wheel = new POE::Wheel::ReadWrite( Handle => $fh, Filter => POE::Filter::Line->new(), FlushedEvent => 'flush', ErrorEvent => 'error', ); unless ($wheel) { $fail->($!); return; } $heap->{'wheel'} = $wheel; $success->(); } sub _stop { my $heap = $_[HEAP]; delete $heap->{'wheel'}; } sub end { debug('l', "end"); my ($heap, $pb) = @_[HEAP, ARG0]; delete $heap->{'wheel'}; $pb->(); } sub log { debug('l', "log"); my ($heap, $text, $complaint) = @_[HEAP, ARG0, ARG1]; my $wheel = $heap->{'wheel'}; my $now = POSIX::strftime(DEFAULT_TIMEFORMAT, localtime(time())); $text = sprintf("%s %s", $now, $text); $wheel->put($text) if $wheel; } sub error { debug('l', "error"); my ($kernel, $heap, $errstr) = @_[KERNEL, HEAP, ARG2]; $kernel->post('nethirc_adventurer', 'log_write_error', $errstr); delete $heap->{'wheel'}; } 1; __END__