rendered paste body# $Id: mylog.pl 56 2007-07-09 18:46:26Z immute $
use strict;
use vars qw($VERSION %IRSSI);
$VERSION = do { q$Rev: 56 $ =~ /(\d+)/; "0.$1"; };
%IRSSI = (
authors => 'Matt "imMute" Sickler',
contact => 'imMute {at} mail.msk3.ath.cx',
name => 'MyLog',
description => 'Logs channel/privmsg activity to a MySQL database',
license => 'GPLv2',
url => '',
changed => '$Date: 2007-07-09 13:46:26 -0500 (Mon, 09 Jul 2007) $',
);
=pod Description
Logs channel/privmsg activity to a MySQL database
=cut
=pod Useage
=cut
use Irssi::Irc;
use Irssi qw/settings_add_str settings_get_str printformat/;
use Data::Dumper; $Data::Dumper::Indent=0; $Data::Dumper::Sortkeys=1;
use DBI;
sub DEBUG (@) { 0 and printformat(MSGLEVEL_CRAP, 'mylog_debug', @_); }
=pod ToDo
=cut
Irssi::theme_register([
'mylog_debug', '%P>>%n %_MyLog(DEBUG):%_ $0-',
'mylog_db_connected', '%P>>%n %_MyLog:%_ Connected to db ($0:$1 - $2)',
'mylog_db_no_connect', '%P>>%n %_MyLog:%_ Could not connect to database: $0',
'mylog_no_setting', '%P>>%n %_MyLog:%_ You did not specify the $0 setting (mylog_$1)',
'mylog_loaded', '%P>>%n %_MyLog:%_ MySQL-Log v$0 loaded',
'mylog_error', '%P>>%n %_MyLog:%_ %R%_Error%_ in operation $0:%n $1-',
]);
settings_add_str "mylog", "mylog_db_host", "localhost";
settings_add_str "mylog", "mylog_db_port", "3306";
settings_add_str "mylog", "mylog_db_user", "irssi";
settings_add_str "mylog", "mylog_db_pass", "irssi";
settings_add_str "mylog", "mylog_db_base", "irssi";
settings_add_str "mylog", "mylog_levels", "message chan notice ctcp";
Irssi::settings_add_bool "mylog","mylog_logging", 1;
my $sth_prepare = {
#'message' => q#INSERT INTO `messages` VALUES(??????)#,
# etc.
};
my $dbh;
my $sth = { };
sub dbi_connect {
my $host = settings_get_str 'mylog_db_host';
my $port = settings_get_str 'mylog_db_port';
my $user = settings_get_str 'mylog_db_user';
my $pass = settings_get_str 'mylog_db_pass';
my $base = settings_get_str 'mylog_db_base';
eval {
$dbh = DBI->connect("DBI:mysql:database=$base;host=$host;port=$port", $user, $pass,
{ PrintError => 0, RaiseError => 1, }) or die;
};
if ($@) {
printformat(MSGLEVEL_CRAP,'mylog_error', 'connect', $DBI::errstr);
$dbh = $sth = undef;
return;
} else {
printformat(MSGLEVEL_CRAP,'mylog_db_connected', $host, $port, $base);
setup_sth();
}
}
sub setup_sth {
return unless defined $dbh;
while( my ($name, $sql) = each %$sth_prepare ){
eval { $sth->{$name} = $dbh->prepare( $sql ) or die; }
if ( $@ ){ printformat(MSGLEVEL_CRAP, 'mylog_error', 'prepare', $!); $sth->{$name} = undef; }
}
}
Irssi::command_bind("mylog_reconnect", 'dbi_connect');
Irssi::command_bind("mylog_qst", 'setup_sth');
dbi_connect() if Irssi::settings_get_bool("mylog_logging");
printformat(MSGLEVEL_CRAP, 'mylog_loaded', $VERSION);
sub signal_add {
my ($type, $name, $sql_name, $sub) = @_;
Irssi::signal_add( $name, sub {
return unless Irssi::settings_get_bool("mylog_logging");
return unless settings_get_str("mylog_levels") =~ $group;
return unless defined $sth->{$sth_name};
eval { $sth->{$sql_name}->execute( $sub->(@_) ) or die; }
if ($@){ printformat(MSGLEVEL_CRAP, 'mylog_error', 'execute', $DBI::errstr); }
});
}
# --- Message
# "message public", SERVER_REC, char *msg, char *nick, char *address, char *target
# "message private", SERVER_REC, char *msg, char *nick, char *address
# "message own_public", SERVER_REC, char *msg, char *target
# "message own_private", SERVER_REC, char *msg, char *target, char *orig_target
# "message irc action", SERVER_REC, char *msg, char *nick, char *address, char *target
# also used in private messages
# "message irc own_action", SERVER_REC, char *msg, char *target
# --- Chan
# "message join", SERVER_REC, char *channel, char *nick, char *address
# "message part", SERVER_REC, char *channel, char *nick, char *address, char *reason
# "message quit", SERVER_REC, char *nick, char *address, char *reason
# "message kick", SERVER_REC, char *channel, char *nick, char *kicker, char *address, char *reason
# "message nick", SERVER_REC, char *newnick, char *oldnick, char *address
# "message own_nick", SERVER_REC, char *newnick, char *oldnick, char *address
# "message irc mode", SERVER_REC, char *channel, char *nick, char *addr, char *mode
# "message topic", SERVER_REC, char *channel, char *topic, char *nick, char *address
# --- Notice
# "message irc notice", SERVER_REC, char *msg, char *nick, char *address, char *target
# "message irc own_notice", SERVER_REC, char *msg, char *target
# --- CTCP
# "message irc ctcp", SERVER_REC, char *cmd, char *data, char *nick, char *address, char *target
# "message irc own_ctcp", SERVER_REC, char *cmd, char *data, char *target
# "ctcp reply", SERVER_REC, char *args, char *nick, char *addr, char *target