#!/usr/bin/perl -w
use strict;
use IO::Socket;
use IO::Select;
my $version = 0.2;
my $inbytes = 0;
my $outbytes = 0;
#my @queue; #bah ué c pas encore fait XD
my $cfg = "bot.cfg"; #le fichier de conf
my %opts;
our $sock;
my $fh;
my $buffer = '';
my $ping = 0;
&readconf;
&Update::update($version) if ($opts{checkupdates});
#require Parse;
#require Send;
CONNECT:
&connect;
my $sel = IO::Select->new($sock);
&send("PASS $opts{botpass}");&send("NICK $opts{botnick}");
&send("USER $opts{botuser} 0 0 :$opts{botrealname}");
while (1)
{
my($readable) = IO::
Select->
select($sel,
undef,
undef,
0.5);
{
$fh = $readable->[0];
my $buffer2;
$fh->recv($buffer2,512,0);
{
$buffer .= $buffer2;
while (index($buffer,
"\n") !=
-1) {
$inbytes = parse($line, $inbytes, $outbytes, $compteur, $cfg, %opts);
}
}
else
{
&reconnect;
}
}
else
{
&reconnect
if (time -
$opts{timer
} >
$timer);
}
}
sub reconnect
{
$sel->remove($fh);
# undef(@queue);
&affich("Deconnecte. $opts{reconnect_wait}s avant la reconnection...", 3);
sleep($opts{reconnect_wait
});
}
sub parse
{
&parse_affich($in);
if (lc($arg[0]) eq
'ping') {
$ping++;
if($ping == 100)
{
;
}
&send("PONG $arg[1]");
}
elsif ($arg[1] && $arg[1] eq '376')
{
&send("MODE $opts{botnick} +BT-s");
&send("JOIN $_") for(@{$opts{chans}});
}
elsif ($arg[1] &&
lc($arg[1]) eq
'kick') {
&send("JOIN $arg[2]");
}
{
if ($arg[0] =~ /^$opts{mask}$/)
{
if ($arg[3] =~ /^:!reconnect/)
{
&send("QUIT :$opts{quit}");
&reconnect;
}
elsif ($arg[3] =~ /^:!quit/)
{
&send("QUIT :$opts{quit}");
}
elsif ($arg[3] =~ /^:!stats/)
{
&send("PRIVMSG $arg[2] :recu : $inbytes octets | envoye : $outbytes octets");
}
{
&send("JOIN $arg[4]");
if(open(FD,
">>$cfg")) {print FD
"\nchan=$arg[4]";
} else {&affich("Impossible d'ouvrir $cfg en ecriture", 2); }
push(@
{$opts{chans
}},
$arg[4]);
}
elsif ($arg[3] =~ /^:act$/ &&
defined($arg[4])) {
$in =~ /^:.*?:.*?\
s+?.*?\
s+?
(.*
)$/;
&send("PRIVMSG $arg[4] :\001ACTION $1\001");
}
elsif ($arg[3] =~ /^:say$/ &&
defined($arg[4])) {
$in =~ /^:.*?:.*?\
s+?.*?\
s+?
(.*
)$/;
&send("PRIVMSG $arg[4] :$1");
}
elsif ($arg[3] =~ /^:raw$/ &&
defined($arg[4])) {
$in =~ /^:.*?:.*?\
s+?
(.*
)$/;
&send("$1");
}
elsif (lc($arg[3]) eq
":ame" &&
defined($arg[4])) {
$in =~ /^:.*?:.*?\
s+?
(.*
)$/;
&send("PRIVMSG $_ :\001ACTION $1\001") for(@{$opts{chans}});;
}
elsif (lc($arg[3]) eq
":amsg" &&
defined($arg[4])) {
$in =~ /^:.*?:.*?\
s+?
(.*
)$/;
&send("PRIVMSG $_ :$1") for(@{$opts{chans}});;
}
elsif (lc($arg[3]) eq
":!logout" ) {
$arg[0] =~ /^:(.*?)!.*$/;
&send("PRIVMSG $1 :Bye Master :'(");
$opts{mask} = "";
}
}
if ($arg[4] &&
lc($arg[3]) eq
":identify" && $arg[4] eq $opts{adminpass})
{
$arg[0] =~ /^.*?!(.*)$/;
$opts{mask} = ".*!$1";
$arg[0] =~ /^:(.*?)!.*$/;
&send("PRIVMSG $1 :Hello master =) I'm here to serve you !");
}
elsif (lc($arg[3]) eq
":!tps") {
my $diff =
time -
$compteur;
my $d =
int($diff /
(3600*
24));
my $h =
int(($diff -
$d*
3600*
24) /
3600);
my $m =
int(($diff -
$h*
3600)/
60);
my $s =
int($diff-
$h*
3600 -
$m*
60);
&send("PRIVMSG $arg[2] :J'suis connecté depuis".($d)?("$d jours"):("")."$h heures $m minutes $s secondes.");
}
}
}
{
my($text) = @_;
if ($sock)
{
$outbytes +=
length($text) +
2;
print "\033[35m-> $text\033[m\n";
}
else
{
# undef(@queue);
print "\$sock n'est pas writeable\n";
}
}
sub notice {
my ($p, $m) = @_;
&send
('NOTICE $p :'.
substr($m,
0,
450));
}
}
sub parse_affich
{
printf("\033[43m\033[30m%02d:%02d:%02d\033[m\033[m ",
$hour,
$min,
$sec);
$in =~
s/
['\001''\377']//g;
if ($arg[1] && ($arg[1] =~ /^\d+$/ ||
($arg[1] eq 'NOTICE' && $arg[2] && $arg[2] eq 'AUTH')))
{
$in =~ /^:.*?\
s.*?\
s.*?\
s:?
(.*
)/;
}
elsif ($arg[1] &&
lc($arg[1]) eq
"privmsg") {
$in =~ /:(.*?)!.*?:(.*)$/;
if (lc($arg[2]) eq
lc($opts{botnick
})) {
print "\a\033[35mPV\033[m \033[34m$1\033[m $2\033[m\n";
}
else
{
print "\033[32m$arg[2]\033[m \033[34m$1\033[m $2\n";
}
}
elsif ($arg[1] &&
lc($arg[1]) eq
"quit") {
$in =~ /:(.*?)!.*?:(.*)$/;
print "\033[35m* $1 a quitté ($2)\033[m\n";
}
else
{
print "\033[32m<- $in\033[m\n";
}
}
sub readconf
{
open(I,
"<$cfg") ||
die "Can't read $cfg: $!\n";
chomp (my @lines =
(<I>));
foreach (@lines)
{
next() if $_ =~ /^#/;
my ($key,
$val) =
split(/=/,
$_,
2);
if (lc($val) eq
"on" ||
lc($val) eq
"yes") { $val =
1;
} elsif (lc($val) eq
"off" ||
lc($val) eq
"no") { $val =
0;
} if ($key eq
"chan") { push(@
{$opts{chans
}},
$val);
} elsif ($key eq
"server") { push(@
{$opts{servers
}},
$val);
} else { $opts{$key} = $val; }
}
}
{
while (!$sock)
{
print "\nConnection a $opts{servers}->[0]...\n";
my %sockinfo = (PeerAddr => $opts{servers}->[0],
PeerPort => 6667);
$sock = IO::Socket::INET->new(%sockinfo) or
print "ERREUR : Impossible de se connecter: $!\n";
push(@
{$opts{servers
}},
shift(@
{$opts{servers
}})) if (!
$sock);
}
}