• Publicidad

Cliente IRC para irssi

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cliente IRC para irssi

Notapor loquillo » 2010-01-16 20:55 @913

Hola, soy nuevo por estos lares. Me gustaría comentarles una de mis muchas dudas que me rondan por la cabeza. La idea que llevo en mente es hacer un pequeño script en Perl para IRC, concretamente como complemente del cliente de IRC irssi.

He estado mirando los ircbots que he visto por ahí y no es exactamente la filosofía que yo busco, yo no quiero tener un bot conectado en remoto, quiero que con mi cliente de IRC en marcha y con mi user, cuando yo u otro nick introduzca determinado texto en el canal se ejecute el comando de IRC que sea menester.

Los nicks que pueden hacer uso de estos comandos serían en un principio puestos "a mano".

Entonces buscando por ahí he encontrado un bot muy chorra que cuando introduces determinadas palabras dice que te da un helado o un café...

Su código es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Irssi;
  2. use vars qw($VERSION %IRSSI);
  3.  
  4. $VERSION = "1.0";
  5. %IRSSI = (
  6.     authors => 'PrincessLeia2',
  7.     contact => 'lyz\@princessleia.com ',
  8.     name => 'gimmie',
  9.     description => 'a bot script, using ! followed by anything the script will say (as an action): gets nickname anything',
  10.     license => 'GNU GPL v2 or later',
  11.     url => 'http://www.princessleia.com/'
  12. );
  13.  
  14. sub event_privmsg {
  15. my ($server, $data, $nick, $mask, $target) =@_;
  16. my ($target, $text) = $data =~ /^(\S*)\s:(.*)/;
  17.      return if ( $text !~ /^!/i );
  18.         if ( $text =~ /^!coffee$/i ) {
  19.                 $server->command ( "action $target hands $nick a steaming cup of coffee" );
  20.         }
  21.         elsif ($text =~ /^!chimay$/i ) {
  22.                 $server->command ( "action $target hands $nick a glass of Chimay" );
  23.         }
  24.         elsif ($text =~ /^!pepsi$/i ) {
  25.                 $server->command ( "action $target gives $nick a can of Star Wars Pepsi" );
  26.         }
  27.         elsif ($text =~ /^!ice cream$/i ) {
  28.                 $server->command ( "action $target gives $nick a chocolate ice cream with lots of cherries" );
  29.         }
  30.         elsif ($text =~ /^!$nick$/i ) {
  31.                 $server->command ( "msg $target get yourself?" );
  32.         }
  33.         else {
  34.                 my ($gimmie) = $text =~ /!(.*)/;
  35.                 $server->command ( "action $target Gets $nick $gimmie \0032<\%)");
  36.         }
  37. }
  38. Irssi::signal_add('event privmsg', 'event_privmsg');
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


La verdad es que funciona, pero claro, funciona con todos los nicks y no es lo que quiero concretamente.

He revisado la documentación de irssi pero no he encontrado nada al respecto pero leyendo el código creo discernir que la subrutina event_privmsg() es la que le indica a irssi que actuará sobre el texto introducido y me imagino que el propio irssi ya define lo qué es $nick y lo qué es $text.

Bueno al quid de la cuestión.

Quisiera poner por ejemplo !op nick2 y que el script hiciese un:

if ($text =~ /^!op$/i )&&($nick == $admin ) { $server->command ( "op $target $2");

Siendo $2 por ejemplo el nick2.

(Ya sé que mi sintaxis no será muy adecuada pero vengo de mIRC scripting y aún no estoy muy iniciado en este lenguaje)

Pues eso, dejo este hilo abierto a ver quien me puede dar un poco de luz sobre el tema.

Muchas gracias.
loquillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-01-16 18:48 @825

Publicidad

Re: Cliente IRC para irssi

Notapor erv-Z » 2010-01-16 21:06 @921

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($text =~ /^!op$/i )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Eso debería solo ir al principio.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($text =~ /^!op/i )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Primero que nada, debes ejecutar el code, y ver cómo responde, y luego codearlo en base a eso.

Aquí hay un buen hilo, puedes mirarlo, creo que te ayudará bastante...
bot-que-responda-t4626.html
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Cliente IRC para irssi

Notapor explorer » 2010-01-16 21:09 @923

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

Efectivamente, si la subrutina es la que gestiona los eventos del canal, puedes colocar una línea que se active cuando el $nick coincida con el tuyo (o el que tu quieras).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (($text =~ /^!op$/i) and ($nick eq $admin)) {
    $server->command ( "op $target $2");
}
Coloreado en 0.001 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

Re: Cliente IRC para irssi

Notapor loquillo » 2010-01-16 21:47 @949

Una de las cosas que no entiendo de los códigos que he visto por ahí es esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)
  2.         {
  3.          #Damos valores ah algunas variables  
  4.          $usuario = $2; #Tengo el usuario registrado y solo reconocera el nick registrado
  5.          $tipo = $4;
  6.          $donde = $5;
  7.          $comando = $6;
  8.          $text = $7;
  9.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Qué es m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig)?

Me da la impresión que esa línea codifica la información recibida de una forma parecida a esta :_!_@: y luego ¿asigna $2, $4, etc. a pelo?
Bienvenido a los foros de Perl en Español, loquillo.

Efectivamente, si la subrutina es la que gestiona los eventos del canal, puedes colocar una línea que se active cuando el $nick coincida con el tuyo (o el que tu quieras).

