[ Perl ] Bot IRC avec Net::IRC

Par Deimos le 09-07-2006



Programmation d'un Bot IRC en PERL grâce au module Net::IRC ...



Vu que c'est un peu à la mode en ce moment de se faire un bot IRC, je vous donne juste ce petit bout de code que j'ai scripté, histoire d'en voir plus clair sur le module Net::IRC en perl ;)

Bon, je ne laisse pas beaucoup d'explications quant au code, car pour tout mongueur qui se respecte, il sera facilement compréhensible, avec une petit consultation de la documentation.

Les liens utiles :
Net::IRC
Net::IRC::Event, la documentation de la classe des events de Net::IRC

N'hésitez pas à poser de questions !


code_header Code:
spacer
use strict;
use Net::IRC;

# Mise en place de toutes les procédures des handlers

# Lors de la connexion
sub on_connect {
my $self = shift;

$self->join( '#deimos' );
$self->privmsg( '#deimos', 'hello all' );

print "\r\n* Now talking in #deimos\r\n";
}

# Lors de la réception d'un message sur un chan
sub on_public {
my ($self, $event) = @_;
my ($nick, $mynick, $chan, $arg) = ($event->nick, $self->nick, $event->to, $event->args);

print "<$nick> $arg\r\n";

if($arg =~ /plop/i) { $self->privmsg( $chan, "$mynick te salue, $nick" ); }

if($arg =~ /$mynick[^\w]+quit/i) { $self->quit( "..." ); }
}


# Lors de la réception d'une notice
sub on_notice {
my ($self, $event) = @_;
my ($nick, $arg) = ($event->nick, $event->args);

print "- $nick - $arg\r\n";

if($arg =~ /prox(y|ies)\s+list/i) { $self->schedule( 3, \&Net::IRC::Connection::new_send, $nick, 'list_proxies.log' ); }
}

# Lors de la réception d'un message privé
sub on_msg {
my ($self, $event) = @_;
my ($nick, $arg) = ($event->nick, $event->args);

print "Pv from $nick : $arg\r\n";

$self->privmsg( $nick, "$nick : no pv, thx" );
}

# Lors d'un join
sub on_join {
my ($self, $event) = @_;
my ($nick, $chan) = ($event->nick, $event->to);

print "* $nick has joined $chan\r\n";

$self->ctcp( "VERSION", $nick );
}

# Lors d'une requête dcc
sub on_dcc {
my ($self, $event) = @_;
my ($nick, $arg) = ($event->nick, $event->args);

if($arg =~ /^send\s+(\S+)\s+/i) {
print "* DCC send request from $nick\r\n";

# Censé marcher selon la documentation et les scripts de test ...
# Mais tous mes tests avec new_get() ont foiré =)
#
#open( FILE, $1 );
#$self->new_get( $event, \*FILE );
#close( FILE );

$self->notice( $nick, "No DCC Send, thx" );
}

elsif($arg =~ /^chat/i) {
print "* DCC send request from $nick\r\n";

$self->notice( $nick, "No DCC Chat, thx" );
}
}

# Lors d'un ctcp version
sub on_version {
my ($self, $event) = @_;
my $nick = $event->nick;

print "* CTCP VERSION from $nick\r\n";

$self->ctcp_reply( $nick, "IRC b0t coding by Deimos v1.0" );
}



#Fonctionnalitée avancée pour kb les clients se connectant à IRC par eMule
#sub on_version_reply {
# my ($self, $event) = @_;
# my ($nick, @arg) = ($event->nick, $event->args);
# if($arg[1] =~ /emule[^\s]*smirc/i) {
# s/^.+\@(.+)$/\1/i;
# $self->mode( '#deimos', "+b", $_ );
# $self->mode( '#deimos', "+k", $nick );
# }
#}

# Lors de la déconnexion
sub on_disconnect {
my ($self, $event) = @_;

$self->connect;
}



print "Connexion en cours ... \r\n";

my $irc = new Net::IRC;
my $conn = $irc->newconn(Nick => 'b0t',
Server => 'irc.worldnet.net',
Port => 6667,
Ircname => 'b0t',
Username => 'irc_perl_b0t');

print "Installation des handlers ...\r\n";

$conn->add_handler('disconnect',\&on_disconnect);
$conn->add_handler('376', \&on_connect);
$conn->add_handler('public', \&on_public);
$conn->add_handler('notice', \&on_notice);
$conn->add_handler('msg', \&on_msg);
$conn->add_handler('join', \&on_join);

$conn->add_handler('cdcc', \&on_dcc);
$conn->add_handler('cversion', \&on_version);
$conn->add_handler('crversion', \&on_version_reply);


print "En attente de reponse du serveur ...\r\n\r\n";

$irc->start();

print "Done.\r\n";



Deimos.