#!/usr/bin/perl -w
###############################################################################
# Author: weby <kumcho@vulcho.com>
# Version: 1.01
###############################################################################
use strict;
use IO::Socket;
# CONFIGURATION VARIABLES:
my $nick=shift || "TheBigPerlBook";
my $server="irc.spnet.net";
my $port=6667;
my @channels=qw(weby);
# END OF CONFIGURATION VARIABLES!


print "Establishing connection to IRC SERVER: $server...";
my $sock = IO::Socket::INET->new(PeerAddr => $server,
				 PeerPort => $port,
				 Proto    => 'tcp')
    or die "[error] $!\n";
print("[ Ok ]\n");

print("Sending USER information...");
$sock->print("USER $nick a a a\n");
$sock->print("NICK $nick\n");
print("[ Ok ]\nTrying to join in [ ",scalar @channels," ] channels:\n");

for my $channel (@channels) {
    print "#$channel\n";
    $sock->print("JOIN #$channel\n");
}

while (<$sock>) {
    chomp;
    print "$_\n";
    # response to server if send to us PING request:
    keep_alive($sock,$1) if /^PING\s*:(.*?)$/i;
    &parse_text($sock,$_);
}
close $sock;
print "exit ...\n";
# ###################################################
# SUBROUTINES 
# ###################################################
sub parse_text {
    my($sock,$str)=@_;
    chomp($str);
    if ($str=~/^:(.*?)\!(.*?)\s+(.*?)\s+(.*?)\s+:(.*?)$/i) {
	my $unick=$1;
	my $uhost=$2;
	my $mtype=$3;
	my $rcpto=$4;
	my $mssge=$5;
	if($mtype && $mtype =~ /PRIVMSG/i){
	    # CHANNEL MESSAGE
	    if ($rcpto =~ /^\#(.*?)$/) {
		&channel_response($sock, $1,$mssge,$unick);
	    }
	    else {
		&private_response($sock,$unick,$mssge,$nick);
	    }
	}
    }
    return;
}
sub join_ {
    my($sock,$channels_ref)=@_;
    $sock->print("JOIN ");
    return;
}
sub private_response {
    my($sock,$unick,$str, $nick)=@_;
    chomp($str);
    print "PRIVATE $unick: $str\n\n";
    if($unick eq 'weby') {
	if ($str =~ /quit/) {
	    $sock->print("PRIVMSG $unick :yes master, i'm going out...\n");
	    $sock->print("QUIT :oh noooooooo at ",scalar localtime,"\n");
	    $sock->close();
	    exit;
	}
	
	if($str=~/^cmd\s+(.*?)$/i) {
	    $sock->print("$1\n");
	}
    }
    elsif ($str=~m/$nick/) {
	my @answer = `/usr/games/fortune`;
	for (@answer) {
	    $sock->print("PRIVMSG $unick :$_");
	}
	my $ans=join('',@answer);
	&dolog($nick, $unick, $str, $ans);
    }
    return;
}
sub channel_response {
    my($sock,$channel,$str,$unick)=@_;
    chomp($str);
    print "CHANNEL #$channel: $str\n\n";
    if ($str=~/$nick/) {
	my @answer = `/usr/games/fortune`;
	for (@answer) {
	    $sock->print("PRIVMSG #$channel :$_");
	}
	
	my $ans=join('',@answer);
	&dolog($nick, $unick, $str, $ans);
    }
    return;
}
sub keep_alive {
    my($sock, $str) = @_;
    chomp($str);
    $sock->print("PONG $str\n");
    print "* PONG\n\n";
    return;
}
sub dolog {
    my($nick,$unick,$msg,$ans)=@_;
    mkdir "bot_logs" unless -d "bot_logs";
    die "Directory bot_logs does not exists!\n" unless -d "bot_logs";
    open  LOG,">> bot_logs/$unick.log" or die "$!\n";
    print LOG "$unick: $msg\n";
    print LOG "$nick: $ans\n\n";
    close LOG;
}
# That's all folks friends!
__END__