50 |
my $ENCODING = 'ISO-8859-2'; |
my $ENCODING = 'ISO-8859-2'; |
51 |
my $TIMESTAMP = '%Y-%m-%d %H:%M:%S'; |
my $TIMESTAMP = '%Y-%m-%d %H:%M:%S'; |
52 |
|
|
53 |
|
my $sleep_on_error = 5; |
54 |
|
|
55 |
## END CONFIG |
## END CONFIG |
56 |
|
|
57 |
|
|
67 |
use HTML::CalendarMonthSimple; |
use HTML::CalendarMonthSimple; |
68 |
use Getopt::Long; |
use Getopt::Long; |
69 |
use DateTime; |
use DateTime; |
70 |
|
use Data::Dump qw/dump/; |
71 |
|
|
72 |
my $import_dircproxy; |
my $import_dircproxy; |
73 |
GetOptions( |
GetOptions( |
129 |
} |
} |
130 |
}, |
}, |
131 |
context => 5, |
context => 5, |
132 |
|
full_rows => 1, |
133 |
); |
); |
134 |
|
|
135 |
Order is important. Fields are first passed through C<filter> (if available) and |
Order is important. Fields are first passed through C<filter> (if available) and |
137 |
|
|
138 |
C<context> defines number of messages around each search hit for display. |
C<context> defines number of messages around each search hit for display. |
139 |
|
|
140 |
|
C<full_rows> will return database rows for each result with C<date>, C<time>, C<channel>, |
141 |
|
C<me>, C<nick> and C<message> keys. |
142 |
|
|
143 |
=cut |
=cut |
144 |
|
|
145 |
sub get_from_log { |
sub get_from_log { |
209 |
unshift @rows, $row; |
unshift @rows, $row; |
210 |
} |
} |
211 |
|
|
212 |
|
# normalize nick names |
213 |
|
map { |
214 |
|
$_->{nick} =~ s/^_*(.*?)_*$/$1/ |
215 |
|
} @rows; |
216 |
|
|
217 |
|
return @rows if ($args->{full_rows}); |
218 |
|
|
219 |
my @msgs = ( |
my @msgs = ( |
220 |
"Showing " . ($#rows + 1) . " messages..." |
"Showing " . ($#rows + 1) . " messages..." |
221 |
); |
); |
272 |
my $append = 1; |
my $append = 1; |
273 |
|
|
274 |
my $nick = $row->{nick}; |
my $nick = $row->{nick}; |
275 |
if ($nick =~ s/^_*(.*?)_*$/$1/) { |
# if ($nick =~ s/^_*(.*?)_*$/$1/) { |
276 |
$row->{nick} = $nick; |
# $row->{nick} = $nick; |
277 |
} |
# } |
278 |
|
|
279 |
if ($last_row->{nick} ne $nick) { |
if ($last_row->{nick} ne $nick) { |
280 |
# obfu way to find format for me_nick if needed or fallback to default |
# obfu way to find format for me_nick if needed or fallback to default |
433 |
|
|
434 |
my $SKIPPING = 0; # if skipping, how many we've done |
my $SKIPPING = 0; # if skipping, how many we've done |
435 |
my $SEND_QUEUE; # cache |
my $SEND_QUEUE; # cache |
436 |
|
my $ping; # ping stats |
437 |
|
|
438 |
POE::Component::IRC->new($IRC_ALIAS); |
POE::Component::IRC->new($IRC_ALIAS); |
439 |
|
|
465 |
|
|
466 |
save_message( channel => $channel, me => 1, nick => $nick, msg => $msg); |
save_message( channel => $channel, me => 1, nick => $nick, msg => $msg); |
467 |
}, |
}, |
468 |
|
irc_ping => sub { |
469 |
|
warn "pong ", $_[ARG0], $/; |
470 |
|
$ping->{$_[ARG0]++}; |
471 |
|
}, |
472 |
|
irc_invite => sub { |
473 |
|
my $kernel = $_[KERNEL]; |
474 |
|
my $nick = (split /!/, $_[ARG0])[0]; |
475 |
|
my $channel = $_[ARG1]; |
476 |
|
|
477 |
|
|
478 |
|
warn "invited to $channel by $nick"; |
479 |
|
|
480 |
|
$_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, "how nice of you to invite me to $channel, I'll be right there..." ); |
481 |
|
$_[KERNEL]->post($IRC_ALIAS => join => $channel); |
482 |
|
|
483 |
|
}, |
484 |
irc_msg => sub { |
irc_msg => sub { |
485 |
my $kernel = $_[KERNEL]; |
my $kernel = $_[KERNEL]; |
486 |
my $nick = (split /!/, $_[ARG0])[0]; |
my $nick = (split /!/, $_[ARG0])[0]; |
507 |
my $nr = $1 || 10; |
my $nr = $1 || 10; |
508 |
|
|
509 |
my $sth = $dbh->prepare(qq{ |
my $sth = $dbh->prepare(qq{ |
510 |
select nick,count(*) from log group by nick order by count desc limit $nr |
select |
511 |
|
nick, |
512 |
|
count(*) as count, |
513 |
|
sum(length(message)) as len |
514 |
|
from log |
515 |
|
group by nick |
516 |
|
order by len desc,count desc |
517 |
|
limit $nr |
518 |
}); |
}); |
519 |
$sth->execute(); |
$sth->execute(); |
520 |
$res = "Top $nr users: "; |
$res = "Top $nr users: "; |
521 |
my @users; |
my @users; |
522 |
while (my $row = $sth->fetchrow_hashref) { |
while (my $row = $sth->fetchrow_hashref) { |
523 |
push @users,$row->{nick} . ': ' . $row->{count}; |
push @users,$row->{nick} . ': ' . $row->{count} . '/' . $row->{len} . '=' . sprintf("%.2f", $row->{len}/$row->{count}); |
524 |
} |
} |
525 |
$res .= join(" | ", @users); |
$res .= join(" | ", @users); |
526 |
} elsif ($msg =~ m/^last.*?\s*(\d*)/i) { |
} elsif ($msg =~ m/^last.*?\s*(\d*)/i) { |
527 |
|
|
528 |
foreach my $res (get_from_log( limit => $1 )) { |
foreach my $res (get_from_log( limit => ($1 || 100) )) { |
529 |
print "last: $res\n"; |
print "last: $res\n"; |
530 |
from_to($res, $ENCODING, 'UTF-8'); |
from_to($res, $ENCODING, 'UTF-8'); |
531 |
$_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res ); |
$_[KERNEL]->post( $IRC_ALIAS => privmsg => $nick, $res ); |
548 |
|
|
549 |
$res = ''; |
$res = ''; |
550 |
|
|
551 |
|
} elsif ($msg =~ m/^(?:count|poll)\s+(.*)(?:\s+(\d+))?\s*$/i) { |
552 |
|
|
553 |
|
my ($what,$limit) = ($1,$2); |
554 |
|
$limit ||= 100; |
555 |
|
|
556 |
|
my $stat; |
557 |
|
|
558 |
|
foreach my $res (get_from_log( |
559 |
|
limit => $limit, |
560 |
|
search => $what, |
561 |
|
full_rows => 1, |
562 |
|
)) { |
563 |
|
while ($res->{message} =~ s/\Q$what\E(\+|\-)//) { |
564 |
|
$stat->{vote}->{$1}++; |
565 |
|
$stat->{from}->{ $res->{nick} }++; |
566 |
|
} |
567 |
|
} |
568 |
|
|
569 |
|
my @nicks; |
570 |
|
foreach my $nick (sort { $stat->{from}->{$a} <=> $stat->{from}->{$b} } keys %{ $stat->{from} }) { |
571 |
|
push @nicks, $nick . ( $stat->{from}->{$nick} == 1 ? '' : |
572 |
|
"(" . $stat->{from}->{$nick} . ")" |
573 |
|
); |
574 |
|
} |
575 |
|
|
576 |
|
$res = |
577 |
|
"$what ++ " . ( $stat->{vote}->{'+'} || 0 ) . |
578 |
|
" : " . ( $stat->{vote}->{'-'} || 0 ) . " --" . |
579 |
|
" from " . ( join(", ", @nicks) || 'nobody' ); |
580 |
|
|
581 |
|
$_[KERNEL]->post( $IRC_ALIAS => notice => $nick, $res ); |
582 |
|
|
583 |
|
} elsif ($msg =~ m/^ping/) { |
584 |
|
$res = "ping = " . dump( $ping ); |
585 |
} |
} |
586 |
|
|
587 |
if ($res) { |
if ($res) { |
605 |
warn "## indetify $NICK\n"; |
warn "## indetify $NICK\n"; |
606 |
$_[KERNEL]->post( $IRC_ALIAS => privmsg => 'nickserv', "IDENTIFY $NICK" ); |
$_[KERNEL]->post( $IRC_ALIAS => privmsg => 'nickserv', "IDENTIFY $NICK" ); |
607 |
}, |
}, |
608 |
|
irc_disconnected => sub { |
609 |
|
warn "## disconnected, reconnecting again\n"; |
610 |
|
$_[KERNEL]->post($IRC_ALIAS => connect => $CONNECT); |
611 |
|
}, |
612 |
|
irc_socketerr => sub { |
613 |
|
warn "## socket error... sleeping for $sleep_on_error seconds and retry"; |
614 |
|
sleep($sleep_on_error); |
615 |
|
$_[KERNEL]->post($IRC_ALIAS => connect => $CONNECT); |
616 |
|
}, |
617 |
# irc_433 => sub { |
# irc_433 => sub { |
618 |
# print "# irc_433: ",$_[ARG1], "\n"; |
# print "# irc_433: ",$_[ARG1], "\n"; |
619 |
# warn "## indetify $NICK\n"; |
# warn "## indetify $NICK\n"; |