#!/usr/bin/perl use strict; use IO::Socket::INET; # à décommenter # use Math::TrulyRandom; my $master = "semial"; my $botip = "maison.dasheep.com"; my $server = "irc.geeknode.org"; my $channel = "#geekerie"; my $nick = "blah"; my $username = "blah"; my $realname = "Blah blah blah."; my $version = "Blah, a wonderful bot."; my $logfile = "$ENV{'HOME'}/irclogs/GeekNode/#geekerie.log"; my $debug = 0; my $irc_debug = 0; my $talk = 1; my $learning = 1; my $replyrate = 100; # à décommenter # srand(truly_random_value()+time); my %commands = ("PRIVMSG" => \&parse_privmsg, "NOTICE" => \&parse_notice , "JOIN" => \&parse_join, "QUIT" => \&parse_quit); my $socket = new IO::Socket::INET ( PeerHost => $server , PeerPort => 6667 , Proto => 'tcp' ); ircprint("NICK $nick\n"); ircprint("USER $username 8 * : $realname\n"); ircprint("JOIN $channel\n"); say("blah :D"); while(<$socket>) { print; if($_ =~ /^:(\S+)\!(\S+) (\S+) (\S+) :(.*?)$/){ $commands{$3}->($1,$2,$3,$4,$5); } if($_ =~ /^:(\S+)\!(\S+) (\S+) :(.*?)$/) { $commands{$3}->($1,$2,$3,$4); } if($_ =~ /^PING :\S+/) { ircprint("PONG :$botip\n"); } } sub parse_join{ ircprint("PRIVMSG $_[0] :\001VERSION\001\n"); say("parsing a join") if($irc_debug); } sub parse_privmsg{ say("parsing a privmsg...") if($irc_debug); my $sender_nick = $_[0]; my $sender_username = $_[1]; my $command = $_[2]; my $dest = $_[3]; my $text = $_[4]; if($text =~ /^\!/ && $sender_nick eq $master) { my $user_command = $'; if($user_command =~ /alaniche/) { quit(); } elsif($user_command =~ /stfu/) { $talk = 0; } } elsif($text =~ /^\caVERSION\ca/) { ircprint("NOTICE $sender_nick :\001VERSION $version\001\n"); } elsif($text =~ /^$nick(:|\>|,) (hello|re|yo|plop|yop|salut|bonjour|matin|\'jour|\'nuit|\'matin|\*coin\*|y0|coucou)/) { # respond to greetings :) say("$sender_nick$1 $2$'"); } elsif($text =~ /^$nick(:|\>|,) gimme a link/) { my $links = `grep http:// $logfile`; my $loglenght = `grep http:// $logfile | wc -l`; $loglenght =~ s/(\d*) .*?/$1/; my $logindex = 0; my $logline = int rand($loglenght); my @links = split(/\n/, $links); my $log_ret; READLINKS: foreach(@links) { if($logindex == $logline) { $log_ret = $_; last READLINKS; } $logindex++; } $log_ret =~ s/.*?(http:\/\/\S+).*?/$1/; say("$sender_nick: $log_ret"); } elsif($text =~ /^$nick(:|\>|,)/) { open LOG,"< $logfile"; my $loglenght = `wc -l $logfile`; $loglenght =~ s/(\d*) .*?/$1/; my $logindex = 0; my $logline = int rand($loglenght); my $log_ret; while(!($log_ret =~ /.+/)){ # des fois le bot retourne rien, j'ai pas compris pourquoi, alors gruikfixed. READLOG: while() { if($logindex == $logline) { unless($_=~/^\d\d:\d\d -\!-/) { unless($_ =~ /^--- Log (clos|open)ed/){ $log_ret = $_; last READLOG; } } } $logindex++; } } if($log_ret =~ /^\d\d:\d\d \<.*?\>/){ $log_ret =~ s/^\d\d:\d\d \<.*?\> (.*?)/$1/; } if($log_ret =~ /^\d\d:\d\d \* \S+ .*?/) { $log_ret =~ s/^\d\d:\d\d//; } $log_ret =~ s/^\S+(:|\>|,)//; say($sender_nick.": ".$log_ret); } if($text =~ /lol/) { say("LOLE $sender_nick"); } } sub parse_notice{ my $sender_nick = $_[0]; my $sender_username = $_[1]; my $command = $_[2]; my $dest = $_[3]; my $text = $_[4]; if($text =~ /\caVERSION/){ if($text =~ /\caVERSION.*?(mIRC|Windows)/) { say("$sender_nick, shame on you."); } $text =~ s/\caVERSION (.*?)\ca/$1/; say("$sender_nick is running $text"); } elsif($text =~ /quote pong (........)/) { sleep (2); ircprint("pong $1\n"); } say("parsing a notice") if($irc_debug); } sub ircprint{ print $socket $_[0]; } sub parse_quit{ } sub say{ my $ligne = $_[0]; ircprint("PRIVMSG $channel :$ligne \n") if($talk); } sub action{ ircprint("PRIVMSG $channel :\caACTION $_[0]\n"); } sub dprint{ print "\n$_[0]\n\n" if($debug); } sub quit{ ircprint("QUIT Wouf wouf\n"); sleep(2); exit; } close ( $socket );