• Publicidad

[IRC]Bot que responda

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Re: [IRC]Bot que responda

Notapor explorer » 2009-12-10 18:41 @820

Bueno, pues ya está... lo he arreglado. No tiene en cuenta todos los casos de conexión, pero al menos me entra en un canal y puedo mandarle órdenes.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # Codeado por Firos - Staff
  3. use strict;
  4. use warnings;
  5.  
  6.  
  7. #####DATOS#####
  8. my $servidor = 'irc.freenode.net';
  9. my $puerto   = "6667";
  10. my $nick     = "robot";
  11. my $admin    = "jferrero";
  12. my $sn00py   = "robot";
  13. my $canales  = "#perlenespanol";
  14. my $comandos = "Los comandos actualmente disponibles son: !kick, !ban, !unban, !voice, !devoice, !quit, !part, !join, !commands, !op, !deop. Para poder utilizarlos has de tener privilegios sobre el bot.";
  15. ###############
  16.  
  17. use IO::Socket;
  18.  
  19. my $socket = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$servidor", PeerPort => "$puerto") || print "Imposible conectar.\n";
  20.  
  21. &IRCSend ("NICK $sn00py");
  22. &IRCSend ("USER la madre que lotrajo");
  23.  
  24. my $conectado = 1;
  25.  
  26. while(my $conexion = <$socket>)
  27. {
  28.     print $conexion;
  29.  
  30.     if ($conexion=~/PING :/)
  31.     {
  32.         &IRCSend ("PONG $'");
  33.         $conectado = 1;
  34.     }
  35.  
  36.     if ($conectado == 1)
  37.     {
  38.         ######### Entrar a canales #########
  39.         if ($conexion=~/001/)
  40.         {
  41.             sleep 2;
  42.             my @canales = split(/:/ , $canales);
  43.             for(my $i = 0; $i < @canales; $i++)
  44.             {
  45.                 print "Entrando en $canales[$i]\n";
  46.                 &JOIN("$canales[$i]");
  47.             }
  48.             $conectado = 2;
  49.         }
  50.     }
  51.  
  52.     if ($conectado == 2)
  53.     {
  54.         ######### Aqui empieza la identificacion/ejecución de comandos ###########
  55.         if ($conexion =~ /^\:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.*)/)
  56.         {
  57.             my $quien = $1; my $comandoserv = $4; my $donde = $5; my $comando = $6; my $patron = $7;
  58.  
  59.             ######### Comandos de canal ########
  60.             if ($quien eq $admin)
  61.             {
  62.                 if    ($comando eq "!commands") { PRIVMSG("$donde" , $comandos); }
  63.                 elsif ($comando eq "!op") { &IRCSend("MODE $donde +o $patron"); }
  64.                 elsif ($comando eq "!deop") { &IRCSend("MODE $donde -o $patron"); }
  65.                 elsif ($comando eq "!join") { &IRCSend("JOIN :$patron"); }
  66.                 elsif ($comando eq "!quit") { &IRCSend("QUIT :$patron"); }
  67.                 elsif ($comando eq "!kick") { &IRCSend("KICK $donde :$patron"); }
  68.                 elsif ($comando eq "!ban") { &IRCSend("MODE $donde +b :$patron"); }
  69.                 elsif ($comando eq "!unban") { &IRCSend("MODE $donde -b :$patron"); }
  70.                 elsif ($comando eq "!voice") { &IRCSend("MODE $donde +v :$patron"); }
  71.                 elsif ($comando eq "!devoice") { &IRCSend("MODE $donde -v :$patron"); }
  72.                 elsif ($comando eq "!part") { &IRCSend("PART $donde :$patron"); }
  73.             }
  74.         }
  75.  
  76.         ######## Lectura/ejecución por query #########
  77.         if ($conexion =~ /^\:(\S*)!(\S*)@(\S*)\sPRIVMSG\s$sn00py\s\:(\S*)\s(\S*)\s(.*)/)
  78.         {
  79.             my $quien = $1; my $comando = $4; my $canal = $5; my $patron = $6;
  80.  
  81.             if ($admin eq $quien)
  82.             {
  83.                 if ($comando eq "!MSG") {IRCSend("PRIVMSG $canal :$patron"); }
  84.             }
  85.         }
  86.  
  87.         ######## Rejoin #########
  88.         if ($conexion =~ /^\:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s(\S*)\s:(.*)/)
  89.         {
  90.             my $quien = $1; my $comandserv = $4; my $donde = $5; my $aquien = $6;
  91.             if ($comandserv eq "KICK") { &JOIN ("$donde"); }
  92.         }
  93.  
  94.     }
  95.  
  96.     ######## Random NICK #########
  97.     if ($conexion=~/^\:(\S*)\s433\s(.*)\s$sn00py(.*)/)
  98.     {
  99.         $sn00py .= int(rand(999));
  100.         &IRCSend ("NICK :$sn00py");
  101.         $conectado = 1;
  102.     }
  103. }
  104.  
  105. ####### Subrutinas ########
  106. sub IRCSend { print $socket "$_[0]\n"; }
  107. sub JOIN { IRCSend("JOIN $_[0]\n"); }
  108. sub PRIVMSG { IRCSend ("PRIVMSG $_[0] :$_[1]"); }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: [IRC]Bot que responda

