• Publicidad

Enviar mensajes por socket cada cierto límite

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

Enviar mensajes por socket cada cierto límite

Notapor BigBear » 2017-04-02 10:38 @485

Hola, estoy planteándome un problema de difícil solución :( El tema que tengo es que envío un texto largo de varias líneas por IRC. Si envío mucho me echan por inundación, entonces necesito enviar cada cierto límite establecido en una variable, en este caso la variable $limit, que tendría un valor de "15". Entonces hago un split y separo todas las líneas "\n", para enviarlas cada 15 líneas, entonces ahí viene el problema: ¿ qué pasa con las restantes ? O sea, las que sobran en el cálculo de "15" quedan en el olvido, no sé cómo tratar este problema.

Otro detalle que tengo es que tengo que tener en cuenta que la variable $message puede tener cualquier cantidad de líneas con "\n", no es fijo.

El código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2.  
  3. my $message = "hola1\nhola2\nhola3\nhola4\nhola5\nhola6\nhola7\nhola8\nhola9\nhola10\nhola11\nhola12\nhola13\nhola14\nhola15\nhola16\nhola17\nhola18\nhola19\nhola20\nhola21\nhola22\nhola23\nhola24\nhola25\nhola26\nhola27\nhola28\nhola29\nhola30\nhola31\nhola32\nhola33\nhola34\nhola35\nhola36\nhola37\nhola38\nhola39\nhola40\nhola41\nhola42\nhola43\nhola44\nhola45\nhola46\nhola47\nhola48\nhola49\nhola50\n";
  4.  
  5. my $limit = "15";
  6.  
  7. my @lines = split("\n",$message);
  8. my $irc_message = "";
  9.  
  10. my $i = 0;
  11.  
  12. print "\n[+] Lines : ".@lines."\n";
  13.  
  14. if(@lines > 0) {
  15.         for my $line(@lines) {
  16.                 chomp $line;
  17.                 $i++;
  18.             $irc_message .= "PRIVMSG $admin : " . $line . "\r\n";
  19.             if ( $i % $limit == 0 ) {
  20.                 print "\n[+] Bucle : " .$irc_message."\n";
  21.                 #print $socket $irc_message; Envio al canal IRC los mensajes
  22.                 $irc_message = "";
  23.             }
  24.         }
  25. }
  26.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


En el código el envío por socket está comentado porque primero pruebo de forma local.

Salida:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[+] Lines : 50

[+] Bucle : PRIVMSG  : hola1
PRIVMSG  : hola2
PRIVMSG  : hola3
PRIVMSG  : hola4
PRIVMSG  : hola5
PRIVMSG  : hola6
PRIVMSG  : hola7
PRIVMSG  : hola8
PRIVMSG  : hola9
PRIVMSG  : hola10
PRIVMSG  : hola11
PRIVMSG  : hola12
PRIVMSG  : hola13
PRIVMSG  : hola14
PRIVMSG  : hola15


[+] Bucle : PRIVMSG  : hola16
PRIVMSG  : hola17
PRIVMSG  : hola18
PRIVMSG  : hola19
PRIVMSG  : hola20
PRIVMSG  : hola21
PRIVMSG  : hola22
PRIVMSG  : hola23
PRIVMSG  : hola24
PRIVMSG  : hola25
PRIVMSG  : hola26
PRIVMSG  : hola27
PRIVMSG  : hola28
PRIVMSG  : hola29
PRIVMSG  : hola30


[+] Bucle : PRIVMSG  : hola31
PRIVMSG  : hola32
PRIVMSG  : hola33
PRIVMSG  : hola34
PRIVMSG  : hola35
PRIVMSG  : hola36
PRIVMSG  : hola37
PRIVMSG  : hola38
PRIVMSG  : hola39
PRIVMSG  : hola40
PRIVMSG  : hola41
PRIVMSG  : hola42
PRIVMSG  : hola43
PRIVMSG  : hola44
PRIVMSG  : hola45
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Encima me sale mal, creo que son los saltos de línea que provocaron ese resultado. Esto es complicado, parece un algoritmo xD

¿ Cómo puedo resolver este problema ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Enviar mensajes por socket cada cierto límite

Notapor explorer » 2017-04-02 13:35 @607

Si estás usando un IRC donde estás enviando demasiado texto y te denuncian por inundación, es que el problema está mal planteado desde el principio: no debes publicar tal cantidad de información en ese canal. Usa otro. U otro medio de publicación.

Para sacar de forma limitada, lo más cómodo es meter todas las líneas en un array, y "vaciar" el array poco a poco. Lo puedes hacer de una sola vez con la función splice().

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use utf8;
  4.  
  5. my $plantilla = "Hola01";
  6. my $mensaje = join "\n" => map { $plantilla++ } 1..50;
  7. #say $mensaje;
  8.  
  9. my @mensaje = split /\n/, $mensaje;
  10. #say "@mensaje";
  11.  
  12. @mensaje = map { "PRIVMSG admin : $_\r\n"  } @mensaje;
  13.  
  14.  
  15. my $límite = 15;
  16.  
  17. while (@mensaje) {
  18.  
  19.     my @extracto = splice @mensaje, 0, $límite;                # magia
  20.  
  21.     my $irc_mensaje = join "" => @extracto;
  22.  
  23.     say "[+] Bucle : $irc_mensaje";
  24. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[+] Bucle : PRIVMSG admin : Hola01
PRIVMSG admin : Hola02
PRIVMSG admin : Hola03
PRIVMSG admin : Hola04
PRIVMSG admin : Hola05
PRIVMSG admin : Hola06
PRIVMSG admin : Hola07
PRIVMSG admin : Hola08
PRIVMSG admin : Hola09
PRIVMSG admin : Hola10
PRIVMSG admin : Hola11
PRIVMSG admin : Hola12
PRIVMSG admin : Hola13
PRIVMSG admin : Hola14
PRIVMSG admin : Hola15

[+] Bucle : PRIVMSG admin : Hola16
PRIVMSG admin : Hola17
PRIVMSG admin : Hola18
PRIVMSG admin : Hola19
PRIVMSG admin : Hola20
PRIVMSG admin : Hola21
PRIVMSG admin : Hola22
PRIVMSG admin : Hola23
PRIVMSG admin : Hola24
PRIVMSG admin : Hola25
PRIVMSG admin : Hola26
PRIVMSG admin : Hola27
PRIVMSG admin : Hola28
PRIVMSG admin : Hola29
PRIVMSG admin : Hola30

[+] Bucle : PRIVMSG admin : Hola31
PRIVMSG admin : Hola32
PRIVMSG admin : Hola33
PRIVMSG admin : Hola34
PRIVMSG admin : Hola35
PRIVMSG admin : Hola36
PRIVMSG admin : Hola37
PRIVMSG admin : Hola38
PRIVMSG admin : Hola39
PRIVMSG admin : Hola40
PRIVMSG admin : Hola41
PRIVMSG admin : Hola42
PRIVMSG admin : Hola43
PRIVMSG admin : Hola44
PRIVMSG admin : Hola45

[+] Bucle : PRIVMSG admin : Hola46
PRIVMSG admin : Hola47
PRIVMSG admin : Hola48
PRIVMSG admin : Hola49
PRIVMSG admin : Hola50
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Más información en perldoc -f splice.
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: Enviar mensajes por socket cada cierto límite

Notapor BigBear » 2017-04-02 14:01 @626

Claro, con esas funciones no tenía que imaginar tanto. Bendito sea, Perl. Gracias por la ayuda, explorer.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818


Volver a Básico

¿Quién está conectado?

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

cron