2009-12-09 14:22 @640 |
|
|
yoya5682
Perlero Nuevo
|
Registrado: 2009-12-09 14:13 @634 Mensajes: 9
|
|
|
[IRC]Bot que responda
|
|
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.
| Última edición por explorer el 2009-12-09 14:39 @652, editado 1 vez en total |
| Ortografía |
|
2009-12-09 15:23 @683 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: [IRC]Bot que responda
|
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.
_________________ JF^D Perl programming
|
2009-12-09 16:57 @748 |
|
|
yoya5682
Perlero Nuevo
|
Registrado: 2009-12-09 14:13 @634 Mensajes: 9
|
|
|
Re: [IRC]Bot que responda
|
Oka, vamos al paso creando el irc bot. Bueno, aquí ya tengo este pedazo Using perl Syntax Highlighting use POE::Component::IRC;
#Escribimos el nombre del bot Y la direccion del irc
$nick = 'Yoya-Bot';
$serve = 'irc.perl.org';
$ircname = 'ircnode.com';
#Canales
my $irc = POE::Component::IRC->spawn(
nick => $nick,
ircname => $ircname,
server => $server,
) || die "Coneccion fallida";
El problema es que no sé si se conecta y tampoco sé cómo le haría para conectarme a un canal luego.
| Última edición por explorer el 2009-12-09 19:29 @854, editado 1 vez en total |
| Ortografía |
|
2009-12-09 19:33 @856 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: [IRC]Bot que responda
|
¡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.
_________________ JF^D Perl programming
|
2009-12-10 16:00 @708 |
|
|
yoya5682
Perlero Nuevo
|
Registrado: 2009-12-09 14:13 @634 Mensajes: 9
|
|
|
Re: [IRC]Bot que responda
|
Oka, he estado viendo algunos irc bot y encontre este, lo he modificado y cortado hasta la parte que entiendo. Using perl Syntax Highlighting $servidor = "irc.com";
$puerto = "6667";
$nick = "Lex";
$admin = "Yoya";
$lex = "Lex";
$canales = ":#canal";
$conectado = 0;
$comandos = "No hay todavia";
###############
use IO::Socket;
$socket = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$servidor", PeerPort => "$puerto") || print "Imposible conectar.\n";
&IRCSend ("NICK $lex");
&IRCSend ("USER Lex-Bot es tu amigo");
while($conexion=<$socket>)
{
print $conexion;
if ($conexion=~/PING :/)
{
&IRCSend ("PONG $'");
$conectado = 1;
}
if ($conectado == 1)
{
######### Entrar a canales #########
if ($conexion=~/001/)
{
@canaless = split(/:/ , $canales);
for($i=0;$i<@canaless;$i++)
{
&JOIN("$canaless[$i]");
}
}
}
}
sub IRCSend { print $socket "$_[0]\n"; }
sub JOIN { IRCSend("JOIN $_[0]\n"); }
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.
Última edición por yoya5682 el 2009-12-13 21:47 @949, editado 2 veces en total
|
2009-12-10 16:09 @714 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: [IRC]Bot que responda
|
¿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í.
_________________ JF^D Perl programming
|
2009-12-10 16:21 @723 |
|
|
yoya5682
Perlero Nuevo
|
Registrado: 2009-12-09 14:13 @634 Mensajes: 9
|
|
|
Re: [IRC]Bot que responda
|
|
Solo miré para que pueda entrar al irc, luego lo demás quiero ir haciéndolo yo mismo.
| Última edición por explorer el 2009-12-10 17:33 @772, editado 1 vez en total |
| Tildes |
|
2009-12-10 16:45 @740 |
|
|
yoya5682
Perlero Nuevo
|
Registrado: 2009-12-09 14:13 @634 Mensajes: 9
|
|
|
Re: [IRC]Bot que responda
|
Bueno, estoy tratando de hacer que me responda pero me da problemas al ejecutar el script. Using perl Syntax Highlighting #Modulos
use IO::Socket;
#Datos principales
$serv = 'irc';
$canal = '#canal';
$port = '6667';
#Datos sobre el bot
$nick = 'Lex';
$bot = 'Lex-bot';
$jefe = 'Yoya';
#Creamos el socket
my $sock = IO::Socket::INET->new(
PeerAddr => "$serv",
PeerPort => "$port",
Proto => 'tcp' ) || die "conexión fallida\n";
while(<$sock>) {
$datos = $_;
print $datos;
if ($datos =~ /NOTICE AUTH/ig){
&envia("NICK $nick \n");
&envia("USER $bot x x x x\n")
}
if ($datos =~ /^PING :/i)
{
&envia("PONG :$'");
}
&envia("join $canal")
#Vamos a comensar a ejecutar comandos
if ($recividos =~ m/:(.+)!(.+)@(.+)\s(.+)\s(.+)\s:(.+)\s(.+)/ig)
{
$usuario = $2;
$tipo = $4;
$donde = $5;
$comando = $6;
}
}
sub envia
{print $sock "$_[0]\n";
}
|
2009-12-10 18:27 @810 |
|
|
yoya5682
Perlero Nuevo
|
Registrado: 2009-12-09 14:13 @634 Mensajes: 9
|
|
|
Re: [IRC]Bot que responda
|
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. Using perl Syntax Highlighting #Modulos
use IO::Socket;
#Datos principales
$serv = 'ir';
$canal = '#canal';
$port = '6667';
#Datos sobre el bot
$nick = 'Lex';
$bot = 'Lex-bot';
$jefe = 'Yoya';
$comandos = 'En este momento estan disponible los comandos: %coment.';
#Creamos el socket
my $sock = IO::Socket::INET->new(
PeerAddr => "$serv",
PeerPort => "$port",
Proto => 'tcp' ) || die "conexión fallida\n";
while(<$sock>) {
$datos = $_;
print $datos;
if ($datos =~ /NOTICE AUTH/ig){
&envia("NICK $nick \n");
&envia("USER $bot x x x x\n")
}
if ($datos =~ /^PING :/i)
{
&envia("PONG :$'");
}
&envia("join $canal");
#Comensamos a crear las funciones
if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)
{
#Damos valores ah algunas variables
$usuario = $2; #Tengo el usuario registrado y solo reconocera el nick registrado
$tipo = $4;
$donde = $5;
$comando = $6;
$text = $7;
#Leiendo canal y reconociendo comandos del jefe
if ($jefe eq $usuario){
if($comandos eq "#help"){&envia($comandos);}
}
}
}
sub envia
{print $sock "$_[0]\n";
}
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.
|
2009-12-10 18:41 @820 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10216
|
|
|
Re: [IRC]Bot que responda
|
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. Using perl Syntax Highlighting #!/usr/bin/perl
# Codeado por Firos - Staff
use strict;
use warnings;
#####DATOS#####
my $servidor = 'irc.freenode.net';
my $puerto = "6667";
my $nick = "robot";
my $admin = "jferrero";
my $sn00py = "robot";
my $canales = "#perlenespanol";
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.";
###############
use IO::Socket;
my $socket = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$servidor", PeerPort => "$puerto") || print "Imposible conectar.\n";
&IRCSend ("NICK $sn00py");
&IRCSend ("USER la madre que lotrajo");
my $conectado = 1;
while(my $conexion = <$socket>)
{
print $conexion;
if ($conexion=~/PING :/)
{
&IRCSend ("PONG $'");
$conectado = 1;
}
if ($conectado == 1)
{
######### Entrar a canales #########
if ($conexion=~/001/)
{
sleep 2;
my @canales = split(/:/ , $canales);
for(my $i = 0; $i < @canales; $i++)
{
print "Entrando en $canales[$i]\n";
&JOIN("$canales[$i]");
}
$conectado = 2;
}
}
if ($conectado == 2)
{
######### Aqui empieza la identificacion/ejecución de comandos ###########
if ($conexion =~ /^\:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.*)/)
{
my $quien = $1; my $comandoserv = $4; my $donde = $5; my $comando = $6; my $patron = $7;
######### Comandos de canal ########
if ($quien eq $admin)
{
if ($comando eq "!commands") { PRIVMSG("$donde" , $comandos); }
elsif ($comando eq "!op") { &IRCSend("MODE $donde +o $patron"); }
elsif ($comando eq "!deop") { &IRCSend("MODE $donde -o $patron"); }
elsif ($comando eq "!join") { &IRCSend("JOIN :$patron"); }
elsif ($comando eq "!quit") { &IRCSend("QUIT :$patron"); }
elsif ($comando eq "!kick") { &IRCSend("KICK $donde :$patron"); }
elsif ($comando eq "!ban") { &IRCSend("MODE $donde +b :$patron"); }
elsif ($comando eq "!unban") { &IRCSend("MODE $donde -b :$patron"); }
elsif ($comando eq "!voice") { &IRCSend("MODE $donde +v :$patron"); }
elsif ($comando eq "!devoice") { &IRCSend("MODE $donde -v :$patron"); }
elsif ($comando eq "!part") { &IRCSend("PART $donde :$patron"); }
}
}
######## Lectura/ejecución por query #########
if ($conexion =~ /^\:(\S*)!(\S*)@(\S*)\sPRIVMSG\s$sn00py\s\:(\S*)\s(\S*)\s(.*)/)
{
my $quien = $1; my $comando = $4; my $canal = $5; my $patron = $6;
if ($admin eq $quien)
{
if ($comando eq "!MSG") {IRCSend("PRIVMSG $canal :$patron"); }
}
}
######## Rejoin #########
if ($conexion =~ /^\:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s(\S*)\s:(.*)/)
{
my $quien = $1; my $comandserv = $4; my $donde = $5; my $aquien = $6;
if ($comandserv eq "KICK") { &JOIN ("$donde"); }
}
}
######## Random NICK #########
if ($conexion=~/^\:(\S*)\s433\s(.*)\s$sn00py(.*)/)
{
$sn00py .= int(rand(999));
&IRCSend ("NICK :$sn00py");
$conectado = 1;
}
}
####### Subrutinas ########
sub IRCSend { print $socket "$_[0]\n"; }
sub JOIN { IRCSend("JOIN $_[0]\n"); }
sub PRIVMSG { IRCSend ("PRIVMSG $_[0] :$_[1]"); }
_________________ JF^D Perl programming
|
2009-12-10 18:59 @832 |
|
|
yoya5682
Perlero Nuevo
|
Registrado: 2009-12-09 14:13 @634 Mensajes: 9
|
|
|
Re: [IRC]Bot que responda
|
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. Using perl Syntax Highlighting #Modulos
use IO::Socket;
#Datos principales
$serv = 'irc';
$canal = '#canal';
$port = '6667';
#Datos sobre el bot
$nick = 'LexeT';
$bot = 'Lex-bot';
$jefe = 'Yoya';
$comandos = "En este momento estan disponible los comandos: %coment";
#Creamos el socket
my $sock = IO::Socket::INET->new(
PeerAddr => "$serv",
PeerPort => "$port",
Proto => 'tcp' ) || die "conexión fallida\n";
while(<$sock>) {
$datos = $_;
print $datos;
if ($datos =~ /NOTICE AUTH/ig){
&envia("NICK $nick \n");
&envia("USER $bot x x x x\n")
}
if ($datos =~ /^PING :/i)
{
&envia("PONG :$'");
}
&envia("join $canal");
#Comensamos a crear las funciones
#:Yoyahack!Yoyahack@11CAD795.7DE4D367.EBAEFD4.IP PRIVMSG #undersec :a
if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)
{
#Damos valores ah algunas variables
$usuario = $1;
$tipo = $4;
$donde = $5;
$comando = $6;
$text = $7;
#Leiendo canal y reconociendo comandos del jefe
if ($jefe eq $usuario){
if($comandos eq "#help"){&msg("$donde", $comandos);}
}
}
}
sub envia {print $sock "$_[0]\n";}
sub msg{ envia("PRIVMSG $_[0] :$_[1]");}
| Última edición por explorer el 2009-12-10 19:07 @838, editado 1 vez en total |
| Ortografía |
|
2009-12-10 20:17 @886 |
|
|
yoya5682
Perlero Nuevo
|
Registrado: 2009-12-09 14:13 @634 Mensajes: 9
|
|
|
Re: [IRC]Bot que responda
|
¡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. Using perl Syntax Highlighting #Modulos
use IO::Socket;
#Datos principales
$serv = 'irc';
$canal = '#canal';
$port = '6667';
#Datos sobre el bot
$nick = 'LexeT';
$bot = 'Lex-bot';
$jefe = 'Yoya';
$comandos = "En este momento estan disponible los comandos: %coment";
#Creamos el socket
my $sock = IO::Socket::INET->new(
PeerAddr => "$serv",
PeerPort => "$port",
Proto => 'tcp' ) || die "conexión fallida\n";
while(<$sock>) {
$datos = $_;
print $datos;
if ($datos =~ /NOTICE AUTH/ig){
&envia("NICK $nick \n");
&envia("USER $bot x x x x\n")
}
if ($datos =~ /^PING :/i)
{
&envia("PONG :$'");
}
&envia("join $canal");
#Comensamos a crear las funciones
if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)
{
#Damos valores ah algunas variables
$usuario = $1;
$tipo = $4;
$donde = $5;
$comando = $6;
$text = $7;
&msg("$donde", $comandos); #Leiendo canal y reconociendo comandos del jefe
if ($jefe eq $usuario){
if($comando eq "#help"){&msg("#undersec", $comandos);}
}
}
}
sub envia {print $sock "$_[0]\n";}
sub msg{ envia("PRIVMSG $_[0] :$_[1]");}
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 |
| Ortografía |
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|