Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: daryo en 21 Junio 2013, 23:30 PM

Título: [c][aporte]esqueleto bot irc
Publicado por: daryo en 21 Junio 2013, 23:30 PM
a pesar de lo simple del programa me costo bastante hacerlo estaba muy acostumbrado a las expresiones regulares de lenguajes  como python  no hace nada como dije un esqueleto donde  es muy facil usar los datos y hacer que el bot haga lo que uno quiera
seguramente se pueden mejorar muchas cosas  pero de esta forma funciona  :)

#include <winsock2.h>
#include <windows.h>
#include <cstring>
#include <cstdio>

void comandos(char *usuario,char *cmand, char *sala,char *mensaje)
{
printf("Usuario: %s\n",usuario);
printf("Comando irc: %s\n",cmand);
printf("sala: %s\n",sala);
printf("mensaje: %s\n",mensaje);
//char comando[130]="PRIVMSG #botslols :Soy un inutil bot en c :(\r\n";
//send(sock,comando,strlen(comandos),0);
}


int main()
{
SetConsoleTitle("irc bot");
   WSADATA wsa;
   SOCKET sock;
   int conex;
   int len;
   char Buffer[1024];
   //
   char peticion1[]="NICK BOTpurakerdal\r\n"; // nombre del bot
   char peticion2[]="USER BOTpurakerdal 1 1 1\r\n"; //nombre completo
   char peticion3[]="JOIN #botslols\r\n";   //sala
   int enviado=0;

   char pong[130]="PONG :";
   char ping[130]={0};
   struct hostent *host;
   struct sockaddr_in direc;
   WSAStartup(MAKEWORD(2,0),&wsa);
   host=gethostbyname("chat.freenode.net");
   sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   if (sock==-1)
  {
     printf("Error al crear el socket");
     return -1;
  }
   direc.sin_family=AF_INET;
   direc.sin_port=htons(6667);
   direc.sin_addr = *((struct in_addr *)host->h_addr);
   memset(direc.sin_zero,0,8);
   conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr));
   if(conex==-1)
   {
       printf("error\n");
       return -1;
   }
   printf("[+]conexion establecida\n");
   enviado=send(sock, peticion1,strlen(peticion1), 0);
   printf("[+]nick registrado\n");
   enviado=send(sock, peticion2,strlen(peticion2), 0);
   enviado=send(sock, peticion3,strlen(peticion3), 0);
   printf("[+]entrando a la sala\n-\n");
   int final3;
   int ciclo2;
//-------------------------------
   char cadenita[500];
   char cadenita2[500];
   char usuario[500];
   char sala[500];
   char cmand[500];
   char mensaje[500];
//--------------------------
   char *star;

   //------------------
   int ciclo;
   while (len!=-1 && strcmp(Buffer,"salir")!=0)
   {
       fflush(stdout);
       len = recv(sock, Buffer, sizeof(Buffer), 0);
       

//enviar el pong que es la respuesta al ping de irc
      for(int ewe=0;ewe != len;ewe++)
      {
       if((Buffer[ewe]=='P')&&(Buffer[ewe+1]=='I')&&(Buffer[ewe+2]=='N')&&(Buffer[ewe+3]=='G'))
       {
           memcpy(ping,Buffer+ewe+6,10);
           memcpy(pong+6,ping,10);
           memcpy(pong+16,"\r\n",strlen("\r\n"));
           send(sock,pong,strlen(pong),0);

       }
      }
     
//---------------------------------------
      if(Buffer[0]==':') // si comienza en : es un comando
      {


      for(ciclo=0;(ciclo<500)&&(Buffer[ciclo]!='\r');ciclo++)
      {
        cadenita[ciclo]=Buffer[ciclo];
      }
      //le quitamos la basura al buffer
       strcpy(cadenita2,cadenita); //necesito la cadena completa strtok la parte
       star=strtok(cadenita," "); // parto la cadena la primera palabra es el user
       strcpy(usuario,star); // pongo el user en la variable usuario
       star=strtok(NULL," "); // tomo la siguente palabra
       strcpy(cmand,star); // tomo el comando de irc
       star=strtok(NULL," ");
       strcpy(sala,star); // esta es la sala
       memcpy(mensaje,(cadenita2+strlen(usuario)+strlen(cmand)+strlen(sala)+4),500); // es decir todo lo anterior a el mensaje no se copia eso mas 3 espacios mas este caracter : es decir 4
       comandos(usuario,cmand,sala,mensaje);
}
}
   return 0;
}
Título: Re: [c][aporte]esqueleto bot irc
Publicado por: amchacon en 22 Junio 2013, 00:27 AM
Muy interesante, tengo que verme la programación de sockets que me queda por mirar  :silbar:

Por cierto:

Código (cpp) [Seleccionar]
host=gethostbyname("chat.freenode.net");

¿Que es chat.freenode.net?
Título: Re: [c][aporte]esqueleto bot irc
Publicado por: daryo en 22 Junio 2013, 00:49 AM

es un servidor irc(precisamente donde esta el chat de este foro si quieres abajo en mi firma esta el enlace al chat) que se encarga de pasar la conexion a el servidor mas cercano o mas disponible de esta red de servidores llamada freenode

saludos  ;D