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__
syntax highlighted by Code2HTML, v. 0.9.1