Notapor yoya5682 » 2009-12-10 18:59 @832

Tengo este ya, creo que he avanzado un poco, ahora el problema es que cuando escribo #help, el bot no me responde, y mi nick de usuario está bien.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #Modulos
  2. use IO::Socket;
  3.  
  4. #Datos principales
  5. $serv = 'irc';
  6. $canal = '#canal';
  7. $port = '6667';
  8.  
  9. #Datos sobre el bot
  10. $nick = 'LexeT';
  11. $bot = 'Lex-bot';
  12. $jefe = 'Yoya';
  13. $comandos = "En este momento estan disponible los comandos: %coment";
  14. #Creamos el socket
  15. my $sock = IO::Socket::INET->new(
  16.                 PeerAddr => "$serv",      
  17.                 PeerPort => "$port",      
  18.                 Proto    => 'tcp' ) || die "conexión fallida\n";
  19.  
  20. while(<$sock>) {
  21.    
  22.     $datos = $_;
  23.     print $datos;
  24.    
  25.     if ($datos =~ /NOTICE AUTH/ig){
  26.    
  27.     &envia("NICK $nick \n");  
  28.     &envia("USER $bot x x x x\n")
  29.    }
  30.         if ($datos =~ /^PING :/i)                
  31.         {
  32.         &envia("PONG :$'");            
  33.         }
  34.         &envia("join $canal");
  35.        
  36.         #Comensamos a crear las funciones
  37.         #:[email protected] PRIVMSG #undersec :a
  38.         if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)
  39.         {
  40.          #Damos valores ah algunas variables  
  41.          $usuario = $1;
  42.          $tipo = $4;
  43.          $donde = $5;
  44.          $comando = $6;
  45.          $text = $7;
  46.          #Leiendo canal y reconociendo comandos del jefe
  47.          if ($jefe eq $usuario){
  48.          
  49.          if($comandos eq "#help"){&msg("$donde", $comandos);}
  50.  
  51.  
  52.      }  
  53.  }
  54.        
  55. }
  56. sub envia {print $sock "$_[0]\n";}
  57. sub msg{ envia("PRIVMSG $_[0] :$_[1]");}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-12-10 19:07 @838, editado 1 vez en total
Razón: Ortografía
yoya5682
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2009-12-09 14:13 @634

Re: [IRC]Bot que responda

Notapor explorer » 2009-12-10 19:08 @839

¿No has probado el bot que he mandado? Ya está completo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: [IRC]Bot que responda

Notapor yoya5682 » 2009-12-10 20:17 @886

¡Eh!, sí, el tuyo funciona, pero el tuyo es un poco raro, por eso quiero que el mio sea raro igual. Bueno, ahora lo que hice fue meter dentro del if() algo para que lo imprima; así sé si el if() se cumplió correctamente y al parecer no se cumplió correctamente. Aquí te dejo el code para que me digas cual es mi error.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #Modulos
  2. use IO::Socket;
  3.  
  4. #Datos principales
  5. $serv = 'irc';
  6. $canal = '#canal';
  7. $port = '6667';
  8.  
  9. #Datos sobre el bot
  10. $nick = 'LexeT';
  11. $bot = 'Lex-bot';
  12. $jefe = 'Yoya';
  13. $comandos = "En este momento estan disponible los comandos: %coment";
  14. #Creamos el socket
  15. my $sock = IO::Socket::INET->new(
  16.                 PeerAddr => "$serv",      
  17.                 PeerPort => "$port",      
  18.                 Proto    => 'tcp' ) || die "conexi√≥n fallida\n";
  19.  
  20. while(<$sock>) {
  21.    
  22.     $datos = $_;
  23.     print $datos;
  24.    
  25.     if ($datos =~ /NOTICE AUTH/ig){
  26.    
  27.     &envia("NICK $nick \n");  
  28.     &envia("USER $bot x x x x\n")
  29.    }
  30.         if ($datos =~ /^PING :/i)                
  31.         {
  32.         &envia("PONG :$'");            
  33.         }
  34.         &envia("join $canal");
  35.        
  36.         #Comensamos a crear las funciones
  37.        
  38.         if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)
  39.         {
  40.          #Damos valores ah algunas variables  
  41.          $usuario = $1;
  42.          $tipo = $4;
  43.          $donde = $5;
  44.          $comando = $6;
  45.          $text = $7;
  46.          &msg("$donde", $comandos);         #Leiendo canal y reconociendo comandos del jefe
  47.          if ($jefe eq $usuario){
  48.          
  49.          if($comando eq "#help"){&msg("#undersec", $comandos);}
  50.  
  51.  
  52.      }  
  53.  }
  54.        
  55. }
  56. sub envia {print $sock "$_[0]\n";}
  57. sub msg{ envia("PRIVMSG $_[0] :$_[1]");}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


