Skip to content

Instantly share code, notes, and snippets.

@bssanchez
Created September 26, 2017 18:29
Show Gist options
  • Select an option

  • Save bssanchez/713057d3f854a42b3b23d0b0f5ce816f to your computer and use it in GitHub Desktop.

Select an option

Save bssanchez/713057d3f854a42b3b23d0b0f5ce816f to your computer and use it in GitHub Desktop.
IRC bot in perl
#!/usr/bin/perl
use strict;
use IO::Socket;
################################################################
# Prueba perl de botIRC #
# Objetivo del proyecto aprender manejo de perl con algunas #
# de sus funciones y sobre todo sockets xD... #
# #
# Agradecimientos Guia de perl forever (Doddy), foro de perl #
# en español (perlenespanol.com), kike, y google :D #
################################################################
#by Brandon Sanchez
# Declaracion de constantes #
my $svr = "ifg.ircnode.com"; # Direccion del servidor
my $nck = "practi_b0t"; # Nick del bot
my $usu = "practi_b0t"; # Nombre del bot
my $chn = "#hackxcrack"; # Canal al que conectara el bot
my $prt = 6667; # Puerto al que conectara, normalmente 6667 pero tambien contamos
# con 7001, 7002, 7003 y el 6697 (para conexiones seguras)
my $clv = ""; # Clave
my @users = ('kid_goth', 'Alan','JAG',
'E|3V1L'); # Usuarios con acceso al bot
my @prgs; # Hash que tendra preguntas respuestas xD...
my $trvAct = 0;
my $preg = "";
my $resp = "";
my $cont = 0;
my $pist = "";
my $ent = 0; # Verificar entrada al canal
my $op = 0; # Channel operator :D
#-----------------------------------------------------------#
if(@ARGV[0] ne "")
{
$chn = "#".@ARGV[0];
}
if(@ARGV[1] ne "")
{
$nck = @ARGV[1];
$usu = @ARGV[1];
}
my $sck = new IO::Socket::INET(PeerAddr => $svr, PeerPort => $prt, Proto => 'tcp') or die "\nMe la suda xD\n";
if(!$sck)
{
print "\nLa repout xD... hubo error\n";
exit 1;
}
else
{
print "\nawwwwwwwwwwww yeeeeeaaaaaaaaahhhhhh!!!!\n";
}
print "\nEsperando acceptacion...";
my $cping = 0;
sub trivia
{
my $arc = "preguntas.txt";
open(PREG, $arc);
@prgs = <PREG>;
close PREG;
}
sub pregunta
{
my $pos = int(@prgs);
my $pos = rand($pos);
$preg = $prgs[$pos];
$resp = substr($preg, (index($preg, "*") + 1));
$preg = substr($preg, 0, index($preg, "*"));
chomp $resp;
$cont++;
}
sub pista
{
$pist = $resp;
my @palab = split(/ /, $pist);
my @punts;
my $pal = 1;
for my $pab(@palab){
my $numP = length($pab);
if($pal == 1)
{
$pab = substr($pab, 0, 1).(" _" x ($numP - 1));
$pal = 0;
}
else
{
$pab = " _" . (" _" x ($numP - 1));
}
push @punts, $pab;
}
$pist = join(/ /, @punts);
$pist = uc($pist);
}
sub about
{
print $sck "PRIVMSG $chn :En este canal se tratara los temas relacionados con\r\n";sleep(3);
print $sck "PRIVMSG $chn :los proyectos para hxc auspiciados por Alan++\r\n";sleep(3);
print $sck "PRIVMSG $chn :Los proyectos que hay de momento son:\r\n";sleep(3);
print $sck "PRIVMSG $chn :Bot en bash (z0meed), sistema de preguntas seleccion multiple en C (JAG) y DB de malware en C, VB y PHP (blaqker),\r\n";sleep(3);
print $sck "PRIVMSG $chn :Finalizacion proyecto faha (Bryan20)\r\n";sleep(3);
print $sck "PRIVMSG $chn :Fin [[About]]\r\n";
}
while(my $rcv = <$sck>) # Recibir datos que envia el server
{
chop $rcv;
print("\n\n".$rcv);
my ($_nick, $_acc, $_can, $_men, $_num) = split(/ /, $rcv); # Separar los datos recibidos por el server y/o canal
my ($_cmd, $_tex) = split(/ :/, $rcv); # Separar usuario con texto que envia
$_nick = substr($_nick, 1, (index($_nick, "!")-1));
if($rcv =~ /004/)
{
print "\nAceptado...";
}
elsif($rcv =~ /433/)
{
die "$nck ya esta en uso..."
}
elsif($rcv =~ /^PING(.*)$/i)
{
print $sck "PONG $1\r\n"; # Se reponde pong (y ahora si lo tengo claro xD)
$cping = $cping + 1;
if($cping == 100)
{
$cping = 0;
}
}
elsif($rcv =~ /(376)/i)
{
print "\nAccediendo al canal...";
print $sck "JOIN $chn\r\n";
print "\nAdentro y saludando";
print $sck "PRIVMSG $chn :Hola a todos, me extrañaron? \:P\r\n";
$ent = 1;
}
elsif($rcv =~ /(403)/i)
{
die "\n\nEstas Baneado\n\n";
}
elsif($rcv =~ /$nck/i && ($rcv =~ /hi/i || $rcv =~ /hola/i))
{
if(($_nick ne "Global") && ($_nick ne "chat.us.IRCnode.c") && ($_nick ne "irc.fr"))
{
print $sck "PRIVMSG $chn :hi $_nick\r\n";
}
}
elsif($rcv =~ /NOTICE AUTH/i)
{
print "\nEnviando datos...";
print $sck "NICK $nck\r\n";
print $sck "USER $usu 8 * :bien de bien\r\n";
}
elsif($rcv =~ /(MOTD)/i && $ent != 1)
{
print "\nAccediendo al canal...";
print $sck "JOIN $chn\r\n";
$ent = 1;
print $sck "PRIVMSG $chn :Hola a todos, me estrañaron? \:P\r\n";
}
#------------------------------------------------- Acciones del server ---------------------------------------------------#
my $acc = join(" ", $_acc, $_can, $_men);
if($acc =~ /(KICK $chn $nck)/i)
{
print $sck "JOIN $chn\r\n";
print $sck "PRIVMSG $chn :No me simpatizas $_nick :P\r\n";
}
elsif($acc =~ /(JOIN)/i)
{
if($_nick ne $nck)
{
print $sck "PRIVMSG $chn :hi $_nick, bienvenido al canal de $chn\r\n";
}
}
elsif($_men =~ /(^:!trivia)/i)
{
if($_nick ~~ @users)
{
if($trvAct == 0)
{
&trivia;
print $sck "PRIVMSG $chn :Modo trivia ACTIVADO para ver la pregunta actual escribe !pregact\r\n";sleep(3);
print $sck "PRIVMSG $chn :para cambiar de pregunta !otra\r\n";sleep(3);
print $sck "PRIVMSG $chn :para responder solo responde en minuscula\r\n";sleep(3);
print $sck "PRIVMSG $chn :para desactivar el modo trivia !trivia\r\n";sleep(3);
&pregunta;
&pista;
print $sck "PRIVMSG $chn :Pregunta \#$cont\: $preg \: $pist\r\n";
#print $sck "PRIVMSG $chn :$resp;\r\n";
$trvAct = 1;
}
else
{
print $sck "PRIVMSG $chn :Modo trivia DESACTIVADO\r\n";
$trvAct = 0;
$cont = 0;
}
}
else
{
print $sck "PRIVMSG $chn :Access denied\r\n";
}
}
elsif($_men =~ /(^:!about)/i)
{
if($_nick ~~ @users)
{
&about;
}
else
{
print $sck "PRIVMSG $chn :Access denied\r\n";
}
}
elsif($_men =~ /(^:!op)/i)
{
if($_nick ~~ @users)
{
print $sck "MODE $chn +o $_nick\r\n";
}
}
elsif($_men =~ /(^:!deop)/i)
{
if($_nick ~~ @users)
{
print $sck "MODE $chn -o $_nick\r\n";
}
}
elsif($_men =~ /(^:!k)/i)
{
if($_nick ~~ @users)
{
if($_num ne $nck)
{
print $sck "KICK $chn $_num\r\n";
}
}
}
#------------------------------------------------- Datos de la trivia ---------------------------------------------------#
if($trvAct eq 1)
{
if($_tex =~ /(^!pregact)/i)
{
print $sck "PRIVMSG $chn :Pregunta \#$cont\: $preg \: $pist\r\n";
}
elsif($_tex =~ /(^!otra)/i)
{
print $sck "PRIVMSG $chn :La respuesta era \: $resp\r\n";
&pregunta;
&pista;
sleep(2);
print $sck "PRIVMSG $chn :Pregunta \#$cont\: $preg \: $pist\r\n";
}
elsif($_tex =~ /($resp)/i)
{
my $_nuck = $_nick;
print $sck "PRIVMSG $chn :Felicidades $_nuck la respuesta que diste es correcta... $resp\r\n";
&pregunta;
&pista;
sleep(3);
print $sck "PRIVMSG $chn :Pregunta \#$cont\: $preg \: $pist\r\n";
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment