#!/usr/bin/perl -w # @see http://wholok.com/data/code/hello_nick.pl $|++; use strict; use Net::IRC; use POSIX; #use Data::Dumper;#DEBUG my $MYNAME = lc 'Kataribe'; my $VERSION = '0.01'; # create the IRC object my $irc = new Net::IRC or die 'Failed to initialize Net::IRC'; # Create a connection object. You can have more than one "connection" per # IRC object, but we'll just be working with one. my $conn = $irc->newconn( Server => '127.0.0.1', # cms-debian Port => '6667', Nick => lc $MYNAME, Username => lc $MYNAME. '@localhost', Ircname => 'Experimental IRC bot', ) or die 'Failed to create new connection'; ### On Connect to IRC network sub on_connect { my ($conn) = @_; printf STDERR "%s - $MYNAME logged in IRC network\n", &GetDateTime (); } $conn->add_handler ('376', \&on_connect); ### On Invited by user, Starting logging my %logging = (); sub on_invite { my ($conn, $event) = @_; # print $event->dump ();#DEBUG # my $channel = ($event->args)[0]; printf "%s - Invited to %s by %s\n", &GetDateTime (), $channel, $event->from; my @t = localtime (); my $filename = sprintf '%s_%s', POSIX::strftime ('%y%m%d_%H%M%S', localtime ()), $channel; $filename =~ s![/\#\.]!!g; printf "%s - Logging into %s\n", &GetDateTime (), $filename; $conn->join ($channel); $conn->notice ($channel, "Hello, I'm $MYNAME the IRC logger ver.$VERSION"); $conn->notice ($channel, "When you stop my logging, please kick me out."); $conn->notice ($channel, "You can download the log at http://192.168.10.25/$MYNAME/$filename"); $logging{$channel} = $filename; } $conn->add_handler ('invite', \&on_invite); ### On kicked by operator, Stopping the logging sub on_kick { my ($conn, $event) = @_; # print $event->dump ();#DEBUG # my $channel = ($event->args)[0]; printf "%s - Kicked out from %s by %s\n", &GetDateTime (), $channel, $event->from; $logging{$channel} = undef; } $conn->add_handler ('kick', \&on_kick); ### /WHO my %who = (); sub on_who_end { my ($conn, $event) = @_; # print $event->dump ();#DEBUG # my $channel = ($event->args)[1]; my $whos = $who{$channel}; return unless defined $whos && scalar @$whos == 1; # I'm alone in the channel printf "%s - Stop the logging in %s\n", &GetDateTime (), $channel; # Stop the logging $conn->part ($channel); # and part the channel $logging{$channel} = undef; } $conn->add_handler ('315', \&on_who_end); sub on_who { my ($conn, $event) = @_; # print $event->dump ();#DEBUG # my $username = ($event->args)[0]; my $channel = ($event->args)[1]; my $whos = $who{$channel}; push @$whos, $username; } $conn->add_handler ('352', \&on_who); ### Someone leaved the channel sub on_part { my ($conn, $event) = @_; # print $event->dump ();#DEBUG # my $channel = ($event->to)[0]; $who{$channel} = []; $conn->who ($channel); } $conn->add_handler ('part', \&on_part); $conn->add_handler ('quit', \&on_part); ### Message sub on_message { my ($conn, $event) = @_; # print $event->dump ();#DEBUG # my $channel = ($event->to)[0]; return unless defined $channel; return unless defined $logging{$channel} && $logging{$channel}; my $username = ($event->from)[0]; $username =~ s/^([^!]+).+/$1/; my $message = ($event->args)[0]; my $filename = $logging{$channel} or return; # if (open my $fh, ">>/var/irc/bot/logs/$filename") { printf $fh "%s\t%s\t%s\n", &GetDateTime (), $username, $message; close $fh; } } $conn->add_handler ('msg', \&on_message); $conn->add_handler ('public', \&on_message); $conn->add_handler ('notice', \&on_message); ### start IRC $irc->start(); ######################################## sub GetDateTime { POSIX::strftime ("%m/%d %H:%M:%S", localtime ()); }