#!/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__