PD: lo agregué en la linea 46; si te fijas no imprime porque la condición if() no se cumple al parecer y ahí debe estar el problema...
Última edición por explorer el 2009-12-11 04:14 @218, editado 1 vez en total
Razón: Ortografía
yoya5682
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2009-12-09 14:13 @634

Re: [IRC]Bot que responda

Notapor explorer » 2009-12-11 05:58 @290

El error está en la línea

&envia("join $canal");

Esa línea debería ir en la parte de conexión inicial. Tal como la tienes ahí fuera, la estás ejecutando a cada momento, por lo que algunos IRC se cansarán y te echarán fuera.

Para saber si el programa traduce bien las líneas que recibe, coloca un print() justo antes de &msg("$donde", $comandos);, con todas las variables, para ver qué valores almacenan. Así sabrás si entra ahí y qué valores son. Y de ahí, saber por qué no entra en el siguiente if().

Actualización: Lo que sí veo mal es que tenga un /g al final. Quítalo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: [IRC]Bot que responda

Notapor yoya5682 » 2009-12-11 09:30 @437

Ok, ya todo me salió bien y el bot obedece, gracias.

Saludos.
yoya5682
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2009-12-09 14:13 @634

Re: [IRC]Bot que responda

Notapor explorer » 2009-12-12 19:35 @857

Este es un bot que me he hecho en un rato, con Bot::BasicBot.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. our $admin = 'jferrero';
  7. our $nick  = 'perla';
  8.  
  9. Bot->new(
  10.     channels => [ '#perlenespanol' ],
  11.     nick     => $nick,
  12.     server   => 'irc.freenode.org',
  13. )->run;
  14.  
  15. package Bot;
  16. use base qw(Bot::BasicBot);
  17.  
  18. sub said {
  19.     my $self    = shift;
  20.     my $message = shift;
  21.     my $body    = $message->{body};
  22.     my $who     = $message->{who};
  23.     my $address = $message->{address} || '';
  24.  
  25.     if ($address) {
  26.         if ($address eq 'msg') {
  27.             $address = $nick;
  28.         }
  29.         $body = "$address, $body";
  30.     }
  31.  
  32.     print "[$body|$address]\n";
  33.  
  34.     sleep 1+rand(3);
  35.  
  36.     if ($body =~ /(?:^|\b)$nick\b/i) {                        # solo dirigido a nosotros              
  37.  
  38.         # Saludo
  39.         if ($body =~ /hola/i) {
  40.             $self->reply($message, "Hola, $who");
  41.         }
  42.        
  43.         elsif ($body =~ /sabes perl\?/i) {
  44.             $self->reply($message, "un poco...");
  45.         }
  46.  
  47.         # Es un robot
  48.         if ($body =~ /\b(?:ro)?bot\b/i) {
  49.             if (rand() < 0.8) {
  50.                 $self->reply($message, "no");
  51.             }
  52.             else {
  53.                 $self->reply($message, "que no!");
  54.             }
  55.            
  56.             if (rand() > 0.95) {
  57.                 $self->reply($message, ":)");
  58.             }
  59.         }
  60.  
  61. #        if ($who eq $admin) {
  62.         if ($body =~ /\bdime\b.*?([\d()\/+*-]+)/i) {
  63.             print "Operacion: [$1]: ", eval($1),"\n";
  64.             $self->reply($message, eval($1));
  65.         }
  66. #        }
  67.     }
  68.     else {
  69.         print "No dirigido a nosotros\n";
  70.     }
  71.  
  72.     return undef;
  73. }
  74. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El bot responde al saludo, insiste en decir que no es robot, y responde a cuestiones matemáticas si se incluye antes la palabra 'dime'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Bot IRC Perl

Notapor kt0sh » 2009-12-13 04:16 @220

Hola, buenas noches.

Quisiera pedir un poco de ayuda ya que estoy en mis inicios de Perl y ando algo complicado con el código de mi primera bot.