if (($text =~ /^!op$/i) and ($nick eq $admin)) {
$server->command ( "op $target $2");
}


¿Poniendo $2 a pelo reconocería que es la palabra que se encuentra después del primer espacio?
loquillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-01-16 18:48 @825

Re: Cliente IRC para irssi

Notapor erv-Z » 2010-01-16 21:51 @952

El m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig, es una expresión regular creada a partir de las respuestas.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Cliente IRC para irssi

Notapor loquillo » 2010-01-16 21:55 @954

Pero ¿cómo funciona?
loquillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-01-16 18:48 @825

Re: Cliente IRC para irssi

Notapor explorer » 2010-01-17 08:44 @405

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($datos =~ m/^:(\S*)!(\S*)@(\S*)\s(\S*)\s(\S*)\s:(\S*)\s(.+)\s(.+)/ig) {
    # Damos valores a algunas variables  
    $usuario = $2; # Tengo el usuario registrado y solo reconocerá el nick registrado
    $tipo = $4;
    $donde = $5;
    $comando = $6;
    $text = $7;
    # ...
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La expresión regular busca patrones en la variable que le indiquemos. En este caso, en $datos.

La expresión regular, hace lo siguiente: busca
* ^ : al principio de la cadena de caracteres
* : : un carácter ':', seguido de
* (\S*) : 0 o más caracteres que no son espacios, que los deja en $1, seguidos de
* ! : un carácter '!', seguido de
* (\S*) : 0 o más caracteres que no son espacios, que los deja en $2, seguidos de
* @ : un carácter '@', seguido de
* (\S*) : 0 o más caracteres que no son espacios, que los deja en $3, seguidos de
* \s : un carácter espacio (un blanco, un tabulador, etc.), seguido de
* (\S*) : 0 o más caracteres que no son espacios, que los deja en $4, seguidos de
* \s : un carácter espacio (un blanco, un tabulador, etc.), seguido de
* (\S*) : 0 o más caracteres que no son espacios, que los deja en $5, seguidos de
* \s : un carácter espacio (un blanco, un tabulador, etc.), seguido de
* : : un carácter ':', seguido de
* (\S*) : 0 o más caracteres que no son espacios, que los deja en $6, seguidos de
* \s : un carácter espacio (un blanco, un tabulador, etc.), seguido de
* (.+) : uno o más caracteres cualesquiera, que deja en $7, seguidos de
* \s : un carácter espacio (un blanco, un tabulador, etc.), seguido de
* (.+) : uno o más caracteres cualesquiera, que deja en $8

Además, el autor de este código ha puesto /ig, que indican que se debe buscar el patrón sin importar las mayúsculas o minúsculas, y de forma repetida para todo el texto. Si miramos con detalle el patrón, nos daremos cuenta de que estas dos opciones, sobran.

En cuanto al código
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (($text =~ /^!op$/i) and ($nick eq $admin)) {
    $server->command ( "op $target $2");
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
naturalmente, está mal, porque $2 no tiene ningún valor: en la última expresión regular del if() no hay un segundo par de paréntesis de captura. Vamos, ni el primero. Este código era un ejemplo de cómo ejecutar un comando cualquiera comprobando antes que $text contiene 'op' y que el $nick es igual al de $admin. Otra cosa es saber qué comando quieres ejecutar. Si quieres que se haga operador el usuario indicado en $target, deberás ver qué comandos debes enviar.
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: Cliente IRC para irssi

Notapor loquillo » 2010-01-17 09:48 @450

Leyendo más códigos, encontré otro que me podía servir, y adaptándolo al mio he logrado que funcione con esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($text =~ /^!op */i ) {
  2.          my ($op) = $text =~ /^!op (.*)/i;
  3.           foreach $mother (@admin ) {
  4.             if ($nick =~ /$mother$/i)  {
  5.                $server->command ( "notice $nick op $op" );
  6.                $server->command ( "op $target $op" );
  7.             }
  8.  
  9.           }
  10.         }
  11.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si el nick que ejecuta está en el array @admin lo establece como variable $mother y si coincide con el nick que escribe ejecuta el notice y el op. Lo veo un poco absurdo porque hace dos veces lo mismo, ¿no? Aunque funcionar la verdad funciona.

Para añadir otros nicks al array, ¿separado por comas o por espacios?

Un Saludo.
loquillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-01-16 18:48 @825

Re: Cliente IRC para irssi

Notapor loquillo » 2010-01-17 10:32 @481

explorer escribiste:Este código era un ejemplo de cómo ejecutar un comando cualquiera comprobando antes que $text contiene 'op' y que el $nick es igual al de $admin. Otra cosa es saber qué comando quieres ejecutar. Si quieres que se haga operador el usuario indicado en $target, deberás ver qué comandos debes enviar.


Lo de los comandos lo tengo clarísimo porque llevo muchos años en IRC, lo único que hago para simplificar es redirigir a los alias que lleva el irssi porque para hacer las pruebas es más practico, no tienes que escribir tanto.
loquillo
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-01-16 18:48 @825

Re: Cliente IRC para irssi

Notapor explorer » 2010-01-17 18:17 @803

loquillo escribiste:Para añadir otros nicks al array, ¿separado por comas o por espacios?


Puedes hacerlo con push(), aunque lo normal es meterlos en la declaración de la variable.

¿Qué tal la idea de aprender Perl? :wink:
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

Siguiente

Volver a Básico

¿Quién está conectado?

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