Public feed #724225

url_log.pl

public text v1 · immutable
Raw Edit
·published 2007-10-03 13:14 UTC
rendered paste body
#
# Log URLs into PostgreSQL DB and keeps them up to one week
#
# CREATE TABLE urlirc (
#        id      bigserial       NOT NULL,
#        checked boolean         NOT NULL DEFAULT false,
#        time    timestamp       NOT NULL,
#        channel text            NOT NULL,
#        nick    text            NOT NULL,
#        url     text            NOT NULL,
#        PRIMARY KEY (id),
#        UNIQUE (url)
# );
#

use Irssi;
use Irssi::Irc;
use vars qw($VERSION %IRSSI);

use DBI qw(:sql_types);
use DBD::Pg qw(:pg_types);


$dbinfo = 'DBI:Pg:dbname=irssi';


# We could maintain a persistent connection, but if the database was
# restarted we would then need to restart the script.
# We ensure to use the prepared form which allows the parameters to be passed
# without any need to be escaped.  This allows the server to use the optimal
# method to deal with those.  However, since prepared statements are for a
# single handle, and that DBD driver only supports the prepare statement
# (there is no pg_query_param) then we tell it not to prepare the statement
# since we would need to do it everytime anyway in this case.
#
sub db_log {
        my ($server, $channel, $nick, $url) = @_;
        my $db = DBI->connect($dbinfo, '', '', {AutoCommit => 0});
        my $s = $db->prepare('INSERT INTO urlirc (time,channel,nick,url) ' .
            'VALUES(CURRENT_TIMESTAMP,$1,$2,$3)', {pg_server_prepare => 0});
        $s->execute($channel, $nick, $url);
        $db->do("DELETE FROM urlirc WHERE AGE(time) > '1 week'::interval");
        $db->commit();
        $db->disconnect();
}

sub url_check {
        my ($l) = @_;
        if (($l =~ /(.{1,2}tp\:\/\/[^\s]+)/) or ($l =~ /(www\..+)/)) {
                return $1;
        }
        return 0;
}

sub url_log {
        my ($server, $channel, $nick, $line) = @_;
        if ((my $url = url_check($line))) {
                db_log($server, $channel, $nick, $url);
        }
}


sub sig_logurl {
        my ($server, $data, $nick, $mask, $target) = @_;
        url_log($server, $target, $nick, $data);
}

sub sig_own {
        my ($server, $data, $target) = @_;
        url_log($server, $target, $server->{nick}, $data);
}

sub sig_topic {
        my ($server, $target, $data, $nick, $mask) = @_;
        url_log($server, $target, $nick, $data);
}

Irssi::signal_add_last('message public', 'sig_logurl');
Irssi::signal_add_last('message own_public', 'sig_own');
Irssi::signal_add_last('message topic', 'sig_topic');