--- trunk/irc-logger.pl 2006/06/19 11:32:16 32
+++ trunk/bin/irc-logger.pl 2007/06/08 12:17:35 65
@@ -10,6 +10,20 @@
./irc-logger.pl
+=head2 Options
+
+=over 4
+
+=item --import-dircproxy=filename
+
+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
@@ -18,13 +32,17 @@
## CONFIG
+my $HOSTNAME = `hostname`;
+
my $NICK = 'irc-logger';
+$NICK .= '-dev' if ($HOSTNAME =~ m/llin/);
my $CONNECT =
{Server => 'irc.freenode.net',
Nick => $NICK,
Ircname => "try /msg $NICK help",
};
my $CHANNEL = '#razmjenavjestina';
+$CHANNEL = '#irc-logger' if ($HOSTNAME =~ m/llin/);
my $IRC_ALIAS = "log";
my %FOLLOWS =
@@ -36,6 +54,9 @@
my $DSN = 'DBI:Pg:dbname=' . $NICK;
my $ENCODING = 'ISO-8859-2';
+my $TIMESTAMP = '%Y-%m-%d %H:%M:%S';
+
+my $sleep_on_error = 5;
## END CONFIG
@@ -48,17 +69,35 @@
use Regexp::Common qw /URI/;
use CGI::Simple;
use HTML::TagCloud;
+use POSIX qw/strftime/;
+use HTML::CalendarMonthSimple;
+use Getopt::Long;
+use DateTime;
+use URI::Escape;
+use Data::Dump qw/dump/;
+use DateTime::Format::ISO8601;
+
+my $use_twitter = 1;
+eval { require Net::Twitter; };
+$use_twitter = 0 if ($@);
+
+my $import_dircproxy;
+my $log_path;
+GetOptions(
+ 'import-dircproxy:s' => \$import_dircproxy,
+ 'log:s' => \$log_path,
+);
-my $dbh = DBI->connect($DSN,"","", { RaiseError => 1, AutoCommit => 1 }) || die $DBI::errstr;
+open(STDOUT, '>', $log_path) || warn "can't redirect log to $log_path: $!";
-eval {
- $dbh->do(qq{ select count(*) from log });
-};
+sub _log {
+ print strftime($TIMESTAMP,localtime()), ' ', join(" ",@_), $/;
+}
-if ($@) {
- warn "creating database table in $DSN\n";
- $dbh->do(<<'_SQL_SCHEMA_');
+my $dbh = DBI->connect($DSN,"","", { RaiseError => 1, AutoCommit => 1 }) || die $DBI::errstr;
+my $sql_schema = {
+ log => '
create table log (
id serial,
time timestamp default now(),
@@ -72,16 +111,87 @@
create index log_time on log(time);
create index log_channel on log(channel);
create index log_nick on log(nick);
+ ',
+ meta => '
+create table meta (
+ nick text not null,
+ channel text not null,
+ name text not null,
+ value text,
+ changed timestamp default now(),
+ primary key(nick,channel,name)
+);
+ ',
+};
+
+foreach my $table ( keys %$sql_schema ) {
+
+ eval {
+ $dbh->do(qq{ select count(*) from $table });
+ };
+
+ if ($@) {
+ warn "creating database table $table in $DSN\n";
+ $dbh->do( $sql_schema->{ $table } );
+ }
+}
+
+
+=head2 meta
+
+Set or get some meta data into database
+
+ meta('nick','channel','var_name', $var_value );
-_SQL_SCHEMA_
+ $var_value = meta('nick','channel','var_name');
+ ( $var_value, $changed ) = meta('nick','channel','var_name');
+
+=cut
+
+sub meta {
+ my ($nick,$channel,$name,$value) = @_;
+
+ # normalize channel name
+ $channel =~ s/^#//;
+
+ if (defined($value)) {
+
+ my $sth = $dbh->prepare(qq{ update meta set value = ?, changed = now() where nick = ? and channel = ? and name = ? });
+
+ eval { $sth->execute( $value, $nick, $channel, $name ) };
+
+ # error or no result
+ if ( $@ || ! $sth->rows ) {
+ $sth = $dbh->prepare(qq{ insert into meta (value,nick,channel,name,changed) values (?,?,?,?,now()) });
+ $sth->execute( $value, $nick, $channel, $name );
+ _log "created $nick/$channel/$name = $value";
+ } else {
+ _log "updated $nick/$channel/$name = $value ";
+ }
+
+ return $value;
+
+ } else {
+
+ my $sth = $dbh->prepare(qq{ select value,changed from meta where nick = ? and channel = ? and name = ? });
+ $sth->execute( $nick, $channel, $name );
+ my ($v,$c) = $sth->fetchrow_array;
+ _log "fetched $nick/$channel/$name = $v [$c]";
+ return ($v,$c) if wantarray;
+ return $v;
+
+ }
}
+
+
my $sth = $dbh->prepare(qq{
insert into log
- (channel, me, nick, message)
-values (?,?,?,?)
+ (channel, me, nick, message, time)
+values (?,?,?,?,?)
});
+
my $tags;
my $tag_regex = '\b([\w-_]+)//';
@@ -104,6 +214,7 @@
}
},
context => 5,
+ full_rows => 1,
);
Order is important. Fields are first passed through C (if available) and
@@ -111,13 +222,14 @@
C defines number of messages around each search hit for display.
+C will return database rows for each result with C, C
",
get_from_log(
- limit => $q->param('last') || 100,
+ limit => $q->param('last') || $q->param('date') ? undef : 100,
search => $search || undef,
tag => $q->param('tag') || undef,
+ date => $q->param('date') || undef,
fmt => {
- date => '
%s
',
+ date => sub {
+ my $date = shift || return;
+ qq{
};
+ },
time => '%s ',
time_channel => '%s %s ',
nick => '%s: ',
@@ -607,9 +967,21 @@
filter => {
message => sub {
my $m = shift || return;
+
+ # protect HTML from wiki modifications
+ sub e {
+ my $t = shift;
+ return 'uri_unescape{' . uri_escape($t) . '}';
+ }
+
$m =~ s/($escape_re)/$escape{$1}/gs;
- $m =~ s#($RE{URI}{HTTP})#$1#gs;
- $m =~ s#$tag_regex#$1#g;
+ $m =~ s#($RE{URI}{HTTP})#e(qq{$1})#egs;
+ $m =~ s#$tag_regex#e(qq{$1})#egs;
+ $m =~ s#\*(\w+)\*#$1#gs;
+ $m =~ s#_(\w+)_#$1#gs;
+ $m =~ s#\/(\w+)\/#$1#gs;
+
+ $m =~ s#uri_unescape{([^}]+)}#uri_unescape($1)#egs;
return $m;
},
nick => sub {
@@ -624,9 +996,15 @@
},
},
)
- ) .
- qq{}
- );
+ );
+ }
+
+ $html .= qq{
+
+ See history of all messages.
+