--- trunk/irc-logger.pl 2007/02/02 21:37:52 42 +++ trunk/bin/irc-logger.pl 2007/02/03 12:28:17 46 @@ -18,6 +18,12 @@ Import log from C to C database +=item --log=irc-logger.log + +Name of log file + +=back + =head1 DESCRIPTION log all conversation on irc channel @@ -67,12 +73,21 @@ use HTML::CalendarMonthSimple; use Getopt::Long; use DateTime; +use Data::Dump qw/dump/; my $import_dircproxy; +my $log_path; GetOptions( 'import-dircproxy:s' => \$import_dircproxy, + 'log:s' => \$log_path, ); +open(STDOUT, '>', $log_path) || warn "can't redirect log to $log_path: $!"; + +sub _log { + print strftime($TIMESTAMP,localtime()), ' ', join(" ",@_), $/; +} + my $dbh = DBI->connect($DSN,"","", { RaiseError => 1, AutoCommit => 1 }) || die $DBI::errstr; eval { @@ -185,13 +200,13 @@ $search =~ s/^\s+//; $search =~ s/\s+$//; $sth->execute( ( '%' . $search . '%' ) x 2 ); - warn "search for '$search' returned ", $sth->rows, " results ", $context || '', "\n"; + _log "search for '$search' returned ", $sth->rows, " results ", $context || ''; } elsif (my $tag = $args->{tag}) { $sth->execute(); - warn "tag '$tag' returned ", $sth->rows, " results ", $context || '', "\n"; + _log "tag '$tag' returned ", $sth->rows, " results ", $context || ''; } elsif (my $date = $args->{date}) { $sth->execute($date); - warn "found ", $sth->rows, " messages for date $date ", $context || '', "\n"; + _log "found ", $sth->rows, " messages for date $date ", $context || ''; } else { $sth->execute(); } @@ -378,11 +393,10 @@ $a->{me} ||= 0; $a->{time} ||= strftime($TIMESTAMP,localtime()); - print - $a->{time}, " ", + _log $a->{channel}, " ", $a->{me} ? "***" . $a->{nick} : "<" . $a->{nick} . ">", - " " . $a->{msg} . "\n"; + " " . $a->{msg}; from_to($a->{msg}, 'UTF-8', $ENCODING); @@ -417,7 +431,7 @@ ) if ($nick !~ m/^-/); } else { - warn "can't parse: $_\n"; + _log "can't parse: $_"; } } close($l); @@ -432,6 +446,7 @@ my $SKIPPING = 0; # if skipping, how many we've done my $SEND_QUEUE; # cache +my $ping; # ping stats POE::Component::IRC->new($IRC_ALIAS); @@ -463,6 +478,22 @@ save_message( channel => $channel, me => 1, nick => $nick, msg => $msg); }, + irc_ping => sub { + warn "pong ", $_[ARG0], $/; + $ping->{$_[ARG0]++}; + }, + irc_invite => sub { + my $kernel = $_[KERNEL]; + my $nick = (split /!/, $_[ARG0])[0]; + my $channel = $_[ARG1]; + + + warn "invited to $channel by $nick"; + + $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, "how nice of you to invite me to $channel, I'll be right there..." ); + $_[KERNEL]->post($IRC_ALIAS => join => $channel); + + }, irc_msg => sub { my $kernel = $_[KERNEL]; my $nick = (split /!/, $_[ARG0])[0]; @@ -472,7 +503,7 @@ my $res = "unknown command '$msg', try /msg $NICK help!"; my @out; - print "<< $msg\n"; + _log "<< $msg"; if ($msg =~ m/^help/i) { @@ -480,7 +511,7 @@ } elsif ($msg =~ m/^msg\s+(\S+)\s+(.*)$/i) { - print ">> /msg $1 $2\n"; + _log ">> /msg $1 $2"; $_[KERNEL]->post( $IRC_ALIAS => privmsg => $1, $2 ); $res = ''; @@ -508,7 +539,7 @@ } elsif ($msg =~ m/^last.*?\s*(\d*)/i) { foreach my $res (get_from_log( limit => ($1 || 100) )) { - print "last: $res\n"; + _log "last: $res"; from_to($res, $ENCODING, 'UTF-8'); $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res ); } @@ -523,7 +554,7 @@ limit => 20, search => $what, )) { - print "search [$what]: $res\n"; + _log "search [$what]: $res"; from_to($res, $ENCODING, 'UTF-8'); $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res ); } @@ -549,45 +580,50 @@ } my @nicks; - foreach my $nick (sort { $stat->{from}->{$a} cmp $stat->{from}->{$b} } keys %{ $stat->{from} }) { - push @nicks, $nick . $stat->{from}->{$nick} == 1 ? '' : - "(" . $stat->{from}->{$nick} . ")"; + foreach my $nick (sort { $stat->{from}->{$a} <=> $stat->{from}->{$b} } keys %{ $stat->{from} }) { + push @nicks, $nick . ( $stat->{from}->{$nick} == 1 ? '' : + "(" . $stat->{from}->{$nick} . ")" + ); } $res = - "+ " . ( $stat->{vote}->{'+'} || 0 ) . " : " . - "- " . ( $stat->{vote}->{'-'} || 0 ) . + "$what ++ " . ( $stat->{vote}->{'+'} || 0 ) . + " : " . ( $stat->{vote}->{'-'} || 0 ) . " --" . " from " . ( join(", ", @nicks) || 'nobody' ); + $_[KERNEL]->post( $IRC_ALIAS => notice => $nick, $res ); + + } elsif ($msg =~ m/^ping/) { + $res = "ping = " . dump( $ping ); } if ($res) { - print ">> [$nick] $res\n"; + _log ">> [$nick] $res"; from_to($res, $ENCODING, 'UTF-8'); $_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res ); } }, irc_477 => sub { - print "# irc_477: ",$_[ARG1], "\n"; + _log "# irc_477: ",$_[ARG1]; $_[KERNEL]->post( $IRC_ALIAS => privmsg => 'nickserv', "register $NICK" ); }, irc_505 => sub { - print "# irc_505: ",$_[ARG1], "\n"; + _log "# irc_505: ",$_[ARG1]; $_[KERNEL]->post( $IRC_ALIAS => privmsg => 'nickserv', "register $NICK" ); # $_[KERNEL]->post( $IRC_ALIAS => privmsg => 'nickserv', "set hide email on" ); # $_[KERNEL]->post( $IRC_ALIAS => privmsg => 'nickserv', "set email dpavlin\@rot13.org" ); }, irc_registered => sub { - warn "## indetify $NICK\n"; + _log "## registrated $NICK"; $_[KERNEL]->post( $IRC_ALIAS => privmsg => 'nickserv', "IDENTIFY $NICK" ); }, irc_disconnected => sub { - warn "## disconnected, reconnecting again\n"; + _log "## disconnected, reconnecting again"; $_[KERNEL]->post($IRC_ALIAS => connect => $CONNECT); }, irc_socketerr => sub { - warn "## socket error... sleeping for $sleep_on_error seconds and retry"; + _log "## socket error... sleeping for $sleep_on_error seconds and retry"; sleep($sleep_on_error); $_[KERNEL]->post($IRC_ALIAS => connect => $CONNECT); }, @@ -598,8 +634,8 @@ # }, _child => sub {}, _default => sub { - printf "%s #%s %s %s\n", - strftime($TIMESTAMP,localtime()), $_[SESSION]->ID, $_[ARG0], + _log sprintf "sID:%s %s %s", + $_[SESSION]->ID, $_[ARG0], ref($_[ARG1]) eq "ARRAY" ? join(",", map { ref($_) eq "ARRAY" ? join(";", @{$_}) : $_ } @{ $_[ARG1] }) : $_[ARG1] ? $_[ARG1] : "";