Resulta que quiero meterle una funciones para que cuando tire comandos, por ejemplo !hex Hola me de el texto traducido a hexadecimal, al igual que agregar respuestas automáticas; por ejemplo, cuando alguien diga Hola el bot automáticamente responda Hola, "Nick" o que alguien diga dime 354354 y el bot diga el número 354354; también le quiero agregar funciones matemáticas, por ejemplo, Binario, suma de binarios, Descrytar Hash y ese tipo de cosas, pero la cuestión es que no sé cómo implementarlo en el código que estoy haciendo. Si me pueden ayudar sería espectacular.

De antemano, gracias.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. ##############################################
  3. # PROGRAMA: DA-VINCI BOT.v.0.1               #
  4. # AUTOR:    [[Ktosh]]                        #
  5. # GRACIAS A: Yoyahack, seth y S[e]C          #
  6. ##############################################
  7.  
  8.  
  9. #---------------------------------Modulos del Bot--------------------------------------#
  10. use IO::Socket;
  11.  
  12. #---------------------------------Datos principales------------------------------------#
  13.  
  14. $server   = 'ircnode.com';
  15. $port     = '6667';
  16. $canal    = '#undersec';
  17.  
  18. #--------------------------------Datos Del Bot------------------------------------------#
  19. $nick = 'Prote0';
  20. $bot  = 'Prote0';
  21. $adm  = '[[Kt0sh]]';
  22. chomp $adm;
  23. ;
  24. #-------------------------------------Respuesta de Comandos----------------------------------#
  25. $help   = "Los comandos Disponibles son : !help, !hi";
  26. $hi     = "hola";
  27. #-------------------------------------Conexión de IO::Socket;-------------------------------#
  28.  
  29. my $sock = IO::Socket::INET ->new(
  30.                      PeerAddr => "$server",
  31.                      PeerPort => "$port",
  32.                      Proto    => 'tcp' ) || die "No hay coneción\n";
  33.  
  34. while(<$sock>){
  35.     my $datos = $_;                      
  36.     print $datos;                    
  37.    
  38.     if ($datos =~ /NOTICE AUTH/i)        
  39.     {      
  40.         &envia("NICK $nick \n");            
  41.         &envia("USER $bot x x x x\n");    
  42.     }
  43.     if ($datos =~ /^PING :/i)
  44.     {
  45.         &envia("PONG  : $'");
  46.     }
  47.     &envia("join $canal");
  48.  
  49. #-------------------------------------Creamos las Funciones---------------------------------#
  50. #:[[Kt0sh]]!
  51.     if ($datos =~ /^\:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.*)/)
  52.     {
  53. #-------------------------------------Valores de Variables-----------------------------------#
  54.  
  55.         $usuario = $1;
  56.         chomp $usuario;
  57.         $tipo    = $4;
  58.         $donde   = $5;
  59.         $comando = $6;
  60.         $text    = $7;
  61.                
  62. #-------------------------------------Lector De Canal----------------------------------------#
  63.         if($comando eq "!help") {&msg("#undersec", $help);}
  64.         if($comando eq "!hi")   {&msg("#undersec", $hi);  }
  65.         if($comando eq "!hex")  {&msg("#undersec", $hex); }
  66.                
  67.     }
  68. }
  69.  
  70. #-------------------------------------Funciones----------------------------------------------#
  71. sub envia {print $sock "$_[0]\n";}
  72. sub msg {envia("PRIVMSG $_[0] :$_[1]");}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-12-13 07:25 @351, editado 3 veces en total
Razón: Ortografía, anglicismos
kt0sh
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2009-12-13 01:54 @121

Re: Bot IRC Perl

Notapor explorer » 2009-12-13 07:01 @334

Bienvenido a los foros de Perl en Español, kt0sh.

De ese tema hemos hablado hace poco... están publicados varios bots que funcionan, y son fáciles de modificar para que hagan lo que quieres, incluido uno basado en el mismo código tuyo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: [IRC]Bot que responda

Notapor DaNnY » 2010-03-11 13:05 @587

Hola, soy nuevo en este foro, andaba buscando tutoriales o manuales de Perl para IRC en español y os encontré a vosotros por suerte.

Me gustaría comenzar un bot para IRC; sus funciones sería la de administrar canales oficiales de mi servidor.

Sus funciones serían las siguientes:

* Dar @ a los moderadores de la red
* Avisar por privado al usuario (normas de la sala)
* Avisar al debug de (spam, mayúsculas, colores, insultos... etc)
* Kickear y Banear si no hay mas @'s en la sala.
* Poner modos automáticamente en caso de no haber más @'s.

" Para comenzar haría esto"

Gracias de antemano.
DaNnY
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-03-11 12:44 @572

AnteriorSiguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron