Página 1 de 3

[IRC]Bot que responda

NotaPublicado: 2009-12-09 14:22 @640
por yoya5682
Bueno, quisiera saber un módulo completo que me ayude a hacer lo siguiente:

* Entrar al irc, claro.
* Mandar un mensaje a un usuario que entre, p.ej.: Bienvenido usuario 'x'.

Quisiera poder crearle funciones al Bot, y que me responda, p.ej.:
* Una función que sume, que podría llamarla así: !suma 1+2 Y él me respondería y me daría el resultado; claro, estaré, pasándoles los comandos por el irc, en este caso fue !suma.

* También para modificarlo que me responda solo a mi los comandos y no a cualquiera.

PD: Los comandos los mandaré por el irc que ya estarían programados; y acepto sugerencias.

Re: [IRC]Bot que responda

NotaPublicado: 2009-12-09 15:23 @683
por explorer
Bienvenido a los foros de Perl en Español, yoya5682.

No eres el único ni el primero que ha sacado el tema de los Bots para IRC.

De momento, echa un vistazo al último comentario sobre el asunto.

También puedes mirar un desarrollo completo de un IRC escrito en Perl, hecho por el usuario MidNight (y unos mensajes más abajo, el del usuario ubuntu).

También el usuario kamikaze mandó una cuestión referente a POE::Component::IRC, que es la forma moderna de controlar todo lo relacionado con IRC.

Re: [IRC]Bot que responda

NotaPublicado: 2009-12-09 16:57 @748
por yoya5682
Oka, vamos al paso creando el irc bot. Bueno, aquí ya tengo este pedazo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use POE::Component::IRC;
  2.  
  3. #Escribimos el nombre del bot Y la direccion del irc
  4. $nick = 'Yoya-Bot';
  5. $serve = 'irc.perl.org';
  6. $ircname = 'ircnode.com';
  7.  
  8. #Canales
  9. my $irc = POE::Component::IRC->spawn(
  10.     nick => $nick,
  11.     ircname => $ircname,
  12.     server => $server,
  13.  ) || die "Coneccion fallida";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El problema es que no sé si se conecta y tampoco sé cómo le haría para conectarme a un canal luego.

Re: [IRC]Bot que responda

NotaPublicado: 2009-12-09 19:33 @856
por explorer
¡Uuuyyyy!... así no se hacen las cosas, con POE... :)

Para programar en POE, hay que entender unos cuantos conceptos, y no son nada triviales. Y no se aprenden en una tarde (quizás en tres).

Solo tienes que mirar la sinopsis del módulo POE::Component::IRC para ver un ejemplo completo.

Re: [IRC]Bot que responda

NotaPublicado: 2009-12-10 16:00 @708
por yoya5682
Oka, he estado viendo algunos irc bot y encontre este, lo he modificado y cortado hasta la parte que entiendo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $servidor = "irc.com";
  2. $puerto = "6667";
  3. $nick = "Lex";
  4. $admin = "Yoya";
  5. $lex = "Lex";
  6. $canales = ":#canal";
  7. $conectado = 0;
  8. $comandos = "No hay todavia";
  9. ###############
  10.  
  11. use IO::Socket;
  12.  
  13. $socket = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$servidor", PeerPort => "$puerto") || print "Imposible conectar.\n";
  14.  
  15. &IRCSend ("NICK $lex");
  16. &IRCSend ("USER Lex-Bot es tu amigo");
  17.  
  18. while($conexion=<$socket>)
  19. {
  20. print $conexion;
  21.  
  22. if ($conexion=~/PING :/)
  23. {
  24.         &IRCSend ("PONG $'");
  25.         $conectado = 1;
  26. }
  27.  
  28. if ($conectado == 1)
  29. {
  30.         ######### Entrar a canales #########
  31.         if ($conexion=~/001/)
  32.         {
  33.                 @canaless = split(/:/ , $canales);
  34.                 for($i=0;$i<@canaless;$i++)
  35.                 {
  36.                 &JOIN("$canaless[$i]");
  37.                 }
  38.         }
  39. }
  40. }
  41.  
  42.  
  43. sub IRCSend { print $socket "$_[0]\n"; }
  44. sub JOIN { IRCSend("JOIN $_[0]\n"); }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Oka, lo que quiero es tratar que me responda los comandos o parámetros que le envío. Espero que sepas lo que trato de decir, también al principio del post lo he dicho.

Re: [IRC]Bot que responda

NotaPublicado: 2009-12-10 16:09 @714
por explorer
¿Ese código lo has hecho tu?

Se parece mucho a este, que está más completo. Te faltan muchas cosas ahí.

También se comenta aquí.

Re: [IRC]Bot que responda

NotaPublicado: 2009-12-10 16:21 @723
por yoya5682
Solo miré para que pueda entrar al irc, luego lo demás quiero ir haciéndolo yo mismo.

Re: [IRC]Bot que responda

NotaPublicado: 2009-12-10 16:45 @740
por yoya5682
Bueno, estoy tratando de hacer que me responda pero me da problemas al ejecutar el script.

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 = 'Lex';
  11. $bot = 'Lex-bot';
  12. $jefe = 'Yoya';
  13.  
  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.        #Vamos a comensar a ejecutar comandos
  36.        if ($recividos =~ m/:(.+)!(.+)@(.+)\s(.+)\s(.+)\s:(.+)\s(.+)/ig)
  37.        {
  38.        $usuario = $2;
  39.        $tipo = $4;
  40.        $donde = $5;
  41.        $comando = $6;
  42.         }
  43.        
  44. }
  45. sub envia
  46. {print $sock "$_[0]\n";
  47. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Re: [IRC]Bot que responda

NotaPublicado: 2009-12-10 18:07 @796
por explorer
A ver... lo que no puedes es publicar todo el código que encuentras por Internet y probar a ver si funciona. Tampoco lo que debes hacer es ir variando de código, porque entonces no resolvemos ninguno. Y lo tercero: date cuenta que estás en el foro Intermedio, así que eso implica que no vas a recibir respuestas tan claras como quisieras.

Una respuesta típica de este foro sería: en el enlace que te he puesto antes está el código COMPLETO de un bot para IRC (mensaje del día 8 de julio de 2006, y otros dos más a continuación). Así que solo te queda bajarlo, cambiar los datos de conexión al IRC en que quieres probar y ejecutarlo y ver si se conecta. Y luego, modificar el sitio del programa donde responde a los comandos del administrador. Y si salen errores, los publicas y te ayudamos.

Yo acabo de hacer eso mismo: me lo he bajado y lo estoy arreglando (para actualizarlo al Perl del 2009) y luego lo pruebo, pero es casi seguro que no tenga que hacer ningún cambio.

Tu puedes hacer lo mismo.

Re: [IRC]Bot que responda

NotaPublicado: 2009-12-10 18:27 @810
por yoya5682
Este último código que he posteado, fui yo que lo hice a base del tutorial que me pasaste al principio del post, el bot se me conecta al IRC y todo y se queda, no hay ningún problema con esa parte, ahora el problema es que al parecer no me identifica los comandos y ese es mi problema.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #Modulos
  2. use IO::Socket;
  3.  
  4. #Datos principales
  5. $serv = 'ir';
  6. $canal = '#canal';
  7. $port = '6667';
  8.  
  9. #Datos sobre el bot
  10. $nick = 'Lex';
  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 = $2; #Tengo el usuario registrado y solo reconocera el nick registrado
  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"){&envia($comandos);}
  50.  
  51.  
  52.      }  
  53.  }
  54.        
  55. }
  56. sub envia
  57. {print $sock "$_[0]\n";
  58. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Este es el código que tengo ahora mismo hecho y redacto que se conecta al IRC y todo y se mantiene, el problema es que no me identifica el comando correctamente.